很抱歉,如果这是一个常见的问题,但我对Excel-VBA的世界有点新意,而且我一直无法找到完全符合我需要的方法。
我有一张相当大的工作表,需要能够根据两列条件删除行。
下面是一些非常基本的数据来解释我需要做什么......
Col A
Col B
我需要删除Col A中存在重复值的行以及Col B中旁边的空白值。因此,在上面的示例数据中,我想删除第4行,因为它具有重复值(Apple)在Col A中,在Col B中为空白值。
显然在示例中我可以轻松地手动删除该行。但实际工作表包含10,000行,而A列中的数据将是URL而不是简单的简单水果!
我已经看过使用过滤,但无法找到一个好的(快速)方法来实现我需要的结果。所以我认为它必须是Excel VBA,但我很高兴被证明是错的。如果VBA是要走的路,有没有人有我可以使用/适应的例程?我发现了一些将删除重复项和一些将删除空白的重复项。但我真的很难将它们结合起来,所以任何帮助都会受到高度赞赏。
感谢。
答案 0 :(得分:0)
我为你在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
答案 1 :(得分:0)
请尝试以下代码:
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
条件替换为以下内容:
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