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
这是一个我有兴趣实施的解决方案,但我不确定我的语法,我将在下面提供一个示例。我相信使用 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