2014-09-12 111 views
1

我有一个名为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!''被追加到现有的代码中。有可能完全覆盖事件处理程序?

+0

为什么不只是禁用按钮,所以它不能被点击? – RubberDuck 2014-12-31 15:38:46

+0

@RubberDuck因为应用程序启用/禁用按钮在任何时候取决于用户的交互。这意味着,即使我禁用了一个按钮(例如:删除记录),稍后当有人点击列表视图(包含记录的网格)时,它将再次启用。 – 2015-01-05 14:35:38

回答

0

你很近。绝对是在正确的轨道上。我不能拿this idea的所有功劳,但我认为它会帮助你。

首先,从您的按钮中删除点击处理程序。你无法搭过它们,只能添加到它们中。

接下来,为MSForms.CommandButton创建包装类。此类将负责统一处理所有按钮上的点击事件。

Private mClickEnabled As Boolean 
Private WithEvents internalButton as MSForms.CommandButton 

Public Property Let ClickEnabled(value as Boolean) 
    mClickEnabled = value 
End Property 

Public Property Get ClickEnabled() As Boolean 
    ClickEnabled = mClickEnabled 
End Property 

Public Sub Init(btn as MSForms.CommandButton) 
    Set internalButton = btn 
End Sub 

Private Sub internalButton_Click() 
    If ClickEnabled Then 
     ' do something 
    Else 
     MsgBox "NotAuthorized!" 
    End If 
End Sub 

然后在你的窗体的intialization活动,通过创建窗体的命令按钮一个新的收集和循环,创建新的自定义按钮,并将它们添加到集合中。调用代码可以设置自定义按钮的布尔值,以确定稍后的点击事件的行为。

当然,这只有在你想让所有的按钮以完全相同的方式工作时才有效。因为这是一个点击事件,你可能不想这样做。在这种情况下,最好和最简单的解决方案可能就是为表单上的每个按钮创建一个私有布尔值。当某个动作发生在要禁用该按钮的位置时,将该按钮设置为false。然后你可以使用类似的理论来切换行为。

Private cmd0001Enabled As Boolean 

Private Sub cmd0001_Click() 
    If cmd0001Enabled Then 
     'custom action here 
    Else 
     HandleDisabledButtonClick 
    End If 
End Sub 

Private Sub HandleDisabledButtonClick() 
    MsgBox "Not authorized!" 
End Sub 

如果您需要将布尔值显示为外部代码,请继续为它们创建一些公共属性。

相关问题