Как сопоставить значение в выпадающем списке со 2-м столбцом и выделить найденный элемент
Это не было , что легко понять, что вы на самом деле хотелиделать.
Поскольку вы имеете в виду диапазон данных из двух столбцов A:B
, но отображаете только первый столбец диапазона (возможно, идентифицирующий, например, имена или идентификаторы ) в комбинированном списке, я предполагаю следующее:
- После нажатия элемента управления
CommandButton1
и - при условии, что данное значение ячейки (
A1
) равно 2-му значение столбец ComboBox1
( возможно скрытый ), - соответствующий элемент
ComboBox1
( отображающий, например, имена ) должен быть выбран (выделен).
Прикладной метод
Важной строкой кода в процедуре события CommandButton1_Click
является присвоение возможного совпадения позиция к переменной pos
:
pos = Application.Match(myVal, Application.Index(Me.ComboBox1.List, 0, 2), 0)
As ► Application.Match
требуется одномерный массив и ComboBox1.List
2-мерное , функция Application.Index
должна извлечь столбец комбинированного списка 2nd (скрытый) (содержащий значения) из списка со спискомтеперь получаем 1-dim массив в качестве аргумента.
... Application.Index(Me.ComboBox1.List, 0, 2)
'cf Примечание *)
- ) Обратите внимание , что индекс строки в функции
Application.Index
выше должен быть установлен в0
, так что индекс столбца ► 2
может изолировать только 2-й столбец.
Если найдена позиция match , переменная pos
получаетчисловой номер элемента, который можно использовать для выбора найденного элемента путем сброса комбинированных списков .ListIndex
(вычитая 1, так как индексы блоков основаны на нуле).
Если соответствующее значение не найдено в поле со списком, pos
возвращает ошибку, и поэтому необходимо избегать сообщения об ошибке, проверяя эту переменную с помощью функции ► IsError()
(именно поэтому pos
должен быть объявлен как Variant , а не только как Long , чтобы избежать ошибок несоответствия типов.)
Код пользовательской формы
Option Explicit
Private Sub UserForm_Initialize()
Dim xrg As Range
Set xrg = ThisWorkbook.Worksheets("LookupLists").Range("A1:B5")
With Me.ComboBox1
.List = xrg.Value2
.ColumnCount = 2 ' << provide for data of both columns
.ColumnWidths = .Width ' << show only first column in full box width
End With
End Sub
Private Sub CommandButton1_Click()
Dim pos As Variant ' item position has to be variant to allow IsError()
Dim myVal
myVal = ThisWorkbook.Worksheets("Sheet1").Range("A1")
If myVal = "" Then
Beep
Else ' try to get a match and its position
pos = Application.Match(myVal, Application.Index(Me.ComboBox1.List, 0, 2), 0)
If IsError(pos) Then pos = 0 ' avoid error msg if not found :-)
Me.ComboBox1.ListIndex = pos - 1 ' goto item no: index is zero based!
End If
End Sub