我有一列数字。我想自动过滤仅包含 00 的数字。
我使用了自动过滤器的搜索功能,它起作用了。图片中它正在工作:
但我不知道如何在 vba 中使用此搜索功能。
我在 excel 自动筛选和 vba 中都使用了“包含条件”,但它没有给出数字结果。它仅适用于文本。
我想要一个 vba 代码来仅过滤包含 00 的数字。
感谢帮助
答案1
正如您所发现的,尽管“自定义自动筛选”对话框中提供了“包含”选项,但它对数字无效。实现所需功能的一个相当简单的方法是使用辅助列,它将数字转换为文本,然后使用相同的自定义自动筛选搜索文本列。
如果你使用
=TEXT(number,"#")
将每个包含 的单元格转换number
为文本,那么您将能够找到小数点分隔符左侧有 00 的数字(在英国/美国为 . ,在欧洲大部分地区为 )。如果您想在小数点分隔符右侧包含 00(甚至跨越它),则将第二个参数调整为(例如)
=TEXT(number,"#.####")
其中小数点分隔符右侧的 # 数量等于数字列中包含的最大小数位数。请注意,此表示将隐藏尾随零 - 因此数字列中的 1.1200 将在文本列中显示为 1.12(因此不会出现在筛选列表中)。
编辑-使用 VBA 进行
不幸的是,该Range.AutoFilter
方法没有提供与在工作表上选择数据过滤器按钮时出现的下拉对话框中的“搜索”等效的功能。
该方法的文档(https://docs.microsoft.com/en-us/office/vba/api/excel.range.autofilter) 表明您可以构建自己的自定义过滤器 - 请参阅文档中列出的第三个示例。
因此,一种解决方法是构建自己的过滤器。在执行此操作时,需要注意以下几点。首先,过滤数组中的元素必须全部是文本字符串(即使要过滤的值都是数字)。其次,过滤器可以作为变量提供,而不是使用Criteria1:=Array( ... )
示例中所示的构造。
使用包含范围 A2:A1000001 中的 1 到 1,000,000 的整数的工作表,以下代码创建了一个自动过滤器,该过滤器过滤掉了包含双零的 33219 行。在一台普通笔记本电脑(联想 Ideapad 3)上,该过程大约需要 8 秒。您是否获得类似的性能以及您实现的性能是否符合您的要求,只有您自己才能决定。
Sub Main()
Dim strItems() As String, strValue As String
Dim i As Integer, j As Integer, intValue As Integer
j = -1
For i = 1 To 1000000
intValue = ActiveSheet.Cells(i + 1, 1)
strValue = CStr(intValue) 'Convert number to string
'If number contains 00 but not 000 (or more),
'add to filter array (strItems)
If InStr(strValue, "00") > 0 Then
If InStr(strValue, "000") = 0 Then
j = j + 1
ReDim Preserve strItems(j)
strItems(j) = strValue
End If
End If
Next i
ActiveSheet.Range("$A$1:$A$1000001").AutoFilter Field:=1, _
Criteria1:=strItems, Operator:=xlFilterValues
End Sub
如您所见,除最后一行实质性代码外,所有代码均用于读取和处理范围 A2:A1000001 并将过滤器值数组构建为变量strItems
。然后在最后一行中使用此变量通过该方法将过滤器应用于工作表AutoFilter
。我还从过滤器中排除了任何包含 3 个或更多连续零的数字,但这是可以轻易更改的。