我有一個名爲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