Excel VBA — приостановка событий при обновлении ComboBox

У меня есть приложение, написанное на VBA для Excel, которое принимает поток данных в реальном времени. Всякий раз, когда происходит изменение данных, в VBA запускаются различные события.

У меня также есть несколько пользовательских форм с ComboBox. Моя проблема в том, что когда я нажимаю стрелку вниз на ComboBox и пытаюсь сделать выбор, в тот момент, когда я получаю обновление из потока данных, ComboBox сбрасывается. Что я хотел бы сделать, так это приостановить события, пока я делаю свой выбор в ComboBox, а затем возобновить его, когда я закончу. Как создать эту функциональность?


person kyokley    schedule 12.01.2010    source источник


Ответы (3)


Возможно, вы можете поставить флаг, чтобы обойти событие обновления в вашем поле со списком, пока не будет сделан выбор.

Private bLock as boolean  ' declare at module level

' When a user clicks on the combobox
Private Sub DropDownArrow_Click()  ' or cboComboBox_Click()
    bLocked = True
End Sub

' This procedure is the one that does the updating from the data source.
' If the flag is set, do not touch the comboboxes.
Private Sub subUpdateComboBoxes()
    If Not bLocked then
        ' Update the comboboxes
    End If
End Sub


' When the selection is made, or the focus changes from the combobox.
' check if a selection is made and reset the flag.
Private Sub cboComboBox_AfterUpdate()  ' Or LostFucus or something else
    if Format(cboComboBox.Value) <> vbNullString Then
        bLocked = False
    End If
End Sub

Надеюсь, это поможет.

person Marcand    schedule 14.01.2010
comment
Мне удалось выяснить, что вызывало сброс ComboBox, но мне определенно нравится ваше решение, потому что нажатие на стрелку вниз фактически приостанавливает обновления. Спасибо за предложение. - person kyokley; 22.01.2010

Попробуйте это отключить:

приложение.enableevents = ложь

И это, чтобы снова включить:

приложение.enableevents = правда

person guitarthrower    schedule 12.01.2010
comment
Итак, я предполагаю, что я установил бы для Application.EnableEvents значение false внутри процедуры DropDownArrow в ComboBox, но я не хочу, чтобы события были повторно включены до тех пор, пока не будет сделан выбор - person kyokley; 13.01.2010
comment
Было бы полезно увидеть часть вашего кода, чтобы действительно понять, что происходит. Настоящий вопрос заключается в том, почему поле со списком сбрасывается? можешь выложить код? - person guitarthrower; 13.01.2010
comment
Я смог найти проблему. У меня была функция, написанная для обновления пользовательской формы. По-видимому, эта функция также сбрасывает ComboBox. Ограничив вызовы функции, я смог решить проблему. Спасибо, что указали мне правильное направление. - person kyokley; 22.01.2010

Сделать паузу и показать сообщение, а также продолжить работу во время паузы. наконец нажмите кнопку

Public Ready As Boolean

Private Sub Command1_Click()
Ready = True
End Sub

Private Sub Form_Load()
Me.Show
Ready = False
Call Wait
Label1.Visible = True
End Sub

Public Function Wait()
Do While Ready = False
    DoEvents
Loop
End Function
person Appu    schedule 18.04.2011