2017-02-23 61 views
0

我有一個包含9列的數據集。我想檢查每一行以查看最後3列是否爲空。如果所有3個都是空的,我想刪除該行。我目前正試圖在VBA中做到這一點,但我是一個編程新手,發現自己完全不知所措。在Excel中刪除一組3列中的缺失數據

我寫的僞代碼如下:

For Row i 
If(Col 1 & Col 2 & Col 3) = blank 
Then delete Row i 
Move on to next Row 
+0

有如何基於此特定條件刪除行的例子不勝枚舉。 [這個答案](http://stackoverflow.com/q/37011632/4088852)例如在'If'條件下只需要一對'And's。 – Comintern

+0

空字符串是否被視爲「空單元格」?是「空」的單元格的*值*或「空」的任何單元格*實際*空的,即使沒有公式在其中?如何檢查「空」是非常不同的,這取決於你如何澄清「空」的含義。 –

+0

空的含義沒有包含在單元格中。沒有空格,沒有數據,什麼都沒有。 – mathvxn

回答

0

假設你有至少一行是始終填寫,您可以使用以下命令:

Dim LR as Long 
Dim i as Integer 

LR = Cells(Sheets("REF").Rows.Count,1).End(xlUp).Row 

For i = 1 to 9 

If Range(Cells(LR-3,i),(Cells(LR,i)).Value="" Then 

    Columns(i).Delete 
Else: 
End If 
Next i 

該作品通過將最後一行定義爲LR,並將變量定義爲i。您將檢查列「i」以確定列的最後3行是否爲「」,也​​就是說它是空白的;有人可能會嘗試使用ISBLANK(),但不能用於數組。如果這是真的,那麼你將刪除列,我。該代碼然後將移動到下一個我。使用i的FOR LOOP從1開始併到9,這對應於從第1列(A)開始到第9列(I)結束。


編輯:

我似乎都誤讀了這應該是空的,哪些是應該被刪除,在列/行...此代碼將被重新寫成方面:

Dim LR as Long 
Dim i as Integer 

LR = Cells(Sheets("REF").Rows.Count,1).End(xlUp).Row 

For i = LR to 2 Step -1 'Assumes you have headers in Row1 
    If AND(ISBLANK(Cells(i,7)),ISBLANK(Cells(i,8)),ISBLANK(Cells(i,9)) Then 
     Rows(i).Delete 
    End If 
Next i 

的重大變化正在檢查是各行中的最後3個欄都是空的,ISBLANK(),改變的是,如果滿足條件的行被刪除,並通過改變什麼循環。

+1

「Else:」在該代碼中的預期用途是什麼?在一個完全空的'Else'塊之後,你有一個沒有語句的語句分隔符。 – Comintern

+0

也不起作用。這會刪除列,而不是行。 – Comintern

+0

@Comintern我似乎誤讀了哪個項目被刪除。足夠簡單地修復代碼。至於Else:塊,我可以刪除它。我粘貼了一段代碼並修改了它以滿足問題的需要(似乎比爲每行添加4個空格更容易!)。 – Cyril

-1

下面是另一個答案,假設您的最後三列以「G」,「H」,「I」開頭。

Sub DeleteRowWithLastThreeColumnsBlank() 

    Dim N As Long, i As Long 
    N = Cells(Rows.Count, "A").End(xlUp).Row 
    For i = 1 To N 
     If Cells(i, "G").Value = "" And Cells(i, "H").Value = "" And Cells(i, "I").Value = "" Then 
      Rows(i).EntireRow.Delete 
      N = Cells(Rows.Count, "A").End(xlUp).Row 
     End If 
    Next i 

End Sub 
+0

對不起,此代碼不起作用。刪除第一行後,行數會發生什麼變化? – Comintern

1

我會去像如下

Dim iArea As Long 

With Range("E:G") '<--| change "E:G" to your actual last three columns indexes 
    If WorksheetFunction.CountBlank(.Cells) < 3 Then Exit Sub 
    With .SpecialCells(xlCellTypeBlanks) 
     For iArea = .Areas.Count To 1 Step -1 
      If .Areas(iArea).Count Mod 3 = 0 Then .Areas(iArea).EntireRow.Delete 
     Next 
    End With 
End With 
+0

@mathvxn,你通過它嗎? – user3598756

+0

我真的想出了一個使用JMP的解決方案。一旦找到合適的工具,這很簡單! – mathvxn