AutoFilter返回正确的结果,但当SpecialCells(xlCellTypeVisible).value时,excel仅返回记录的一半

AutoFilter返回正确的结果,但当SpecialCells(xlCellTypeVisible).value时,excel仅返回记录的一半,excel,excel-2013,vba,Excel,Excel 2013,Vba,这是我的密码 openWs.AutoFilterMode = False Range("A1").AutoFilter Field:=1, Criteria1:= _ ">=" & date1, Operator:=xlAnd, Criteria2:="<=" & date2 Range("A1").AutoFilter Field:=4, VisibleDropDown:=False Range("A1").AutoFilter Field:=5, VisibleD

这是我的密码

openWs.AutoFilterMode = False
Range("A1").AutoFilter Field:=1, Criteria1:= _
">=" & date1, Operator:=xlAnd, Criteria2:="<=" & date2
Range("A1").AutoFilter Field:=4, VisibleDropDown:=False
Range("A1").AutoFilter Field:=5, VisibleDropDown:=False
Range("A1").AutoFilter Field:=6, VisibleDropDown:=False
Range("A1").AutoFilter Field:=7, VisibleDropDown:=False
Range("A1").AutoFilter Field:=8, VisibleDropDown:=False
cnt = ActiveSheet.UsedRange.Rows.count
arr() = openWs.Range("A2:H" & cnt).Rows.SpecialCells(xlCellTypeVisible).Value 'Supplier
我做错什么了吗?我以为excel会自动返回筛选后可见的所有内容,但它似乎仍然应用相同的筛选?有什么想法吗

更新1 应用Siddharth Rout代码后的更多示例数据

CP0001  20130103    I/TAX - 12TH INST YA2012    13012000    PR  -180000 0
CP0001  20130103    I/TAX - 12TH INST YA2012    13014000    PPR 180000  0
HH2000  20130102    7324/01/13  13006000    CN  -100000 -639442350.6
HH2000  20130102    7325/01/13  13002001    DN  1500000 -639442350.6
HH2000  20130103    7326/01/13  13006002    CN  -17000000   -639442350.6
HH2000  20130103    7348/01/13  13006024    CN  -3000000    -639442350.6
HH2000  20130104    7327/01/13  13006003    CN  -10000000   -639442350.6
HH2000  20130104    7328/01/13  13006004    CN  -10000000   -639442350.6
HH2000  20130104    7329/01/13  13006005    CN  -500000 -639442350.6
HH2000  20130104    7330/01/13  13006006    CN  -1500000    -639442350.6
HH2000  20130104    7331/01/13  13006007    CN  -1000000    -639442350.6
HH2000  20130104    7332/01/13  13006008    CN  -3000000    -639442350.6
HH2000  20130104    7333/01/13  13006009    CN  -135000 -639442350.6
HH2000  20130104    7334/01/13  13006010    CN  -5000000    -639442350.6
HH2000  20130104    7335/01/13  13006011    CN  -31099000   -639442350.6
HH2000  20130104    7336/01/13  13006012    CN  -7000   -639442350.6
HH2000  20130104    7337/01/13  13006013    CN  -5000   -639442350.6
HH2000  20130104    7338/01/13  13006014    CN  -700000 -639442350.6
HH2000  20130104    7339/01/13  13006015    CN  -250000 -639442350.6
HH2000  20130107    7341/01/13  13006017    CN  -4563000    -639442350.6
HH2000  20130107    7343/01/13  13006019    CN  -1800000    -639442350.6
HH2000  20130107    7344/01/13  13002020    DN  800000  -639442350.6
HH2000  20130107    7345/01/13  13002021    DN  900000  -639442350.6
HH2000  20130107    7346/01/13  13002022    DN  1200000 -639442350.6 //it stop here, below all ignore by excel
HH2030  20130104    7338/01/13  13002014    DN  700000  5318670.54
HH2100  20130104    7340/01/13  13006016    CN  -300000 118968559.6
HH2100  20130107    7342/01/13  13006018    CN  -980000 118968559.6
HH2101  20130107    7347/01/13  13006023    CN  -300000 -12587577.27

除了我的评论,试试这个。这对我有用

编辑:为了避免混淆,下面提到的@mehow是绝对正确的。以下只是一个示例数据。当您实际处理必须应用自动筛选的数据时,请使用第一行中的标题,然后使用
.Offset(1,0).SpecialCells(xlCellTypeVisible)
获取筛选后的数据,如图所示

代码:

Sub Sample()
    Dim openWs As Worksheet
    Dim rng As Range, VisbRange As Range
    Dim lRow As Long, date1  as Long, date2 as Long
    Set openWs = ThisWorkbook.Sheets("Sheet1")

    date1 = 20130101
    date2 = 20130107

    With openWs
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lRow = .Cells.Find(What:="*", _
                          After:=.Range("A1"), _
                          Lookat:=xlPart, _
                          LookIn:=xlFormulas, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Row
        Else
            lRow = 1
        End If

        Set rng = .Range("A1:H" & lRow)

        .AutoFilterMode = False

        With rng

            .AutoFilter Field:=1, Criteria1:= _
            ">=" & date1, Operator:=xlAnd, Criteria2:="<=" & date2

            .AutoFilter Field:=4, VisibleDropDown:=False
            .AutoFilter Field:=5, VisibleDropDown:=False
            .AutoFilter Field:=6, VisibleDropDown:=False
            .AutoFilter Field:=7, VisibleDropDown:=False
            .AutoFilter Field:=8, VisibleDropDown:=False

            Set VisbRange = .Rows.SpecialCells(xlCellTypeVisible)
            Debug.Print VisbRange.Address
        End With

        .AutoFilterMode = False
    End With
End Sub
子样本()
将openWs设置为工作表
变暗rng作为范围,变暗rng作为范围
变暗lRow为长,日期1为长,日期2为长
设置openWs=ThisWorkbook.Sheets(“Sheet1”)
日期1=20130101
日期2=20130107
使用openWs
如果Application.WorksheetFunction.CountA(.Cells)为0,则
lRow=.Cells.Find(内容:=“*”_
之后:=.范围(“A1”)_
看:=xlPart_
LookIn:=xl公式_
搜索顺序:=xlByRows_
搜索方向:=xlPrevious_
MatchCase:=False)。行
其他的
lRow=1
如果结束
设置rng=.Range(“A1:H”和lRow)
.AutoFilterMode=False
带rng
.自动筛选字段:=1,标准1:=_

“>=”&date1,运算符:=xlAnd,准则2:=”&date1,运算符:=xlAnd,准则2:=“快速构思-可能第1列中的数据未被识别为日期值?…izzit I已在openWs.Range(“A2:H”&cnt”)启动?excel自动筛选正确,但vba在找到date2
Range(“A1”)后停止进入下一行.AutoFilter
?它不应该是
范围(“A1:H”&cnt)。AutoFilter字段:=…
仅使用A1时,自动筛选工作正常,不知道为什么,唯一的问题来自于arr()没有存储完整的筛选数据,它只会在与日期2匹配的任何数据处停止,然后它将不会继续读取下一行
自动筛选工作正常,只需A1
在数据之间插入一行或几行空行。它仍然有效吗?顺便说一句,您一直将
20130107
作为日期。这不是有效的da这仅仅是一个数字。除非您有一个格式为
yyyymmdd
yyyydmm
+1的日期来解决这个问题,但对标题应用自动筛选并不能消除标题被过滤?您所说的是绝对正确的,因此在应用自动筛选时应该始终有一个标题我刚刚创建了一个例子来说明为什么在对一个范围设置自动筛选之前定义完整的范围是很重要的。恭喜40K!这就是amazing@Se0ng11:啊,我知道你在尝试什么。你不能在数组中存储这样的非连续范围。如果你这样做,它将存储范围的第一个区域的值在你的情况下,ch是24。让我向你展示如何实现你想要的。不;)在30秒后刷新页面并查看更新的解决方案。
Sub Sample()
    Dim openWs As Worksheet
    Dim rng As Range, VisbRange As Range
    Dim lRow As Long, date1  as Long, date2 as Long
    Set openWs = ThisWorkbook.Sheets("Sheet1")

    date1 = 20130101
    date2 = 20130107

    With openWs
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lRow = .Cells.Find(What:="*", _
                          After:=.Range("A1"), _
                          Lookat:=xlPart, _
                          LookIn:=xlFormulas, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Row
        Else
            lRow = 1
        End If

        Set rng = .Range("A1:H" & lRow)

        .AutoFilterMode = False

        With rng

            .AutoFilter Field:=1, Criteria1:= _
            ">=" & date1, Operator:=xlAnd, Criteria2:="<=" & date2

            .AutoFilter Field:=4, VisibleDropDown:=False
            .AutoFilter Field:=5, VisibleDropDown:=False
            .AutoFilter Field:=6, VisibleDropDown:=False
            .AutoFilter Field:=7, VisibleDropDown:=False
            .AutoFilter Field:=8, VisibleDropDown:=False

            Set VisbRange = .Rows.SpecialCells(xlCellTypeVisible)
            Debug.Print VisbRange.Address
        End With

        .AutoFilterMode = False
    End With
End Sub
Sub Sample()
    Dim openWs As Worksheet, tmpSheet As Worksheet
    Dim rng As Range, VisbRange As Range
    Dim lRow As Long, date1  As Long, date2 As Long
    Dim Arr

    Set openWs = ThisWorkbook.Sheets("Sheet1")

    date1 = 20130101
    date2 = 20130107

    With openWs
        If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
            lRow = .Cells.Find(What:="*", _
                          After:=.Range("A1"), _
                          Lookat:=xlPart, _
                          LookIn:=xlFormulas, _
                          SearchOrder:=xlByRows, _
                          SearchDirection:=xlPrevious, _
                          MatchCase:=False).Row
        Else
            lRow = 1
        End If

        Set rng = .Range("A1:F" & lRow)

        .AutoFilterMode = False

        With rng

            .AutoFilter Field:=1, Criteria1:= _
            ">=" & date1, Operator:=xlAnd, Criteria2:="<=" & date2

            .AutoFilter Field:=4, VisibleDropDown:=False
            .AutoFilter Field:=5, VisibleDropDown:=False
            .AutoFilter Field:=6, VisibleDropDown:=False

            Set VisbRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow

            Set tmpSheet = ThisWorkbook.Sheets.Add

            VisbRange.Copy tmpSheet.Rows(1)

            With tmpSheet
                lRow = .Range("A" & .Rows.Count).End(xlUp).Row

                Arr = .Range("A1:H" & lRow).Value
            End With

            On Error Resume Next
            Application.DisplayAlerts = False
            tmpSheet.Delete
            Application.DisplayAlerts = True
            On Error GoTo 0
        End With

        .AutoFilterMode = False
    End With
End Sub