2013-03-22 52 views
8

Tôi có 4 + ComboBox trên biểu mẫu người dùng. Khi họ bắn, họ bắn cùng một sự kiện. Những gì tôi đang cố gắng làm là tìm hiểu ComboBox nào đã kích hoạt sự kiện. ComboBoxes được tạo tùy thuộc vào số lượng thành phần có. Mã tạo ComboBoxes được hiển thị bên dưới:Xác định ComboBox của VBA Excel

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 

Điều này hoạt động tốt và tôi có thể nhận giá trị mà người dùng đã chọn, NHƯNG tôi không thể tìm thấy ComboBox nào đã được sử dụng. Mã này dưới đây là sự kiện cho nó kích hoạt (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 

chút mã này trên được vui lòng làm việc trên bởi Doug Glancy để có được những sự kiện làm việc với mã được tạo ComboBoxes.

Làm cách nào để có được ComboBox đã kích hoạt sự kiện? tức là tên hoặc một số hình thức nhận dạng khác.

Trả lời

4

Trong lớp .Name sẽ không xuất hiện trong danh sách IntelliSense cho combobox như MSForms.ComboBox không thực sự có một tài sản tên bản thân (hãy nhìn vào nó trong trình duyệt đối tượng F2), thay vì tài sản đó được cung cấp bởi lớp Control cơ sở:

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 
+0

Cảm ơn điều này đã làm việc, tôi cũng tìm thấy một giải pháp sau nhiều giờ tìm kiếm và bây giờ tôi kết hợp cả hai. Cảm ơn bạn đã giúp đỡ! – NoLiver92

2

Có thể tham khảo lại btn.Combobox một lần nữa? Tương tự như cách bạn đã gán combobox để nút ở nơi đầu tiên, nhưng sau đó theo hướng ngược lại:

set combobox = btn.Combobox 
+0

không chắc bạn đến từ đâu với điều này. nhưng khi tôi làm combobox.whatever không có tùy chọn cho tên hoặc bất kỳ loại id để im không chắc chắn làm thế nào để làm điều đó. tôi đã xem xét hơn 100 webstes mà tất cả đều cho tôi biết cách thêm và đặt giá trị nhưng không phải cách tìm ra hộp nào đã kích hoạt sự kiện – NoLiver92

+0

Ah, bài đăng orignal của bạn không nói bạn muốn (Tên), chỉ là bạn muốn " có được combobox ", do đó tôi nghĩ rằng bạn muốn biết đối tượng, không phải là bạn muốn tên của đối tượng ... Cảm ơn bạn đã làm rõ –

+1

ok ill chỉnh sửa bài đăng chính – NoLiver92

5

tôi đã quản lý để cuối cùng trả lời câu hỏi của riêng tôi sau khi tìm kiếm hơn 500 trang web (mất một chặng đường dài thời gian)

đây là những gì tôi được sử dụng và nó hoạt động và cháy khi comboboxes nhất định được nhấp:

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 

hy vọng điều này có thể được sử dụng cho những người khác, những người cần nó.

0

Có lý do nào bạn không chỉ thêm thuộc tính vào lớp tùy chỉnh của mình và đặt thuộc tính đó khi bạn đăng ký trong Bộ sưu tập?

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 

Lớp Mô-đun

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 

Vì bạn đòi hỏi nhiều với một bản đồ của các sự kiện, tôi giả sử bạn có một chung gọi trở lại trong mã thực tế của bạn, vì vậy bạn cũng có thể làm được điều này ...

Trong một mô-đun chuẩn

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

Trong clsButton (thay thế xử lý sự kiện)

Private Sub mCombobox_Click() 
    cbCallBack Me 
End Sub 
Các vấn đề liên quan