簡體   English   中英

VBA 中多個 ComboBox 控件的單個事件處理程序

[英]Single event handler for multiple ComboBox controls in VBA

我有一個包含 72 個 activex 組合框的電子表格。 理想情況下,當我更改組合框之一的值時,我希望將該組合框的名稱(或其他唯一標識符)傳遞給使用名稱/標識符的子程序 RespondToChange。 例如,如果組合框命名為 cbXYZ,我會將該名稱傳遞給子例程。 我可以使用一些代碼,例如

Private Sub cbXYZ_Change()
   RespondToChange "cbXYZ"
End Sub

但是,這需要為所有 72 個組合框插入代碼,這很乏味。

是否有一種簡單的方法來檢測哪個組合框已更改並將該信息傳遞給 RespondToChange?

您需要一個全局事件處理程序。 查看WithEvents

這是你可以做到的。


添加一個新類並將此代碼放入該類中。

Public WithEvents cmb As ComboBox
Private Sub cmb_Change()
    '/ Do whatever you want to do when the event occurs.
    MsgBox cmb.Name
End Sub

添加一個模塊並將此代碼放入其中。

Option Explicit
'/ an array to hold all the comboboxes
'/ Class1 is the class name. Change if your class name is different.
Dim comboBoxes() As New Class1

    Sub HookEvents()
        Dim lCtr As Long
        Dim cmb
        '/ Sheet1 is sheet's code name. Change accordingly for your sheet's name.
        For Each cmb In Sheet1.OLEObjects
            '/ Loop all controls on the sheet and check it its a combobox.
            If TypeName(cmb.Object) = "ComboBox" Then
                lCtr = lCtr + 1
                ReDim Preserve comboBoxes(1 To lCtr)
                '/ Add to keep it alive
                Set comboBoxes(lCtr).cmb = cmb.Object
            End If
        Next
    End Sub

確保首先調用HookEvents (可能在 workbook_open 或 sheet activate 上),然后任何 ComboBox 在更改時都會觸發 Class1 的cmb_Change事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM