根据两列标准自动筛选Excel工作表

对不起,如果这是一个常见的问题,但我有点新的Excel-VBA的世界,我一直在find一种方法,正是我所需要的。

我有一个相当大的工作表,需要能够根据两栏中的条件删除行。

下面是一些非常基本的数据来解释我需要做什么…

可乐

  1. 苹果
  2. 香蕉
  3. 苹果
  4. 苹果
  5. 橙子
  6. 葡萄

Col B

  1. 蓝色
  2. 绿色
  3. 黄色
  4. 黑色

我需要删除在列A中有一个重复的值和列B在它旁边的一个空白值的任何行。所以,在上面的示例数据我想删除行4,因为它有一个重复的值(苹果)和Col B中的空白值

显然在这个例子中,我可以很容易地手动删除该行。 但实际的工作表包含10,000行,列A中的数据将是URL而不是简单的水果!

我已经看过使用过滤,但不能find一个好的(快速)方法来实现我所需要的结果。 所以我认为它必须是Excel VBA,但我很乐意被certificate是错误的。 如果VBA是要走的路,有没有人有一个例程,我可以使用/适应? 我发现了一些将删除重复项和几个将删除空白。 但我真的很努力地结合起来,所以任何帮助将不胜感激。

谢谢。

试试下面的代码:

Sub DeleteBlankDuplicate() Dim current As String ActiveSheet.Range("A1").Activate Do While ActiveCell.Value <> "" current = ActiveCell.Address ActiveCell.Offset(1, 0).Activate Do While ActiveCell.Value <> "" If ((ActiveSheet.Range(current).Value = ActiveCell.Value) And ActiveCell.Offset(0, 1).Value = "") Then ActiveSheet.Rows(ActiveCell.Row).Delete Else ActiveCell.Offset(1, 0).Activate End If Loop ActiveSheet.Range(current).Offset(1, 0).Activate Loop End Sub 

您还没有提及是否还想删除Column AColumn B具有相同值的行。 因此,如果要删除列A和列B或列B中具有重复值的行为空白的行,请将上面的代码中的IF条件replace为以下代码:

 If ((ActiveSheet.Range(current).Value = ActiveCell.Value) And (ActiveSheet.Range(current).Offset(0, 1).Value = ActiveCell.Offset(0, 1).Value) Or ActiveCell.Offset(0, 1).Value = "") Then 

我为你在OP中给出的例子编写了代码。 您可以根据您的要求编辑代码。 请在尝试此操作之前备份原始文件,因为它会删除行。

  Sub RemoveData() Dim LastRow, Filtred_Rows_Count As Long Sheets("Sheet1").Select If ActiveSheet.AutoFilterMode = True Then ActiveSheet.AutoFilterMode = False LastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row Set Rng = Range("A1:B" & LastRow) Range("A1:A" & LastRow).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("J1"), Unique:=True For Each c In Range([J2], Cells(Rows.Count, "J").End(xlUp)) With Rng .AutoFilter .AutoFilter Field:=1, Criteria1:=c.Value Filtred_Rows_Count = Intersect(Columns(1), ActiveSheet.UsedRange).SpecialCells(xlCellTypeVisible).Count If Filtred_Rows_Count > 2 Then .AutoFilter Field:=2, Criteria1:="" ActiveSheet.Range("A1:B" & LastRow).Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If End With ActiveSheet.ShowAllData Next If ActiveSheet.AutoFilterMode = True Then ActiveSheet.AutoFilterMode = False Columns("J:J").EntireColumn.Delete End Sub