Как выбрать соответствующие значения для строки, которая соответствует одному из значений в столбце? - PullRequest
0 голосов
/ 22 января 2020

После сохранения значений в поле со списком я пытаюсь связать свой список со списком. Например, когда пользователь выбирает одно из значений в выпадающем списке, например, устройство a, которое хранится в рабочей таблице, как выбрать соответствующие значения для строки, которая соответствует одному из значений в столбце A, и связать их с другими выпадающими списками? Ниже мой код.

enter image description here

Private Sub selectitems()
With ComboBox1
Activate.Worksheets ("Newdevice")
Dim Y As Long
Y = Worksheets("Newdevice").Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To Y
If Worksheets("Newdevice").Cells(i, 1).Value = ComboBox1.Value Then
'if any one of the value in combobox1 is = to columnA of worksheet("newdevice")
'stuck here
'select the columns that has the same row as the one selected in columnA
ComboBox1.Value=
ComboBox2.Value=
ComboBox3.Value=
ComboBox4.Value=
End If
Next i
End Sub

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Пожалуйста, попробуйте этот код вместо того, который у вас есть. Он вызывает пользовательскую функцию, которая ищет номер строки, а затем извлекает значения ячеек из строки, найденной функцией. Установите этот код в стандартный модуль кода (по умолчанию его имя будет 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.

1 голос
/ 22 января 2020

Используйте метод Find, чтобы найти значение в Column A для ComboBox1, затем перетащите данные в другие ComboBoxes на Offset(). Используйте следующие коды.

Private Sub CommandButton1_Click()
Dim ws As Worksheet
Dim LEO As Range

Set ws = Worksheets("Sheet1")
With ws.Columns("A:A")
    Set LEO = .Find(what:=Me.ComboBox1, after:=.Cells(1), LookIn:=xlValues, _
        searchorder:=xlByRows, searchdirection:=xlNext)
    If Not LEO Is Nothing Then
        Me.ComboBox2 = LEO.Offset(0, 1)
        Me.ComboBox3 = LEO.Offset(0, 2)
        Me.ComboBox4 = LEO.Offset(0, 3)
    End If
End With

End Sub

enter image description here

# РЕДАКТИРОВАТЬ

Чтобы добавить значения к ComboBox из диапазона листов, используйте следующий код.

Private Sub UserForm_Initialize()
    With ComboBox1
        .List = Sheets("Sheet1").Range("A1:A8").Value
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...