EXCEL VBA «Ошибка времени выполнения 1004, невозможно получить свойство Match класса WorksheetFunction» - PullRequest
0 голосов
/ 11 декабря 2019

enter image description here Я пытаюсь сделать так, чтобы оба comboboxes(valuerFirmCB, valuerNameCB) были динамическими, то есть valuerNameCB будет отображать только названия, соответствующие фирме.

Это работает, нооднако я получил ошибку после добавления записи в таблицу "Run-time error 1004, Unable to get Match Property of the WorksheetFunction class".

Private Sub UserForm_Activate()

Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Valuer_Details")

Dim i As Integer

Me.valuerFirmCB.Clear
For i = 1 To Application.WorksheetFunction.CountA(sh.Range("1:1"))
Me.valuerFirmCB.AddItem sh.Cells(1, i).Value

Next i
End Sub

Private Sub valuerFirmCB_Change()
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("Valuer_Details")
Dim i As Integer
Dim n As Integer

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 Sub

1 Ответ

2 голосов
/ 11 декабря 2019

Каждый раз, когда вы активируете свою пользовательскую форму - вы запускаете событие 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.

...