根据两列标准自动筛选Excel工作表
对不起,如果这是一个常见的问题,但我有点新的Excel-VBA的世界,我一直在find一种方法,正是我所需要的。
我有一个相当大的工作表,需要能够根据两栏中的条件删除行。
下面是一些非常基本的数据来解释我需要做什么…
可乐
- 苹果
- 香蕉
- 苹果
- 苹果
- 橙子
- 葡萄
Col B
- 蓝色
- 红
- 绿色
- 黄色
- 黑色
我需要删除在列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 A
和Column 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