我的数据如下:
名称值标记
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
答案 0 :(得分:1)
你需要VBA吗?一个简单的Excel公式可以解决您的问题。
假设您的数据看起来像这样
您需要做的就是创建第4列,并在单元格D2
=SUMPRODUCT((A:A=A2)*(C:C="BuyBack"))
只需将公式自动填充到最后一行即可。现在在D
上过滤col 0
并删除它。
看到这一点。
完成后,删除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
这是宏运行后得到的输出。