根据两列

时间:2016-05-17 09:38:48

标签: excel excel-vba vba

很抱歉,如果这是一个常见的问题,但我对Excel-VBA的世界有点新意,而且我一直无法找到完全符合我需要的方法。

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

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

Col A

  1. 苹果
  2. 香蕉
  3. 苹果
  4. 苹果
  5. 葡萄
  6. Col B

    1. 红色
    2. 绿色
    3. 黄色
    4. 黑色
    5. 我需要删除Col A中存在重复值的行以及Col B中旁边的空白值。因此,在上面的示例数据中,我想删除第4行,因为它具有重复值(Apple)在Col A中,在Col B中为空白值。

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

      我已经看过使用过滤,但无法找到一个好的(快速)方法来实现我需要的结果。所以我认为它必须是Excel VBA,但我很高兴被证明是错的。如果VBA是要走的路,有没有人有我可以使用/适应的例程?我发现了一些将删除重复项和一些将删除空白的重复项。但我真的很难将它们结合起来,所以任何帮助都会受到高度赞赏。

      感谢。

2 个答案:

答案 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 AColumn 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