Объявление переменных и предоставление правильных типов данных
Я не слишком сильно изменил ваш код, но хотел бы дать вам несколько советов:
- Установите
Option Explicit
, чтобы заставить себя объявлять переменные (объекты). - Обеспечьте входные регистры в ячейке
Sheet2!A1
, где может произойти несоответствие типов, если вы сравниваете строку или пустую строку (а нечисло) против ListIndex
чисел. - Рекомендуется полностью квалифицировать ссылки на диапазон (fqrr) .
- Предпочитать использовать термин
Worksheets
, если вы ссылаетесьтолько к рабочим листам. - Проверка справки по переполнению стека Справочный тур относительно Как задать хороший вопрос? и Как создать минимальное, полное,и проверяемый пример
- Попробуйте узнать что-нибудь о обработке ошибок и отладке VBA , чтобы иметь возможность дать более точную информацию о возникающих ошибках. «Это не работает» это как красная тряпка для быка для более опытных программистов на этом сайте, будьте более точными здесь: -;
Некоторые незначительные изменения ...
Option Explicit ' declaration head of your UserForm code module
Dim xrg As Range ' possibly declared here to be known in all UserForm procedures
Private Sub UserForm_Initialize()
Set xrg = ThisWorkbook.Worksheets("Sheet1").Range("A1:B5") ' << fully qualified range reference (fqrr)
Me.ComboBox1.List = xrg.Columns(1).Value
End Sub
Private Sub CommandButton1_Click()
Dim foundRng As Range, findrange As Range
Set findrange = ThisWorkbook.Worksheets("Sheet1").Range("A1:B5") ' fqrr
Set foundRng = findrange.Find(Thisworkbook.Worksheets("Sheet2").Range("A1")) ' fqrr
If foundRng Is Nothing Then
MsgBox "Nothing found"
Me.ComboBox1.ListIndex = -1
ElseIf foundRng.Value = vbNullString Then
MsgBox "Empty search item"
Me.ComboBox1.ListIndex = -1
Else
MsgBox "1 item found"
If IsNumeric(foundRng.Value) Then
Me.ComboBox1.ListIndex = CLng(foundRng.Value) + 1
Else
Me.ComboBox1.ListIndex = foundRng.Row - 1
End If
End If
End Sub
Рекомендуемая ссылка
Вы можете найти полезное руководство по Отладка VBA на сайте Чипа Пирсона.
Дополнение к комментарию
Чтобы определить динамический диапазон без следующих пустых строк, вы можете переписать Initialize
процедура выглядит следующим образом:
Private Sub UserForm_Initialize()
Dim n& ' ... As Long
With ThisWorkbook.Worksheets("Sheet1")
n = .Range("A" & .Rows.Count).End(xlUp).Row
Set xrg = .Range("A1:B" & n) ' << fully qualified range reference
End With
Me.ComboBox1.List = xrg.Columns(1).Value
End Sub
Удачи на следующих этапах обучения: -)