我有一个使用 VBA 进行过滤的列表,该列表在我用来应用过滤器的列中同时包含数字和字符串(其中一些包含数字作为 ID 的一部分)。
如果filterValue是数字或数字,我想在列中的数字或字符串中找到它。
例如,如果三个单元格的值分别为“3231”(作为数字)、“MN23”和“AR234IT”(作为两个字符串),我应该使用 filterValue=23(也可以使用 2 或 3)获取其中三个单元格。
如果我使用“”和filterValue&“”作为Criteria1,它适用于字符串,但它不会返回过滤列中包含数字格式单元格的行。
我通过将 ' 添加到数字单元格(将它们转换为文本格式),将其原始格式指示符保存在数组中,按“”&filterValue&“”进行过滤,然后从最初是一个字符串单元格中删除 ' 来解决这个问题数量。
rowCount = filteredRegion.Rows.Count
ReDim isNumberArray(1 To rowCount) As Boolean
For i = 1 To rowCount
If Application.WorksheetFunction.IsNumber(filteredRegion(i, 3)) And filteredRegion(i, 3) <> "" Then
filteredRegion(i, 3) = "'" & (filteredRegion(i, 3))
isNumberArray(i) = True
Else
isNumberArray(i) = False
End If
Next i
filteredRegion.AutoFilter Field:=3, Criteria1:="*" & filterValue & "*"
For i = 1 To rowCount
If IsNumeric(filteredRegion(i, 3)) And filteredRegion(i, 3) <> "" And numberArray(i) Then
filteredRegion(i, 3) = CDbl(filteredRegion(i, 3))
End If
Next i
这有效。我过滤掉了其中包含 filterValue 的行,无论它们是数字内容还是文本内容,并且在 VBA 调用后保留其原始格式。
除了糟糕和低效之外,只要编辑的单元格没有返回数字的公式,它就可以工作。如果他们这样做了,公式就会被删除,我就会恢复它的值。我想我可以保存公式并检索它,但仍然很糟糕。此外,我在一列中有数组公式,所以它会变得非常讨厌。
有没有办法不编辑单元格?
Sub FilterIfDigit()
Const SHEET_NAME As String = "Sheet1"
Const FILTER_COLUMN As Long = 3
Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code
Dim ws As Worksheet: Set ws = wb.Sheets(SHEET_NAME)
ws.AutoFilterMode = False
Dim trg As Range: Set trg = ws.Range("A1").CurrentRegion
Dim FilterCol() As Variant: FilterCol = trg.Columns(FILTER_COLUMN).Value
Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
dict.CompareMode = vbTextCompare
Dim rValue As Variant, rString As String, r As Long
For r = 2 To trg.Rows.Count
rValue = FilterCol(r, 1)
If Not IsError(rValue) Then
rString = CStr(rValue)
If rString Like "*#*" Then
dict(rString) = Empty
End If
End If
Next r
If dict.Count = 0 Then ' no digit found
trg.AutoFilter FILTER_COLUMN, "0123456789" ' any digit(s)
Exit Sub
End If
trg.AutoFilter FILTER_COLUMN, dict.Keys, xlFilterValues
End Sub
此代码片段隐藏了特定列中部分包含定义文本的所有行:
Sub myfilter()
Set filteredrange = Range("A56:H62")
Lookup = "23"
Colvalue = 3
For i = 1 To filteredrange.Rows.Count
If InStr(1, filteredrange.Cells(i, Colvalue), Lookup) = 0 Then
filteredrange.Rows(i).Hidden = True
End If
Next i
End Sub
要取消隐藏它们:
filteredrange.Rows.Hidden = False
如果您不介意使用辅助列,也许您想尝试一下:
Sub test()
Dim col As String, crit As String, rg As Range
col = "c1"
crit = "=*" & Application.InputBox("input the criteria") & "*"
Set rg = Range("A1", Range("E" & Rows.Count).End(xlUp))
With Range("ZZ1").Resize(rg.Rows.Count)
.Value = "=text(" & col & ",0)"
Application.ScreenUpdating = False
.Copy: .PasteSpecial xlValues
Application.ScreenUpdating = True
.AutoFilter Field:=1, Criteria1:=crit, Operator:=xlAnd
MsgBox "filtered"
.AutoFilter Field:=1
.ClearContents
End With
End Sub
col 是筛选第 1 行的列。
Crit 它是由用户输入的过滤条件
rg 是表格的范围
辅助列是 ZZ:.
输入一个公式将数字转换为文本
复制公式并将其粘贴为值。
带有暴击的过滤器。
显示消息框。
清除过滤器并清除辅助列的内容。