隐藏基于单元格值excel vba的commandbutton

我试图隐藏一个基于特定单元格值的命令button。 我已经查找了几个代码,并将它们粘贴到excel中(在右键单击表格并select“查看代码”时,在vba表单中)。

我究竟做错了什么?

这是我尝试过的代码之一:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("A1") = 0 Then ActiveSheet.CommandButton1.Visible = False If Range("A1") = 1 Then ActiveSheet.CommandButton1.Visible = True End Sub 

确保在使用代码之前启用事件。 此外,您必须将您的代码放在工作表模块中,而不是在常规模块中。 要启用事件,使用这个简单的子。

 Sub Enable_events() Application.EnableEvents = True End Sub 

请先运行这个:

 Sub enable_() Application.EnableEvents = True End Sub 

然后你的代码将完美运行:

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Range("A1") = 0 Then ActiveSheet.CommandButton1.Visible = False If Range("A1") = 1 Then ActiveSheet.CommandButton1.Visible = True End Sub 

请试试这个代码:

 Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1")) Is Nothing Then If Selection.Cells.Count = 1 Then If Range("A1") = 0 Then ActiveSheet.CommandButton1.Visible = False If Range("A1") = 1 Then ActiveSheet.CommandButton1.Visible = True End If End If End Sub 

希望这个帮助。

你的代码很混乱,原因很多。

Range ,当它不与一个Worksheet对象限定时,隐式引用ActiveSheet ,即ActiveSheet.Range …但是当它在工作表的代码隐藏时,它隐式引用该工作表的 Range属性,即Me.Range 。 由于非限定Range调用的含义取决于上下文,所以最好始终使用显式的Worksheet对象来限定它。

因此,如果您在Sheet1的代码隐藏模块Sheet1 ,则Range("A1")等同于Sheet1.Range("A1") ,甚至更好, Me.Range("A1")

这两个条件每次都会被评估,但只有其中一个条件是:效率不高。

事实是,你不需要分配一个Boolean文本 – 一个布尔expression式更干净。

 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Me.CommandButton1.Visible = (Me.Range("A1") = 1) End Sub 

现在,假设Application.EnableEvents返回True ,那么代码将在每次select更改时运行,这相当矫枉过正。

处理Worksheet.Change事件,而且只有在修改后的单元格为A1时才起作用:

 Private Sub Worksheet_Change(ByVal Target As Range) If Application.Intersect(Target, Me.Range("A1")) Is Nothing And Target.Count <> 1 Then ' we don't care about that cell: bail out Exit Sub End If Me.CommandButton1.Visible = (Me.Range("A1") = 1) End Sub