2016-05-17 142 views
1

對不起,如果這是一個常見問題,但我對Excel-VBA的世界有點新鮮,而且我一直無法找到一種正確的方法我需要。根據兩列條件自動篩選Excel表單

我有一個相當大的工作表,需要能夠根據兩欄中的條件刪除行。

下面是一些非常基本的數據來解釋什麼,我需要做的......

柱A

  1. 蘋果
  2. 香蕉
  3. 蘋果
  4. 蘋果
  5. 橙色
  6. 葡萄

色柱B

  1. 綠色
  2. 黑色

我需要刪除列A中有重複值和列B中空白值的任何行。因此,在上面的示例數據中,我想刪除第4行,因爲它具有重複值(Apple)列A和列B的空白值。

很明顯,在示例中,我可以輕鬆地手動刪除該行。但實際的工作表包含10,000行,列A中的數據將是URL而不是簡單的水果!

我已經看過使用過濾,但不能找出一個很好的(快速)方法來實現我需要的結果。所以我認爲它必須是Excel VBA,但我很樂意被證明是錯誤的。如果VBA是要走的路,有沒有人有我可以使用/適應的例程?我發現了一些會刪除重複項以及一些會刪除空白項的項。但我真的很努力地結合他們,所以任何幫助將不勝感激。

謝謝。

+0

感謝Mrig&J.B. – User90475

回答

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 
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