在Excel/VBA中禁用/启用按钮

10

我正在尝试在VBA/Excel中使用以下函数:

Sub function_name()
  button.enabled=false
  Call Long_Function       ' duration: 10sec
  button.enabled=true
End Sub

由于某种原因,此按钮禁用无效(在Excel工作表中仍处于启用状态)。 我尝试使用DoEvents和延迟进行实验,但没有成功。 有什么想法吗? 谢谢!

7个回答

22

以下内容适用于我所使用的Excel 2010:

Dim b1 As Button

Set b1 = ActiveSheet.Buttons("Button 1")

b1.Font.ColorIndex = 15
b1.Enabled = False
Application.Cursor = xlWait
Call aLongAction
b1.Enabled = True
b1.Font.ColorIndex = 1
Application.Cursor = xlDefault
请注意,.enabled = False 不会使按钮变灰。 必须显式设置字体颜色才能使其变灰。

3
好的回答!最后一句话可以放在帖子开头,我不得不来两次因为我没有读完它!我真傻 :P - ForceMagic
9
我认为需要注意的是,在Excel 2010中,设置b1.Enabled = False并不能阻止与该按钮相关联的操作在单击时发生。 - Kes Perron
...而要停用该操作(事件),必须取消分配(Excel 2010),或者按照此处所述创建两个在同一位置切换可见性的按钮:https://dev59.com/GHRB5IYBdhLWcg3wn4jc#566965 - Andreas Covidiot

3

我不知道你是否在使用ActiveX按钮,但是当我在Excel的Sheet1中插入一个名为CommandButton1的ActiveX按钮时,以下代码可以正常工作:

Sub test()

   Sheets(1).CommandButton1.Enabled = False

End Sub

希望这能有所帮助...

这个运行得很完美,我认为这可能与“屏幕刷新”或者在“长函数”运行时有关。 - Jon V

2

太好了!!!它正在工作并轻松解决了我一天的问题

Dim b1 As Button

Set b1 = ActiveSheet.Buttons("Button 1")


b1.Enabled = False

2
其他人提到了"button.enabled = false"不能阻止按钮触发,这是正确的。然而,我发现将"button.visible = false"设置为true有效。这样做会使按钮消失,并且在将“visible”设置为“true”之前无法单击该按钮。

1

这对我来说可行(Excel 2016),使用一个新的ActiveX按钮,将控件分配给您的按钮,然后您就可以开始了。

Sub deactivate_buttons()

     ActiveSheet.Shapes.Item("CommandButton1").ControlFormat.Enabled = False

End Sub

它会将ActiveX按钮属性框中的“启用”属性更改为False,按钮变为不活动且变灰。

0

我正在使用 Excel 2010,以下 VBA 代码适用于表单按钮。

它可以删除按钮上分配的宏,并在下一个命令中重新分配。

要禁用:

ActiveSheet.Shapes("Button Name").OnAction = Empty
ActiveSheet.Shapes("Button Name").DrawingObject.Font.ColorIndex = 16

启用:

ActiveSheet.Shapes("Button Name").OnAction = ActiveWorkbook.Name & "!Macro function Name with _Click"
ActiveSheet.Shapes("Button Name").DrawingObject.Font.ColorIndex = 1

请注意,“ActiveWorkbook.Name”保持不变。不要将工作簿名称插入到“Name”中。

-1

这就是iDevelop想要表达的启用属性

所以,你实际上一直在使用enabled,因为你最初的帖子是enable

你可以尝试以下方法:

Sub disenable()
  sheets(1).button1.enabled=false
  DoEvents
  Application.ScreenUpdating = True

  For i = 1 To 10
    Application.Wait (Now + TimeValue("0:00:1"))
  Next i

  sheets(1).button1.enabled = False
End Sub

@Jonathan,似乎您的等待函数没有拉动所需的“触发器”来更改按钮属性。因此,请尝试一下这个。 - bonCodigo
我在网上也找到了这个,但它并没有起作用。我认为这个“触发器”确实是问题所在。如果我在函数后面打断点,按钮就会变为不活动状态。 - Jon V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接