Excel VBA Select 基于其在多个用户窗体组合框中的多列数据匹配条件的行

Excel VBA Select a row based on its multi-column data matching criteria in multiple userform comboboxes

这是一个我有兴趣实施的解决方案,但我不确定我的语法,我将在下面提供一个示例。我相信使用 AutoFilter 方法可以找到类似的结果,但我希望尽可能避免这种情况。到目前为止,我的尝试基于 Søren Holten Hansen 在 this post 中的建议,该建议使用嵌套的 if 语句 return 与 TextBoxes 中包含的条件相匹配的行号。

作为背景,我目前有一个包含五个组合框两个命令按钮的UserForm1。

每个 ComboBox 都预先填充了一个命名范围的内容,这些数据对应于 Sheet1 上的数据,例如 ComboBox1 中的 "Fruits" 和 Sheet1 的 A 列, ComboBox2 中的 "Vegetables" 和 Sheet1 的 B 列,依此类推。

我的目标是在单击 CommandButton1 时使用嵌套 If 语句来查找 Select Sheet 1 上的整行,其中包含与每个 ComboBox 的值完全匹配的行。例如,如果用户从 ComboBox1 选择 'Apple',从 ComboBox2 选择 'Potato',从 ComboBox 3 选择 'Farm',从 ComboBox4 选择 'Monkey',从 ComboBox5 选择 'Supermarket',则Sheet1 上的整行包含 A 列中的 'Apple'、B 列中的 'Potato'、C 列中的 'Farm'、D 列中的 'Monkey' 和 'Supermarket' 然后从 E 列中选择。

我目前拥有的是分配给 CommandButton1 的以下内容:

Dim i As Long, GetRow As Long
    For i = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
        If Sheets("Sheet1").Cells(i, 1).Value = Me.ComboBox1.Value Then
            If Sheets("Sheet1").Cells(i, 2).Value = Me.ComboBox2.Value Then
                If Sheets("Sheet1").Cells(i, 3).Value = Me.ComboBox3.Value Then
                    If Sheets("Sheet1").Cells(i, 4).Value = Me.ComboBox4.Value Then
                        If Sheets("Sheet1").Cells(i, 5).Value = Me.ComboBox5.Value Then
                    GetRow = i
                End If
            End If
        End If
    End If
End If
Next i
Rows(i).EntireRow.Select
End Sub

我相信使用嵌套的 If 语句可以达到预期的结果,但我不确定我在这个例子中的格式。

谢谢。

使用Range对象的Autofilter()方法,如下:

Option Explicit

Private Sub CommandButton1_Click()
    Dim i As Long
    Dim mySelection As Range

    With Sheet1
        With Range("E1", .Cells(.Rows.Count, 1).End(xlUp))
            For i = 1 To 5
                .AutoFilter field:=i, criteria1:=Me.Controls("Combobox" & i)
            Next i
            If Application.WorksheetFunction.Subtotal(103, .Resize(, 1)) > 1 Then Set mySelection = .Offset(1).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
        End With
        .AutoFilterMode = False
    End With
    If Not mySelection Is Nothing Then mySelection.Select
End Sub