我正在使用 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
我很喜欢同样的路径,但我想避免将数据格式化为文本(因为某些数据可能是公式结果,我想保留公式)。
同时,我实现了您需要做的事情以及更多:我将单元格格式化为文本,过滤并格式化回原来是数字的单元格。
注意: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
对于我的问题,我想我可以存储公式而不是数据格式并检索它。情况变得更糟,因为我有数组公式,但会看看我能做什么。希望这可以帮助别人。