2016-09-21 56 views
1

我在“AK”列中有一个数据,在“AL”列中有一个按钮;有几百行,所有按钮只有一个宏,因为它使用基于它所在行的相对引用。Excel VBA - 基于更新到相邻单元更改按钮可见性

我希望按钮仅在相邻单元中有数据时才可见。下面的伪代码说明了什么,我想实现:

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Column = 37 Then 
     If Target.Value = 0 Then 
      Shapes(Target.offset(0, 1)).Visible = False 
     Else 
      Shapes(Target.offset(0, 1)).Visible = True 
     End If 
    End If 
End Sub 

这样做的原因在于,在AK值基于其它值计算,只显示一次所有必填字段已经完成。一旦完成所有细节,该按钮应仅适用于自动化任务。什么真正的代码可以使这个工作,而不必单独调用每个按钮?

回答

1

我不确定您是否可以通过它在表格上的位置直接引用形状。
此代码将查看每个形状,直到找到刚刚更改的单元格的右侧,然后根据单元格的内容更改可见性。
(Target.Value <> "")返回TRUE/FALSE。
只有当你的按钮放置在正确的单元格中时(这个功能会稍微高一点,它会返回上面的单元格)才会有效。

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim shp As Shape 

    For Each shp In ThisWorkbook.Worksheets("Sheet1").Shapes 
     If shp.TopLeftCell.Address = Target.Offset(, 1).Address Then 
      shp.Visible = (Target.Value <> "") 
      Exit For 'Exit the loop - the correct button has been found. 
     End If 
    Next shp 

End Sub 

编辑:
所以检查,只有单细胞已被更改,然后着眼于改变细胞的每个细胞依赖我已经更新的代码。
如果依赖单元格位于另一个工作表上,这可能会弄糟。

Private Sub Worksheet_Change(ByVal Target As Range) 

    Dim rUpdated As Range 
    Dim shp As Shape 
    Dim rCell As Range 

    If Target.Cells.Count = 1 Then 
     'Hopefully someone will have better code than On Error.... 
     On Error Resume Next 
     Set rUpdated = Range(Target.Dependents.Address) 
     On Error GoTo 0 
     If Not rUpdated Is Nothing Then 
      'Look at each dependent cell in rUpdated. 
      For Each rCell In rUpdated 
       'Look at each shape in the sheet and cross-reference with rCell. 
       For Each shp In Target.Parent.Shapes 
        If shp.TopLeftCell.Address = rCell.Offset(, 1).Address Then 
         shp.Visible = (Target.Value = 0) 
         Exit For 'Exit the loop - the correct button has been found. 
        End If 
       Next shp 
      Next rCell 
     End If 
    End If 

End Sub 

注:我的想法从这里检查依赖的细胞:How can I run a VBA code each time a cell get is value changed by a formula?

+0

谢谢!只要目标手动更新并且只要单个单元格更新,它就可以工作。如果我更新多个单元格,那么它不起作用,但这不是什么大问题。 此外,我希望按钮更新的基础上计算的单元格,即根据其他单元格的值更新的单元格;那可能吗? – fileinster

+0

检查更新后的代码 - 只有当单个单元格更改并且与计算单元格一起工作时,它才会触发。 –

+0

太棒了!我不得不放入一些If语句来保护它,否则它会变得有点眩晕,现在它运行良好。 – fileinster