8

ユーザーフォームに4つ以上のコンボボックスがあります。彼らが発砲するとき、彼らは同じイベントを発砲します。私がやろうとしているのは、どのComboBoxがイベントをトリガーしたかを見つけることです。ComboBoxは、コンポーネントの数に応じて作成されます。ComboBoxesを生成するコードを以下に示します。

For j = 0 To UBound(ComponentList) - 1
'Set Label
num = j + 1
Set control = UserForm1.Controls.Add("Forms.Label.1", "ComponentLabel" & CStr(num) & ":", True)
With control
    .Caption = "Component " & CStr(num)
    .Left = 30
    .Top = Height
    .Height = 20
    .Width = 100
    .Visible = True
End With
'set ComboBox
Set combo = UserForm1.Controls.Add("Forms.ComboBox.1", "Component" & num & ":", True)
With combo
    .List = ComponentList()
    .Left = 150
    .Top = Height
    .Height = 20
    .Width = 50
    .Visible = True
    Set cButton = New clsButton
    Set cButton.combobox = combo
    coll.Add cButton
End With
Height = Height + 30
Next j

これはうまく機能し、ユーザーが選択した値を取得できますが、使用されているComboBoxが見つかりません。以下のこのコードは、それが発生するイベントです(clsButton):

Public WithEvents btn As MSForms.CommandButton
Public WithEvents combobox As MSForms.combobox
Private combolist() As String

Private Sub btn_Click()
    If btn.Caption = "Cancel" Then
        MsgBox "Cancel"
        Unload UserForm1
        Variables.ComponentSelectionError = False
    ElseIf btn.Caption = "Enter" Then
        MsgBox "enter"
        Unload UserForm1
        Variables.ComponentSelectionError = True
    End If
End Sub

Private Sub combobox_Click()
    MsgBox combobox.Value
End Sub

上記のコードのこのビットは、コードで生成されたComboBoxesでイベントを機能させるために、DougGlancyによって親切に作業されました。

イベントをトリガーしたComboBoxを取得するにはどうすればよいですか?つまり、名前またはその他の形式の識別。

4

4 に答える 4

5

500以上のウェブページを検索した後、ようやく自分の質問に答えることができました(長い時間がかかりました)

これは私が使用したものであり、特定のコンボボックスがクリックされると機能して起動します。

Private Sub combobox_Click()
MsgBox combobox.Value
If combobox = UserForm1.Controls("Component0") Then
    MsgBox "Success1"
End If
If combobox = UserForm1.Controls("Component1") Then
    MsgBox "Success2"
End If
End Sub

うまくいけば、これはそれを必要とする他の人々のために使用することができます。

于 2013-03-22T11:36:25.837 に答える
4

クラス内では、実際にはnameプロパティ自体がないため(F2オブジェクトブラウザで確認してください)、.Nameコンボボックスのインテリセンスリストには表示されません。プロパティは基本クラスによって提供されます。MSForms.ComboBoxControl

Private Sub combobox_Click()

    MsgBox combobox.Value
    MsgBox combobox.Name '// no hint but still works

    '//cast to a Control to get the formal control interface with .Name
    Dim ctrl As Control: Set ctrl = combobox
    MsgBox ctrl.Name

End Sub
于 2013-03-22T11:35:28.897 に答える
2

たぶん、再びbtn.Comboboxを参照しますか?最初にコンボボックスをボタンに割り当てた方法と似ていますが、逆に:

set combobox = btn.Combobox 
于 2013-03-22T10:43:30.167 に答える
0

コレクションに登録するときに、カスタムクラスにプロパティを追加して、そのプロパティを設定しない理由はありますか?

For j = 0 To UBound(ComponentList) - 1
'Set Label
num = j + 1
Set control = UserForm1.Controls.Add("Forms.Label.1", "ComponentLabel" & CStr(num) & ":", True)
With control
    .Caption = "Component " & CStr(num)
    .Left = 30
    .Top = Height
    .Height = 20
    .Width = 100
    .Visible = True
End With
'set ComboBox
Set combo = UserForm1.Controls.Add("Forms.ComboBox.1", "Component" & num & ":", True)
With combo
    .List = ComponentList()
    .Left = 150
    .Top = Height
    .Height = 20
    .Width = 50
    .Visible = True
    Set cButton = New clsButton
'*******EDIT********
    with cButton
        .combobox = combo
        .Indx = j
    end With    'cButton
'*******************
    coll.Add cButton
End With
Height = Height + 30
Next j

クラスモジュール

Public WithEvents btn As MSForms.CommandButton
Dim WithEvents mCombobox As MSForms.comboBox
Private combolist() As String

'*******EDIT********
Public Indx As Long

Property Let comboBox(cb As MSForms.comboBox)
    Set mCombobox = cb
End Property
'*******************

Private Sub btn_Click()
    If btn.Caption = "Cancel" Then
        MsgBox "Cancel"
        Unload UserForm1
        Variables.ComponentSelectionError = False
    ElseIf btn.Caption = "Enter" Then
        MsgBox "enter"
        Unload UserForm1
        Variables.ComponentSelectionError = True
    End If
End Sub

Private Sub mCombobox_Click()

'*******EDIT********
    MsgBox "Combobox " & Indx & Chr(9) & mComboBox.Value
'*******************

End Sub

イベントの多対多のマッピングが必要なため、実際のコードに共通のコールバックがあると想定します。これを行うこともできます...

標準モジュールの場合

Public Sub cbCallBack(ocb As clsButton)
    MsgBox ocb.Indx
End Sub

clsButton内(イベントハンドラーの置き換え)

Private Sub mCombobox_Click()
    cbCallBack Me
End Sub
于 2013-12-31T00:08:06.750 に答える