[英]How to add events to dynamically created controls (buttons, listboxes) in Excel VBA userform
我正在嘗試實時構建用戶表單。 (在 Excel VBA 中)只是為了嘗試,我從 2 個標簽、一個文本框、一個組合框和一個命令按鈕開始。 我列出了下面的代碼+結果形式。
我的問題是:如何將事件鏈接到控件,特別是組合框和命令按鈕? 通常(使用手動創建的表單),這將通過調用的例程完成:cmbTabel_change() 和 cmdExit_click()。 但這似乎不起作用,當它們是動態創建的。 誰能幫我?
代碼:
Private Sub UserForm_Initialize()
Dim cCont As Control
Call Add_Control(cCont, "Label", "lblDatabase", "Database", 30, 23, 60, 18)
Call Add_Control(cCont, "Textbox", "txtDatabase", "Database", 110, 20, 60, 18)
Call Add_Control(cCont, "Label", "lblTabel", "Tabel", 30, 47, 90, 18)
Call Add_Control(cCont, "Combobox", "cmbTabel", "Tabel", 110, 44, 90, 18)
Call Add_Control(cCont, "CommandButton", "cmdExit", "Afsluiten", 210, 140, 54, 18)
End Sub
Private Sub Add_Control(ctrl, ctp, cnm, cap, l, t, w, h)
Set ctrl = Me.controls.Add("Forms." & ctp & ".1", cnm)
With ctrl
.Left = l
.Top = t
.Width = w
.Height = h
End With
Select Case ctp
Case "Combobox"
controls(cnm).Clear
For j = 1 To 5
controls(cnm).AddItem "ListItem" & j
Next j
controls(cnm).ListIndex = 0
Case "Label", "CommandButton"
With controls(cnm)
.Caption = cap
End With
Case "Textbox"
controls(cnm).Text = cap
End Select
End Sub
結果形式:
您需要構建一個類來處理控件上的事件。
例如,創建一個名為clsMyEvents
的新類模塊。
將此代碼添加到類中:
Option Explicit
Public WithEvents MyCombo As MSForms.ComboBox
Public WithEvents MyButton As MSForms.CommandButton
Private Sub MyCombo_Change()
MsgBox MyCombo.Name & " was changed to value " & MyCombo.Value
End Sub
Private Sub MyButton_Click()
Dim BtnNum As Long
BtnNum = Replace(MyButton.Name, "MyButton", "")
MsgBox MyButton.Name & " is " & IIf(BtnNum Mod 2 = 0, "even", "odd")
End Sub
注意:當您進入WithEvents
您將能夠選擇與該類型控件關聯的大多數事件。
接下來,創建一個空白的UserForm
並添加以下代碼:
Option Explicit
Public MyEvents As New Collection
Private Sub UserForm_Initialize()
Dim tmpCtrl As Control
Dim CmbEvent As clsMyEvents
Dim x As Long
'Add some dummy data for the combo-boxes.
Sheet1.Range("A1:A5") = Application.Transpose(Array("Red", "Yellow", "Green", "Blue", "Pink"))
Sheet1.Range("B1:B5") = Application.Transpose(Array(1, 2, 3, 4, 5))
Sheet1.Range("C1:C5") = Application.Transpose(Array(5, 4, 3, 2, 1))
For x = 1 To 5
'Add the control.
Set tmpCtrl = Me.Controls.Add("Forms.ComboBox.1", "MyCombobox" & x)
With tmpCtrl
.Left = 10
.Width = 80
.Top = (x * 20) - 18 'You might have to adjust this spacing. I just made it up.
.RowSource = "Sheet1!" & Sheet1.Cells(1, x).Resize(5).Address
End With
'Attach the event.
Set CmbEvent = New clsMyEvents
Set CmbEvent.MyCombo = tmpCtrl
MyEvents.Add CmbEvent
Next x
For x = 1 To 5
Set tmpCtrl = Me.Controls.Add("Forms.CommandButton.1", "MyButton" & x)
With tmpCtrl
.Left = 100
.Width = 50
.Height = 20
.Top = (x * 20) - 18
.Caption = "Num " & x
End With
Set CmbEvent = New clsMyEvents
Set CmbEvent.MyButton = tmpCtrl
MyEvents.Add CmbEvent
Next x
End Sub
編輯:我已經更新以包含命令按鈕的代碼。 當您更改組合框中的值時,它會告訴您控件的名稱以及更改后的值。 當你點擊一個按鈕時,它會告訴你上面的數字是奇數還是偶數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.