我正在使用VBA自动过滤大型列表。 (仅少于5,000行)。具体来说,我正在费用记录中搜索供应商。当我运行此代码时,它发现许多供应商很好,但其他供应商却没有。
Private Function testMcTesterson()
Dim icell As Range
Dim tempStr As String
Dim i As Integer
Dim w As Workbook
Dim expLog As Workbook
Dim vendorName As String
Set expLog = Workbooks("FY18 Manual Expense Log.xlsm")
Set w = ActiveWorkbook
For Each icell In Selection
vendorName = VendorNormalizer(icell.Value)
expLog.Activate
'Filter by vendor
Debug.Print "Vendor name is " & "'" & vendorName & "'"
ActiveSheet.Range("A1").AutoFilter field:=5, Criteria1:=vendorName
w.Activate
Next icell
End Function
我正在调用我建立的另一个用于规范供应商名称的功能。有几个没有用(有几个没有用),但我目前正在努力解决的是亚马逊。我们有来自亚马逊的几笔交易,但没有显示。
到目前为止我已经检查过的东西:
检查哪些列被自动过滤。仅供应商列,因此代码未将过滤器应用于错误的列。 (也是因为它适用于其他供应商)
我怀疑问题可能出在我的规范化函数的输出上,所以我插入了debug.print语句。在运行过滤器之前,控制台立即读取“供应商名称为'Amazon'”。前后没有空格。我直接从即时窗口中复制了该代码,以防万一我拼错了。
我确定解决方案就在我的面前,只是看不到。
帮助!
编辑:这是VendorNormalizer的相关代码
Private Function VendorNormalizer(vendorName As String)
Select Case True
'Lots of other cases
Case InStr(1, vendorName, "Amazon", vbTextCompare) > 0
VendorNormalizer = "Amazon"
'Lots of other cases
End select
'If statements for exact matches
End function
我正在搜索的电子表格在我过滤的列中具有所有这些(并且没有其他Amazon条目)。 (复制和粘贴)
答案 0 :(得分:1)
感谢TotsieMae提出的突破性建议。原来通配符是答案。
显然,VBA range.autofilter命令要求条件是完全匹配的,尽管不需要键入自动过滤器。该解决方案非常简单,只需在规范化器的文本输出中包含通配符即可。
收件人:
Select Case True
'Lots of other cases
Case InStr(1, vendorName, "Amazon", vbTextCompare) > 0
VendorNormalizer = "*Amazon*"
'Lots of other cases
End select
谢谢大家的帮助!