我有一个名为cmd0001的窗体中的现有命令按钮,并且它的事件处理程序硬编码在窗体的模块中。VBA更改命令按钮在运行时单击事件处理程序
Private Sub cmd0001_Click()
'code
End Sub
我需要通过以编程方式(运行时)以编程方式更改其行为来“禁用”该按钮。一种可能性是使用InsertLines改变过程的代码模块中:
Set vbComp = ThisWorkbook.VBProject.VBComponents("formName")
Set vbModule = vbComp.CodeModule
linenr = vbModule.ProcStartLine("cmd0001_Click", vbext_pk_Proc)
vbModule.InsertLines linenr + 2, "msgbox ""no"": exit sub"
可悲的是,这是一个受保护的VBAProject,我得到的错误:“运行时,因为该项目是错误50289无法执行操作保护”。
可以更改按钮的单击事件处理程序?其实我会用很多按钮工作,理想情况下,我想有1个“禁用”按钮的全局事件处理程序。
我现在发现的所有示例都适用于动态创建的按钮,如this示例,但我无法找到有关如何使用已存在的按钮执行操作的示例。
编辑1:
好吧,I have found这是可能创建一个类模块,并使用下面的代码创建一个单击处理程序:
'in form
Dim btnH As cCtrlHandler
Set btnH = New cButtonHandler
Set btnH.ctrl = btnTest
'class module cButtonHandler
Public WithEvents ctrl As MSForms.CommandButton
Private Sub ctrl_Click()
MsgBox "Not authorized!"
End Sub
但主要的问题是,点击事件处理不会被覆盖!新代码,在这个例子中'MsgBox'Not authorized!''被追加到现有的代码中。有可能完全覆盖事件处理程序?
为什么不只是禁用按钮,所以它不能被点击? – RubberDuck 2014-12-31 15:38:46
@RubberDuck因为应用程序启用/禁用按钮在任何时候取决于用户的交互。这意味着,即使我禁用了一个按钮(例如:删除记录),稍后当有人点击列表视图(包含记录的网格)时,它将再次启用。 – 2015-01-05 14:35:38