多种类型的全球事件

时间:2013-08-22 07:57:48

标签: vba events word-vba

是否可以编写类似全局事件监听器的内容?我想有一个更多对象的监听器(TextBox,CheckBox,OptionButton,Label,...)。在我班上有听众。我有一些正常的事件,所以我的想法看起来像这样:

Public WithEvents eventGlobLst As <DontKnowWhat>SomeType</DontKnowWhat>

Sub setListener(controlObj As SomeType)
  Set eventGlobList = controlObj 
End Sub

从我的run-method我调用sub来设置监听器

For Each pages In csDialgog.MultiPage.Pages
    For Each objectControl In pages.Controls

        Set eventClass = New ControlsClass
        eventClass.setListener objectControl
        universalObjectCollection.Add eventClass 
    Next
Next

这适用于经典事件。最后我有一些事件处理程序:

Private Sub EventGlobLstnr_AfterUpdate()
    Functions.GlobalChange
End Sub

我想知道是否存在我可以使用的所有对象的祖先。或者我必须分别为每种类型编写监听器,并将它们设置为GlobalChange

1 个答案:

答案 0 :(得分:0)

答案是否定的,你最好使用自编代码。这是一个很好的链接,允许您写入VBA编辑器

Programming the VBA editor - Chip Pearson

此代码取自Chip Pearson:
创建事件过程

此代码将创建一个Workbook_Open事件过程。创建事件过程时,应使用CreateEventProc方法,以便使用正确的过程声明和参数列表。 CreateEventProc将创建声明行和过程行结束。它返回事件过程开始的行号。

Sub CreateEventProcedure()
    Dim VBProj As VBIDE.VBProject
    Dim VBComp As VBIDE.VBComponent
    Dim CodeMod As VBIDE.CodeModule
    Dim LineNum As Long
    Const DQUOTE = """" ' one " character

    Set VBProj = ActiveWorkbook.VBProject
    Set VBComp = VBProj.VBComponents("ThisWorkbook")
    Set CodeMod = VBComp.CodeModule

    With CodeMod
        LineNum = .CreateEventProc("Open", "Workbook")
        LineNum = LineNum + 1
        .InsertLines LineNum, "    MsgBox " & DQUOTE & "Hello World" & DQUOTE
    End With
End Sub

使用.CreateEventProc,您可以为要“捕获”的每个元素创建一个事件 我相信这是实现你想要的目标的唯一途径。

干杯,
kpark