Можно ли перехватить событие CommandBarComboBox.Change, чтобы при внесении изменений в код Excel VBA вызывалось событие? - PullRequest
0 голосов
/ 01 октября 2019

У меня есть элемент управления ComboBox на пользовательской панели команд. Я хочу определить, когда было внесено изменение в ComboBox, и запустить какой-либо код.

Это прекрасно работает, когда пользователь изменяет значение в ComboxBox, но если какой-то другой код VBA меняет его, событие неfired.

Я взял код отсюда: https://docs.microsoft.com/en-us/office/vba/api/office.commandbarcombobox.change и немного изменил его, чтобы удалить CommandBar с тем же именем, чтобы я мог запускать его несколько раз. Затем я добавил еще одну функцию для программного изменения значения ComboBox. Когда я изменяю значение программно, можно видеть, что оно изменяется в графическом интерфейсе Excel, но код события не срабатывает.

Я также попробовал более простой метод OnAction, вместо перехвата событий, оба, кажется, даюттот же результат.

В модуле ClassModule ComboBoxHandler у меня есть следующий код:

Private WithEvents ComboBoxEvent As Office.CommandBarComboBox
Public Sub SyncBox(box As Office.CommandBarComboBox)
    Set ComboBoxEvent = box
    If Not box Is Nothing Then
        MsgBox "Synced " & box.Caption & " ComboBox events."
    End If

End Sub

Private Sub Class_Terminate()
    Set ComboBoxEvent = Nothing
End Sub

Private Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)
    Dim stComboText As String

    stComboText = Ctrl.Text

        Select Case stComboText
        Case "First Class"
            FirstClass
        Case "Business Class"
            BusinessClass
        Case "Coach Class"
            CoachClass
        Case "Standby"
            Standby
    End Select

End Sub
Private Sub FirstClass()
    MsgBox "You selected First Class reservations"
End Sub
Private Sub BusinessClass()
    MsgBox "You selected Business Class reservations"
End Sub
Private Sub CoachClass()
    MsgBox "You selected Coach Class reservations"
End Sub
Private Sub Standby()
    MsgBox "You chose to fly standby"
End Sub

В модуле у меня есть следующее:

Private ctlComboBoxHandler As New ComboBoxHandler
Sub AddComboBox()

    Set HostApp = Application

    On Error Resume Next
    CommandBars("Test CommandBar").Delete

    Dim newBar As Office.CommandBar
    Set newBar = HostApp.CommandBars.Add(Name:="Test CommandBar", Temporary:=True)
    Dim newCombo As Office.CommandBarComboBox
    Set newCombo = newBar.Controls.Add(msoControlComboBox)
    With newCombo
        .AddItem "First Class", 1
        .AddItem "Business Class", 2
        .AddItem "Coach Class", 3
        .AddItem "Standby", 4
        .DropDownLines = 5
        .DropDownWidth = 75
        .ListHeaderCount = 0
    End With
    ctlComboBoxHandler.SyncBox newCombo
    newBar.Visible = True


End Sub


Sub test()

    Dim newBar As Office.CommandBar
    Set newBar = Application.CommandBars("Test CommandBar")
    Dim cmbox As Office.CommandBarComboBox
    Set cmbox = newBar.Controls(1)
    cmbox.Text = "Business Class"   ''<< I was hoping this would fire an event, but it does not! Same is true if I
End Sub

Сначала я запускаю AddComboBoxи события работают нормально, если я вручную изменяю ComboBox. Затем я запускаю test (), и значение, отображаемое внутри ComboBox, изменяется, но событие не запускается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...