试图过滤长号的问题

时间:2017-11-08 20:43:28

标签: excel vba excel-vba

我的列中有很多更长的数字。我想为所有不以2开头的数字过滤我的专栏。我尝试在代码中编写它以首先选择所有2,但这并不起作用。然后我尝试在Excel中手动执行它,说过滤器,自定义规则,不以2开头。但没有任何变化。例如,在数字之前我没有看到零。我试图将它们重新格式化为数字,但它们已经是数字了。我不确定为什么它既不选择以2开头的所有数字,也不选择DON&#T; T以2开头的所有数字。

以下是我尝试获取以2开头的数字的代码。

With ws1.Range("A1:Z" & UsdRws)
    .autofilter Field:=6, Criteria1:="2*", Operator:=xlFilterValues
    On Error Resume Next

    UsdRws = ws1.Range("C" & Rows.Count).End(xlUp).Row

    If UsdRws > 1 Then
        Range("A2:A" & UsdRws).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    End If
    On Error GoTo 0
    .autofilter Field:=9
    Cells.EntireColumn.AutoFit
End With

即使我有很多以2开头的数字,过滤器也不会改变任何内容。以下是我正在使用的数字样本。

2190190000
1410650400
1410720000
1410511900
1410650000
1410511900
1410650500
1410680100
1410650300
2190160000
1410650100
2190160000
2020110008
1410511900
1410650400
2020110002
2020180000
2010110100
1410671000
2190190000
1410650200
2020180000
2190190000
1410650400
1410720000
1410511900
1410650000
1410511900
1410650500

就像我说的那样,我试图让所有数字从2开始或者所有其他数字开始,但似乎两者都没有效果,即使使用自定义过滤规则手动操作也是如此。

3 个答案:

答案 0 :(得分:1)

在您的With语句中,您使用的是UsdRws,但在“使用”之前不要给UsdRws一个值。这可能导致你的问题吗?

您还可以尝试将数字视为字符串(将格式更改为文本?)。这样Excel就不会被它认为你应该或不应该对数字做的事感到困惑。

答案 1 :(得分:1)

如果您的所有号码都是10位数字,则以下内容似乎有效:

Option Explicit
Sub FilterTwos()
    Dim ws1 As Worksheet
    Dim r As Range

Set ws1 = Worksheets("sheet1")
With ws1
    Set r = .Range("a2", Cells(.Rows.Count, "A").End(xlUp))
End With

ws1.AutoFilterMode = False

r.AutoFilter Field:=1, Criteria1:=">=2000000000", Operator:=xlAnd, _
    Criteria2:="<3000000000"

Set r = r.SpecialCells(xlCellTypeVisible)
r.Copy Worksheets("sheet2").Range("B2")

End Sub

答案 2 :(得分:1)

无论您的数字包含多少位数,这都有效。您的inputRange应该只是包含长号的列,包含标题。

Sub Remove2()
    Dim inputRange As Range
    Dim v As Variant
    Dim i As Long, deleteCount As Long, min As Long

    Set inputRange = Sheet1.Range("A1:A10001")
    v = inputRange.Value
    min = Application.WorksheetFunction.min(inputRange) - 1

    For i = 1 To UBound(v)
        If Left(v(i, 1), 1) = "2" Then
            v(i, 1) = min
            deleteCount = deleteCount + 1
        End If
    Next i

    With inputRange
        .Value = v
        .Sort key1:=.Resize(1, 1), order1:=xlAscending, Header:=xlYes 'xlNo if no headers
        .Resize(deleteCount, 1).Offset(1, 0).EntireRow.Delete 'remove offset if no headers
    End With
End Sub

使用10,000个数字进行测试,耗时0.4秒