我在“AK”栏中有数据,在“AL”栏中有一个按钮;有几百行,所有按钮只有一个宏,因为它使用基于它所在行的相对引用。
我希望按钮仅在相邻单元格中有数据时可见。以下伪代码解释了我想要实现的目标:
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中的值是根据其他值计算的,只有在完成所有必填字段后才会显示。所有细节完成后,该按钮仅适用于自动化任务。什么真正的代码可以使这项工作无需单独调用每个按钮?
答案 0 :(得分: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?