我正在尝试创建一个UserForm来按许多条件配置AutoFilter
其中一个是能够在TextBox中放置一些单词/句子(由" /"分隔),并且只显示包含其中任何一行的行。
为了达到这个目的,我创建了一个包含TextBox包含分隔符(" /")
的字段的表。Dim SeparatorCounter As Integer
Dim Separator As String
Dim FieldNumbers As Integer
Dim BoxVal As String
BoxVal = SearchForm.SearchTextBox.Value
Separator = "/"
FieldNumbers = Len(BoxVal) - Len(Replace(BoxVal, Separator, "")) + 1
Dim FilterArray() As String
ReDim FilterArray(FieldNumbers)
然后我将字符串放在表格中
If FieldNumbers = 1 Then
'If no separator, there is nothing to separate
FilterArray(0) = BoxVal
Else
'If there is any separator
Dim CurrText As String
Dim RestText As String
RestText = BoxVal
Dim i As Integer
'Filed numbers = -1 because tables starts with 0
For i = 0 To FieldNumbers - 1
If i = FieldNumbers - 1 Then
'If this is last part of string, there is nothing to separate
FilterArray(i) = RestText
Else
'If this is not last part, cut string into 2
CurrText = Mid(RestText, 1, InStr(1, RestText, Separator, vbTextCompare) - 1)
RestText = Mid(RestText, 2 + Len(CurrText), 9999)
FilterArray(i) = CurrText
End If
Next i
End If
最后,我使用这样的标准
ActiveSheet.Range("B:K").Select 'Wybierz kolumny jakie będą filtrowane
Selection.AutoFilter Field:=1, Criteria1:=FilterArray, _
Operator:=xlFilterValues
它按预期工作,我的意思是它返回的结果行与表中的任何值完全相同
无论如何,我需要过滤包含来自单元格内表格的值的行,但它不必完全相同;只需在行中查找一些关键字
为了达到这个目的,我尝试在自动过滤器中使用它之前在表中添加星星
For i = 0 To FieldNumbers - 1
FilterArray(i) = "*" & RTrim(LTrim(FilterArray(i))) & "*"
Next i
然而,它以奇怪的方式工作。它可以找到包含"的东西" +关键字+"东西",但仅限于: 我在文本框中放了一个字符串来过滤 2.我将多个字符串放入过滤器中,但它必须完全相同
例如,如果我在文本框中使用这些值:
"Example" <- It works (shows rows that contain *example*)
"Ex" <- Also works
"Ex/Ex" <- Also works
"Example/Example/Example" <- Also works
"Ex/Example" <- not working (result of AutoFilter is empty)
"Ex/anything/else" <- also not working (result of AutoFilter is empty)
要清楚,在将星星添加到表格之前,它的工作正常。虽然我给了
Ex/another/else
我可以看到细胞正好是&#34; ex&#34;或者&#34;另一个&#34;或&#34;否则&#34;
我的问题是为什么我在使用*字符串时会停止工作?
为什么它以这种奇怪的方式工作?
我如何给出包含值的命名表来过滤包含在单元格内的任何行的行?
答案 0 :(得分:0)
以下是一个可以帮助您的类似示例。假设我们有数据,我们希望根据 C 列中的值显示行。
如果C单元格包含我们想显示行 alpha 或 beta 或 gamma 。对于一个或两个通配符匹配,我们可以使用 AutoFilter 。
有两个以上的标准,我们可以手动过滤。假设我们从:
开始运行此代码:
Sub ManyWilds()
Dim crit As String, HideRow As Boolean, N As Long
Dim i As Long, critARR
N = Cells(Rows.Count, "C").End(xlUp).Row
crit = "alpha/beta/gamma"
critARR = Split(crit, "/")
For i = 2 To N
HideRow = True
v = Cells(i, "C").Value
For Each a In critARR
If InStr(1, v, a) > 0 Then HideRow = False
Next a
If HideRow Then Cells(i, 1).EntireRow.Hidden = True
Next i
End Sub
将产生:
如果绝对需要AutoFilter
,那么让代码构造一个“帮助”列并过滤该列。