Excel VBA – 基于更新到相邻单元更改button可见性

我有“AK”列中的数据和“AL”列中的一个button; 有几百行,所有button只有一个macros,因为它使用基于它所在行的相对引用。

我希望button只有在相邻单元格中有数据时才可见。 下面的伪代码解释了我试图达到的目的:

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中的值是基于其他值计算的,只有在所有必填字段完成后才显示。 完成所有细节后,该button只能用于自动化任务。 什么真正的代码会使这个工作,而不必单独调用每个button?

我不确定您是否可以直接通过其在表单上的位置来引用形状。
此代码将查看每个形状,直到find刚更改的单元格的右侧,然后根据单元格的内容更改可见性。
(Target.Value <> "")返回TRUE / FALSE。
这只会在你的button被放置在正确的单元格(稍高,它会返回上面的单元格)时才起作用。

 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 

注意:我有从这里检查依赖单元格的想法: 每次单元格获取值由公式更改值时,如何运行VBA代码?