Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 尝试筛选长数字时出现问题_Vba_Excel - Fatal编程技术网

Vba 尝试筛选长数字时出现问题

Vba 尝试筛选长数字时出现问题,vba,excel,Vba,Excel,我有一个列,里面有很多较长的数字。我想筛选我的列中所有不以2开头的数字。我试着用代码来选择所有的2的第一个,但并没有成功。然后我试着在Excel中手工完成,说过滤器,自定义规则,不是以2开头的。但一切都没有改变。例如,我看不到数字前面有零。我试图将它们重新格式化为数字,但它们已经是数字了。我不知道为什么它没有选择所有以2开头的数字或所有不以2开头的数字 下面是我试图获取以2开头的数字的代码 With ws1.Range("A1:Z" & UsdRws) .autofilter F

我有一个列,里面有很多较长的数字。我想筛选我的列中所有不以2开头的数字。我试着用代码来选择所有的2的第一个,但并没有成功。然后我试着在Excel中手工完成,说过滤器,自定义规则,不是以2开头的。但一切都没有改变。例如,我看不到数字前面有零。我试图将它们重新格式化为数字,但它们已经是数字了。我不知道为什么它没有选择所有以2开头的数字或所有不以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开头的所有数字或所有其他数字,但这两个数字似乎都不起作用,即使是使用自定义筛选规则手动操作。

在with语句中,您使用UsdRws,但在“with”中才给UsdRws一个值。这可能是你的问题吗


您还可以尝试将数字视为字符串(将格式更改为文本?)。这样,Excel就不会被它认为您应该或不应该处理数字的方式所迷惑。

在with语句中,您使用UsdRws,但在“with”范围内之前不要给UsdRws赋值。这可能是你的问题吗


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

如果你所有的数字都是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
选项显式
子过滤器WOS()
将ws1设置为工作表
调光范围
设置ws1=工作表(“表1”)
使用ws1
设置r=.Range(“a2”,单元格(.Rows.Count,“A”)。结束(xlUp))
以
ws1.AutoFilterMode=False
r、 自动筛选字段:=1,准则1:=“>=2000000000”,运算符:=xlAnd_

标准2:=“如果您的所有数字都是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
选项显式
子过滤器WOS()
将ws1设置为工作表
调光范围
设置ws1=工作表(“表1”)
使用ws1
设置r=.Range(“a2”,单元格(.Rows.Count,“A”)。结束(xlUp))
以
ws1.AutoFilterMode=False
r、 自动筛选字段:=1,准则1:=“>=2000000000”,运算符:=xlAnd_

标准2:=“无论数字包含多少位数,此选项都有效。您的
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

使用10000个数字进行测试,测试时间为0.4秒

无论数字包含多少位数,此功能都有效。您的
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


测试10000个数字需要0.4秒

看起来我可以使用大于2000000000的数字来获得以2开头的数字,但我不希望这样做,因为还有比我不想要的数字更高的数字。最简单的方法是有一个helper列并过滤该列上的数据。“以“2”开头”是指字符串,而不是数字。为公式(或
=“'”&A2
)制作另一列
=TEXT(A2,“@”)
),填写并筛选该列。筛选时间>=2000000和<3000000。(使用宏记录器向我显示,这可以作为
Criteria1:=“>=20000000000”,运算符:=xlAnd,Criteria2:=“Meh,@cyboashu在我之前整整两分钟就有了这个想法:)看起来我可以使用大于2000000000来获取以2开头的数字,但我不希望这样做,因为还有比我不想要的数字更高的数字。最简单的方法是使用一个helper列并过滤该列上的数据。”以“2”开头“是指
字符串,而不是数字。为公式(或
=“'”&A2
)制作另一列
=TEXT(A2,“@”)
),填写并筛选该列。筛选时间>=2000000和<3000000。(使用宏记录器向我显示,这可以作为
Criteria1:=“>=20000000000”,运算符:=xlAnd,Criteria2:=“Meh,@cyboashu在我之前整整两分钟就有了这个想法:)我的UsdRws被声明为更高一点对不起。但是其他人建议这是因为它是一个像你提到的字符串,我认为这可能有道理。我的UsdRws被声明为更高一点对不起。但是其他人建议这是因为它是一个像你提到的字符串,我认为这可能有道理。我没有我不完全使用此代码,但在这些数字之间进行过滤的想法确实对我有用。感谢您将整个代码写出来。另一个答案是将列复制到文本中,然后使用此代码进行过滤。但我认为在这些数字之间进行过滤实际上会更容易。很高兴提供帮助。如果数字长度不相等,则简单的过滤器不起作用,尽管你可以使用高级过滤器。我没有完全使用此代码,但在这些数字之间进行过滤的想法对我来说确实有效。谢谢你将整个代码写出来。另一个答案是将列复制到文本中,然后使用它进行过滤。但我认为在这些数字之间进行过滤将是一个不错的选择实际上更简单。很高兴提供帮助。如果数字长度不相等,那么简单的过滤器将不起作用,尽管您可以使用高级过滤器谢谢您的时间。这是一个非常有趣的方法。我最终没有使用此方法,但我将在将来记住它。感谢您的帮助和时间。没问题,它特别有用恩,你有更复杂的标准。例如,如果你的一些数字不是10位数(其他人也注意到了这一点),那么其他人建议的过滤就不会起作用。谢谢你的时间。这是一个非常有趣的方法。我最终没有使用这个方法,但我会在将来记住它。