Excel VBA AutoFilter Array错误

时间:2013-11-20 21:00:13

标签: arrays excel-vba autofilter vba excel

我的数据如下:

名称值标记

Alice 5 BUYBACK

Bob 8 Jump

Dan 9

Alice 1

Alice 6 Jump

Dan 0 BUYBACK

Bob 8 Jump

如果对于任何名称,在任何记录中,如果存在“回购”,则在“标记”字段中,我希望保留与该名称关联的所有记录。 Alice有3条记录,其中一条是BUYBACK,所以我想保留所有ALice的记录。 Dan在其中一个中有一个回购,所以我想保留Dan的两个记录,而Bob的记录都被删除。

当我尝试在下面执行此操作时,我的AutoFilter中出现错误。错误显示“需要对象”。我似乎无法弄清楚出了什么问题。

 n = 1

     Dim BBK_Array() As Variant

     For j = 1 To FinalRow

        If Cells(j, 3).Value = "BUYBACK" Then
            If n = 1 Then
                 ReDim Preserve BBK_Array(1 To n)
                 BBK_Array(n) = Cells(j, 1).Value
                 n = n + 1

            ElseIf BBK_Array(n - 1) <> Cells(j, 1).Value Then
                    ReDim Preserve BBK_Array(1 To n)
                    BBK_Array(n) = Cells(j, 1).Value
                    n = n + 1

            End If


        End If
     Next j




     ActiveWorksheet.UsedRange.AutoFilter Field:=1, Criteria1:=BBK_Array(), Operator:=xlFilterValues

编辑:

当我这样做时,它起作用了。我不知道为什么:

     ActiveWorkbook.Activesheet.UsedRange.AutoFilter Field:=1, Criteria1:=BBK_Array(), Operator:=xlFilterValues

1 个答案:

答案 0 :(得分:1)

你需要VBA吗?一个简单的Excel公式可以解决您的问题。

假设您的数据看起来像这样

enter image description here

您需要做的就是创建第4列,并在单元格D2

中输入公式

=SUMPRODUCT((A:A=A2)*(C:C="BuyBack"))

只需将公式自动填充到最后一行即可。现在在D上过滤col 0并删除它。

enter image description here

看到这一点。

enter image description here

完成后,删除col D

如果您仍想要VBA解决方案,请录制宏并按照上述步骤进行修改,以便根据您的需要进行修改。这将是9行代码(包括声明)

这是一个例子

Sub Sample()
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
    Dim lRow As Long: lRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

    ws.Range("D2:D" & lRow).Formula = "=SUMPRODUCT((A:A=A2)*(C:C=""BuyBack""))"
    ws.Range("D2:D" & lRow).Value = ws.Range("D2:D" & lRow).Value

    ws.AutoFilterMode = False
    ws.Range("D2:D" & lRow).AutoFilter Field:=1, Criteria1:="=0"
    ws.Range("D2:D" & lRow).Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    ws.AutoFilterMode = False

    ws.Columns(4).Delete
End Sub

这是宏运行后得到的输出。

enter image description here