Каждый раз, когда вы активируете свою пользовательскую форму - вы запускаете событие UserForm_Activate:
Private Sub UserForm_Activate()
, которое очищает вас ComboBox:
Me.valuerFirmCB.Clear
Это действие в свою очередь вызывает событие ComboBox_Change, еслиФорма была скрыта, и ComboBox имеет некоторое значение, выбранное до активации:
Private Sub valuerFirmCB_Change()
и устанавливает valuerFirmCB.Value
в ""
(ничего, как вы видите на скриншоте).
Какваш Me.valuerFirmCB.Clear
является событием ComboBox_Change, поэтому событие вызывается и пытается найти значение ""
, что приводит к ошибке в функции сопоставления. Кроме того, эта ошибка будет возникать, если вы просто удалите выбранное значение из valuerFirmCB
вручную.
Способ решения этой проблемы заключается в добавлении простой проверки к Private Sub valuerFirmCB_Change()
, например:
If Not valuerFirmCB.Value = "" Then
n = Application.WorksheetFunction.Match(valuerFirmCB.Value, sh.Range("1:1"), 0)
Me.valuerNameCB.Clear
For i = 2 To Application.WorksheetFunction.CountA(sh.Cells(1, n).EntireColumn)
Me.valuerNameCB.AddItem sh.Cells(i, n).Value
Next i
End If
Таким образом, поиск будет выполняться только тогда, когда valuerNameCB
имеет какое-либо значение.
Добавлено за комментарий
Я повторил эту ситуацию с дополнительными кнопкамис кодом Form.Show 0
на листе и Form.Hide
на бланке. Переключение между формой и листом ничего не делает, но если вы выбираете элемент в ComboBox, скрываете форму и снова показываете - сработает событие изменения Me.valuerFirmCB.Clear
. Однако этого не произойдет, если я использую Unload Me
вместо Form.Hide
.