在Excel中删除一组3列中的缺失数据

问题描述:

我有一个包含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

假设你有至少一行是始终填写,您可以使用以下命令:

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

下面是另一个答案,假设您的最后三列以“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

我会去像如下

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