Пожалуйста, попробуйте этот код вместо того, который у вас есть. Он вызывает пользовательскую функцию, которая ищет номер строки, а затем извлекает значения ячеек из строки, найденной функцией. Установите этот код в стандартный модуль кода (по умолчанию его имя будет Module1. Дайте ему осмысленное имя.)
Option Explicit
Sub PopulateMyForm(MyForm As MSForms.UserForm)
Dim Rng As Range
Dim Device As String
Dim C As Long
Dim R As Long
Device = MyForm.ComboBox1.Value
Set Rng = DeviceRange
R = FindRow(Device, Rng)
If R Then
For C = 2 To 4
MyForm.Controls("ComboBox" & C).Value = Rng.Worksheet.Cells(R, C).Value
Next C
Else
MsgBox """" & Device & """ wasn't found.", _
vbInformation, "Unlisted device"
End If
End Sub
Function DeviceRange() As Range
Dim Ws As Worksheet
Dim Rng As Range
Set Ws = ThisWorkbook.Worksheets("NewDevice")
With Ws
' lookup range in column A, starting from row 2
Set DeviceRange = .Range(.Cells(2, "A"), .Cells(.Rows.Count, "A").End(xlUp))
End With
End Function
Private Function FindRow(FndWhat As Variant, _
FndIn As Range, _
Optional FndAft As Long = 1, _
Optional FndVal As Boolean, _
Optional FndPart As Boolean, _
Optional FndHow As Long = xlByColumns, _
Optional FndWay As Long = xlNext, _
Optional FndCase As Boolean = False, _
Optional Fnd As Range) As Long
' returns a sheet row if FndIn is a named range or DataBodyRange
' ==================================================
' Parameters:
' FndWhat = Text/Number to search for
' FndIn = Range to search in
' FndAft = Cell of FndIn to start the search from
' FndVal = Cell property to search
' [True = Value, False = Formula]
' FndPart = True = xlPart, False = xlWhole]
' FndHow = Search method
' [= xlByRows or xlByColumns]
' FndWay = Search direction
' [= xlNext or XlPrevious]
' FndCase = Match case
' Fnd = Return range
' ==================================================
If FndAft = 0 Then FndAft = FndIn.Cells.Count
With FndIn
Set Fnd = .Find(What:=FndWhat, _
After:=.Cells(FndAft), _
LookIn:=IIf(FndVal, xlValues, xlFormulas), _
LookAt:=IIf(FndPart, xlPart, xlWhole), _
SearchOrder:=FndHow, _
SearchDirection:=FndWay, _
MatchCase:=FndCase)
End With
On Error Resume Next ' return 0, if not found
FindRow = Fnd.Row
Err.Clear
End Function
Функция FindRow
, возможно, более сложна, чем вы ожидаете. Это инструмент, который я всегда держу под рукой и использую всякий раз, когда мне нужно найти строку.
Я не знаю, как вы связываете этот код с вашей формой. Вот предложение. Установите приведенный ниже код в модуль кода вашей пользовательской формы.
Option Explicit
Private Sub UserForm_Initialize()
Dim Rng As Range
With ComboBox1
.List = DeviceRange.Value
.ListIndex = 0
End With
End Sub
Private Sub ComboBox1_Change()
PopulateMyForm Me
End Sub
Первая процедура будет запущена при инициализации формы. Он загрузит имена устройств из DeviceRange. Вторая процедура запускается, когда элемент выбирается из раскрывающегося списка в ComboBox1.