自动过滤数字和包含数字的字符串的单元格

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

我有一个使用 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 调用后保留其原始格式。

除了糟糕和低效之外,只要编辑的单元格没有返回数字的公式,它就可以工作。如果他们这样做了,公式就会被删除,我就会恢复它的值。我想我可以保存公式并检索它,但仍然很糟糕。此外,我在一列中有数组公式,所以它会变得非常讨厌。

有没有办法不编辑单元格?

excel vba autofilter
3个回答
1
投票

过滤列中的数字

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

0
投票

此代码片段隐藏了特定列中部分包含定义文本的所有行:

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


0
投票

如果您不介意使用辅助列,也许您想尝试一下:

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:.
输入一个公式将数字转换为文本
复制公式并将其粘贴为值。
带有暴击的过滤器。
显示消息框。
清除过滤器并清除辅助列的内容。

enter image description here

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