我有一个像这样的简单桌子
当我在“B5”中搜索“abc_d”后,它会像这样显示
我希望每次在“B5”中搜索“abc d”或“abcd”。它还会理解我正在寻找“abc_d”。
这是我在VBA中通过过滤列搜索值的代码
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cell As Range
With Sheet1
.AutoFilterMode = False
With .Range("A6:B6")
.AutoFilter
If Len(Range("A5").Value) <> 0 Then
.AutoFilter Field:=1, Criteria1:="*" & Range("A5").Value & "*"
End If
If Len(Range("B5").Value) <> 0 Then
.AutoFilter Field:=2, Criteria1:="*" & Range("B5").Value & "*"
End If
End With
End With
End Sub
谢谢你
Dim bVal As String: bVal = CStr(Range("B5").Value)
If Len(bVal) > 0 Then
bVal = Replace(bVal, " ", "")
If Len(bVal) = 4 Then
bVal = Left(bVal, 3) & "_" & Right(bVal, 1)
.AutoFilter Field:=2, Criteria1:="*" & bVal & "*"
End If
End If
假设您可以将 A5 值赋予一个函数,该函数将返回一个数组,其中仅包含该值或该值以及将“ ”替换为“_”的值。
类似这样的:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cell As Range
With ActiveSheet
.AutoFilterMode = False
With .Range("A6:B6")
.AutoFilter
Dim arr
If Len(Range("A5").Value) <> 0 Then
arr = replaceArray("*" & Range("A5").Value & "*")
.AutoFilter Field:=1, Criteria1:=arr, Operator:=xlFilterValues
End If
If Len(Range("B5").Value) <> 0 Then
arr = replaceArray("*" & Range("B5").Value & "*")
.AutoFilter Field:=2, Criteria1:=arr, Operator:=xlFilterValues
End If
End With
End With
End Sub
Function replaceArray(val) As Variant()
Dim arr
If InStr(val, " ") > 0 Then
ReDim arr(1 To 2)
arr(1) = val
arr(2) = Replace(val, " ", "_")
ElseIf
ReDim arr(1 To 1)
arr(1) = val
End If
replaceArray = arr
End Function
位硬编码,但应该可以完成工作,如果你想给它更多的全面用途,可以给函数更多可能的参数。 如果您有疑问,请告诉我。
编辑:看来我误解了这个问题,假设它不是“”->“_”,但总是_而不寻找两者。那么就使用 vBasic 的解决方案吧。