excel - 如何将多个条件应用于.Find?
问题描述
我改编了我在网上找到的代码。
- 它在 A 列中找到字符串“car”并将行作为数组返回
- 它将一个变量分配给数组的长度(找到多少匹配项)
- 它分配一个变量以生成一个介于 0 和数组长度之间的随机数
- 然后它将随机匹配行的值打印到 K3
Dim myArray() As Variant
Dim x As Long, y As Long
Dim msg As String
With ActiveSheet.Range("A1:A" & ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row)
Set c = .find("Car", LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
ReDim Preserve myArray(y)
myArray(y) = c.Row
y = y + 1
Set c = .findNext(c)
If c Is Nothing Then
GoTo DoneFinding
End If
Loop While c.Address <> firstAddress
End If
DoneFinding:
End With
For x = LBound(myArray) To UBound(myArray)
msg = msg & myArray(x) & " "
Next x
ArrayLen = UBound(myArray) - LBound(myArray)
random_index = WorksheetFunction.RandBetween(0, ArrayLen)
MsgBox myArray(random_index)
Dim test As String
test = "B" & myArray(random_index)
Range("K3").Value = Range(test)
例子
我正在努力调整查找代码以允许多个标准。所以在我的例子中,它找到了“汽车”。如果我想查找在 A 列中包含“Car”而在 D 列中包含“Red”的匹配项怎么办?
我试过了
With ActiveSheet.Range("A1:A" & "D1:D" & ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row & ActiveSheet.Range("D" & Rows.Count).End(xlUp).Row)
Set c = .find("Car", "Red", LookIn:=xlValues)
我在 Set 行上得到类型不匹配。
如果它令人困惑,它目前会寻找一个字符串,例如“Car”,但我最终会将它链接到将分配给数据验证列表的变量。因此,如果用户从下拉列表中选择“汽车”,这就是它将搜索的内容。
解决方案
也许高级过滤器可以满足您的需求:
示例代码
Option Explicit
Public Sub FilterData()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("YourSheetName")
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim CriteriaRange As Range
Set CriteriaRange = ws.Range("A1", "E2")
Dim DataRange As Range
Set DataRange = ws.Range("A4", "E" & LastRow)
DataRange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=CriteriaRange, Unique:=False
End Sub
Public Sub ShowAll()
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0
End Sub
根据评论编辑:
您可以使用高级过滤器,然后遍历过滤器结果:
Option Explicit
Public CurrentRow As Long
Public Sub FilterData()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("YourSheetName")
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim CriteriaRange As Range
Set CriteriaRange = ws.Range("A1", "E2")
Dim DataRange As Range
Set DataRange = ws.Range("A4", "E" & LastRow)
DataRange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=CriteriaRange, Unique:=False
End Sub
Public Sub ShowAll()
On Error Resume Next
ActiveSheet.ShowAllData
CurrentRow = 1
On Error GoTo 0
End Sub
Public Sub GetNextResult()
FilterData
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("YourSheetName")
Dim LastRow As Long
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim DataRange As Range
Set DataRange = ws.Range("A4", "E" & LastRow)
Dim FilteredData As Range
Set FilteredData = DataRange.Resize(ColumnSize:=1).SpecialCells(xlCellTypeVisible)
If CurrentRow + 1 > FilteredData.Cells.Count Then
CurrentRow = 1
End If
CurrentRow = CurrentRow + 1
Dim i As Long
Dim Cell As Variant
For Each Cell In FilteredData
i = i + 1
If i = CurrentRow Then
Cell.EntireRow.Select
'or
'MsgBox Cell.Value & vbCrLf & Cell.Offset(0, 1) & vbCrLf & Cell.Offset(0, 2) & vbCrLf & Cell.Offset(0, 3) & vbCrLf & Cell.Offset(0, 4)
End If
Next Cell
End Sub
推荐阅读
- python - pymongo 中的 find_one_and_update() 是原子的吗?
- visual-studio-code - 在使用 GitHub 拉取请求和问题在 Visual Studio Code 中创建问题时,是否可以将 GitHub 问题直接分配给项目板?
- c# - 本地化中的 ASP.NET Core API System.InvalidOperationException
- c++ - 请解释此 c++ 代码中 for_each 函数的使用
- r - 使用“状态”过滤数据框,该数据框可以将字符和数字作为列的输入
- r - 在 Rstudio 中安装任何软件包的问题
- asp.net-core - 找不到“Microsoft.AspNet.WebApi.Client”包
- typescript - ts 用吸气剂缩小
- reactjs - react中的内联css和html标签给出错误
- powerbi - 滚动 12m 测量 - Power BI DAX