如何在字符串和数字上使用带有通配符的 VBA 自动过滤器?

问题描述 投票:0回答:1

我正在使用 VBA 中的自动筛选功能来筛选 Excel 工作表。下面是一张桌子的图片。

当用户对同一工作表上的文本框进行更改时,将执行以下代码。我遇到的问题是,由于我在过滤器中使用通配符,任何仅包含数字(例如 2084)的单元格都会被过滤掉。该过滤器在包含字母的单元格上运行良好。如果用户在文本框中输入“20”,我将如何将数字单元格转换为字符串,以便我的过滤器能够捕获 2084?

Private Sub TextBox2_Change()
    Dim Txt As String
    Dim rng As Range

    Txt = TextBox2.Text
    Set rng = ActiveSheet.Range("a13:a1000")
    If Len(Txt) > 0 Then
        rng.AutoFilter Field:=1, Criteria1:="*" & Txt & "*"
    Else
        rng.AutoFilter Field:=1, Criteria1:="<>" & Txt
    End If
 End Sub
excel vba filter wildcard autofilter
1个回答
0
投票

我很喜欢同样的路径,但我想避免将数据格式化为文本(因为某些数据可能是公式结果,我想保留公式)。

同时,我实现了您需要做的事情以及更多:我将单元格格式化为文本,过滤并格式化回原来是数字的单元格。

注意:IsNumeric()返回

(...) 一个布尔值,指示表达式 是否可以计算 作为数字

这就是为什么即使您将数字格式化为文本,IsNumeric() 也会返回 True。您可以使用 Application.WorksheetFunction.IsNumber() 来代替,即

检查值的类型并根据值是否引用数字返回 True 或 False。

我在下面的示例中将两者用于不同的目的:

Private Sub TextBox2_Change()
    Dim Txt As String, rng As Range, rowCount as Long

    Txt = TextBox2.Text
    Set rng = ActiveSheet.Range("a13:a1000")
    rowCount = rng.Rows.Count
'    This one is for saving if they were originally numbers:
    ReDim isNumberArray(1 To rowCount) As Boolean

    If Len(Txt) > 0 Then
        For i = 1 To rowCount
'           I use IsNumber here cause I only care for cells with actual
'            number format
            If Application.WorksheetFunction.IsNumber(rng(i, 1)) Then
'                Format numbers as text and save their original format as a
'                  Boolean in IsNumberArray using their index
                rng(i, 1) = "'" & (rng(i, 1))
                isNumberArray(i) = True
            Else
                isNumberArray(i) = False
            End If
        Next i

        rng.AutoFilter Field:=1, Criteria1:="*" & Txt & "*"
        For i = 1 To rowCount
'            I use IsNumeric here because they are all in text format
'             but some may be evaluated as numbers. IsNumber woould be
'             false for all instances.
'            The sentence rng(i, 1) <> "" is there because IsNumeric()
'             is also True for Empty cells.
            If IsNumeric(rng(i, 1)) And rng(i, 1) <> "" And numberArray(i) Then
                rng(i, 1) = CDbl(rng(i, 1))
            End If
        Next i

    Else
'    This removes filter
        rng.AutoFilter Field:=1
    End If
 End Sub

对于我的问题,我想我可以存储公式而不是数据格式并检索它。情况变得更糟,因为我有数组公式,但会看看我能做什么。希望这可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.