调用命令栏组合框时如何替换简化代码

How to replace simplify code when calling command bar combobox

我在 class 模块中有这段代码

Public WithEvents evtHandler As VBIDE.CommandBarEvents

Private Sub evtHandler_Click(ByVal CommandBarControl As Object, _
    handled As Boolean, CancelDefault As Boolean)
    
    On Error Resume Next
    Application.Run CommandBarControl.OnAction
    
    handled = True
    CancelDefault = True
End Sub

我在模块

中有这段代码
Sub CommandBarComboBox_Create()
    Dim cmdBar As commandBar: Set cmdBar = Application.VBE.CommandBars("Custom")
    Dim arr As Variant: arr = Array("item_1", "item_2", "item_3")
    
    Dim i As Byte
    Dim newCtrl As CommandBarControl: Set newCtrl = cmdBar.Controls.Add(msoControlComboBox)
    
    With newCtrl
        .caption = "myList"
        For i = LBound(arr) To UBound(arr)
            .AddItem arr(i), i + 1
        Next i
        .OnAction = "'processSelection'"
        .tag = "myTag"
    End With

    ' Create event handler
    Set MenuEvent = New VBE_cmdHandler
    Set MenuEvent.evtHandler = Application.VBE.Events.CommandBarEvents(newCtrl)
    EventHandlers.Add MenuEvent
End Sub

Sub processSelection()
    Dim cmdBar As commandBar: Set cmdBar = Application.VBE.CommandBars("Custom")
    Dim userChoice As Long: userChoice = cmdBar.Controls(2).ListIndex
    
    Select Case userChoice
        Case 1
            Debug.Print "OPTION 1"
        Case 2
            Debug.Print "OPTION 2"
        Case Else
            Debug.Print "OPTION 3"
    End Select
End Sub

这工作得很好,但我想改变它,所以当调用 sub processSelection 时,它隐含地知道调用控件,所以我不必指定它.

如何做到?

问候 埃里奥·费尔南德斯

我刚刚找到了解决问题的方法,使用控件的 tag 属性。

我用 3 行新代码替换了子 processSelecion 的前 2 行代码,但不需要用命令栏识别以及最后使用哪个控件。

使用 tag 属性,我可以找到上次使用的控件以及用户选择的 ListIndex 项。

Sub processSelection()
    Dim curTag$: curTag = Application.VBE.CommandBars.ActionControl.tag
    Dim myControls As Object: Set myControls = Application.VBE.CommandBars.FindControls(tag:=curTag$)
    Dim userChoice As Long: userChoice = myControls.item(1).ListIndex
    
    Select Case userChoice
        Case 1
            Debug.Print "OPTION 1"
        Case 2
            Debug.Print "OPTION 2"
        Case 3
            Debug.Print "OPTION 3"
        Case Else
            Debug.Print "OTHER"
    End Select
End Sub