如何删除没有任何值的行(使用Excel VBA)?

我正在处理一个Excel VBA脚本来清理一个电子表格(首先我删除空白行,然后我发现/replace一些文本被更多的总结)。

我想删除答辩人没有回答任何调查问题的行。 该行在前几列(A,B,C) 包含一些数据,如IP地址等。调查答案位于列Q3,直到列AC($ Q4到$ AC)。这里是屏幕截图:

在这里输入图像说明

但如果用户没有回答任何调查问题,我想删除该行。

我的VBA脚本在这里:

Sub Main() ReplaceBlanks Multi_FindReplace End Sub Sub ReplaceBlanks() On Error Resume Next Worksheet.Columns("$Q:$AC").SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0 End Sub Sub Multi_FindReplace() 'PURPOSE: Find & Replace a list of text/values throughout entire workbook 'SOURCE: www.TheSpreadsheetGuru.com/the-code-vault Dim sht As Worksheet Dim fndList As Variant Dim rplcList As Variant Dim x As Long fndList = Array("Mostly satisfied", "Completely satisfied", "Not at all satisfied") rplcList = Array("satisfied", "satisfied", "unsatisfied") 'Loop through each item in Array lists For x = LBound(fndList) To UBound(fndList) 'Loop through each worksheet in ActiveWorkbook For Each sht In ActiveWorkbook.Worksheets sht.Cells.Replace What:=fndList(x), Replacement:=rplcList(x), _ LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _ SearchFormat:=False, ReplaceFormat:=False Next sht Next x End Sub 

当我运行这个没有在ReplaceBlanks子程序中的error handling,我得到这个错误消息:

运行时错误“424”:需要的对象

到目前为止,只有第二个子程序工作(即Multi_FindReplace)。 如何修复第一个子程序,以便删除那些没有答复的答案?

更换这一行,

 Worksheet.Columns("$Q:$AC").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 

有了这个,

 Columns("$Q:$AC").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 

要么通过设置要删除的表格,要么只是从Columns开始

你得到的错误是由于它不能识别Columns("$Q:$AC")之前的Worksheet Columns("$Q:$AC")

如果您需要指定要从中删除的工作表,则可以执行此操作。

 Dim ws As Worksheet Set ws = Sheets("Sheet1") ws.Columns("$Q:$AC").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 

甚至这个

 ActiveSheet.Columns("$Q:$AC").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 

并根据注释,如果你有多个空白单元格,你会抛出一个错误,所以如果你有一个行中有多个空白单元格,并且任何空白单元格确定整个行将被删除,这个代码应该为你做。

 Dim ws As Worksheet Dim lastrow As Long Dim rng As Range Set ws = Sheets("Sheet1") lastrow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row For i = 2 To lastrow If WorksheetFunction.CountA(ws.Range(ws.Cells(i, 17), ws.Cells(i, 21))) = 0 Then If Not rng Is Nothing Then Set rng = Union(ws.Cells(i, 1), rng) Else Set rng = ws.Cells(i, 1) End If End If Next i rng.EntireRow.Delete 

我懒惰的方式通常是隐藏非空行,并删除可见的(未testing):

 Cells.SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True Cells.SpecialCells(xlCellTypeVisible).EntireRow.Delete Cells.EntireRow.Hidden = False