[英]Handling Multiple UserForm Controls With One Event Handler - VBA Excel
[英]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.