Найдите и выберите предмет, найденный в списке со списком - PullRequest
0 голосов
/ 11 октября 2018

В приведенном ниже коде я проверяю, содержится ли значение ячейки Sheet2 A1 в списке combobox1, и, если он найден, помещает его в 'режим выбора' .Но это не работает.Какая часть кода должна быть исправлена?

Private Sub UserForm_Initialize()
  Set xRg = Worksheets("Sheet1").Range("A1:B5")
  Me.ComboBox1.List = xRg.Columns(1).Value
End Sub

Private Sub CommandButton1_Click()
  Dim foundRng As Range
  Set findrange = Sheets("Sheet1").Range("A1:B5")
  Set foundRng = findrange.Find(Sheets("Sheet2").Range("A1"))

  If foundRng Is Nothing Then
    MsgBox "Nothing found"
  Else
    MsgBox "I Found"
    Me.ComboBox1.ListIndex = foundRng.Value
  End If
End Sub

1 Ответ

0 голосов
/ 11 октября 2018

Объявление переменных и предоставление правильных типов данных

Я не слишком сильно изменил ваш код, но хотел бы дать вам несколько советов:

  1. Установите Option Explicit, чтобы заставить себя объявлять переменные (объекты).
  2. Обеспечьте входные регистры в ячейке Sheet2!A1, где может произойти несоответствие типов, если вы сравниваете строку или пустую строку (а нечисло) против ListIndex чисел.
  3. Рекомендуется полностью квалифицировать ссылки на диапазон (fqrr) .
  4. Предпочитать использовать термин Worksheets, если вы ссылаетесьтолько к рабочим листам.
  5. Проверка справки по переполнению стека Справочный тур относительно Как задать хороший вопрос? и Как создать минимальное, полное,и проверяемый пример
  6. Попробуйте узнать что-нибудь о обработке ошибок и отладке 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

Удачи на следующих этапах обучения: -)

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