VBA创建包含数组

时间:2018-04-16 11:54:04

标签: arrays excel vba autofilter

我正在尝试创建一个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;

  1. 我的问题是为什么我在使用*字符串时会停止工作?

  2. 为什么它以这种奇怪的方式工作?

  3. 我如何给出包含值的命名表来过滤包含在单元格内的任何行的行?

1 个答案:

答案 0 :(得分:0)

以下是一个可以帮助您的类似示例。假设我们有数据,我们希望根据 C 列中的值显示行。

如果C单元格包含 alpha beta gamma 。对于一个或两个通配符匹配,我们可以使用 AutoFilter

有两个以上的标准,我们可以手动过滤。假设我们从:

开始

enter image description here

运行此代码:

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

将产生:

enter image description here

如果绝对需要AutoFilter,那么让代码构造一个“帮助”列并过滤该列。