【问题标题】:How do I remove rows that don't have any values ( using Excel VBA )?如何删除没有任何值的行(使用 Excel VBA)?
【发布时间】:2017-01-04 21:53:16
【问题描述】:

我正在编写一个 Excel VBA 脚本来清理电子表格(首先我删除带有空格的行,然后我找到/替换一些文本以进行更多总结)。

我想删除受访者未回答任何调查问题的行。行确实在前几列(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 子例程中没有错误处理的情况下运行此程序时,我会收到以下错误消息:

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

到目前为止,只有第二个子程序有效(即 Multi_FindReplace )。如何修复第一个子例程,以便删除没有响应者答案的行?

【问题讨论】:

  • 为什么都是一行? On Error Resume Next Worksheet.Columns("$Q:$AC").SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0?那应该是三行。 On Error Resume Next // Worksheet.Columns("$Q:$AC").SpecialCells(xlCellTypeBlanks).EntireRow.Delete // On Error GoTo 0 ...另外,取出On Errors,看看你得到了什么错误,这可能会阻碍删除。
  • @BruceWayne - 谢谢,解决了这个问题。好的,我会试试的
  • @BruceWayne - 当我把这些线拿出来时,我明白了 - Run-time error '424': Object required .. 不知道 424 是什么意思。
  • Worksheet.Columns( 是哪里出错了?你是说ActiveSheet

标签: vba excel


【解决方案1】:

替换这一行,

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

有了这个,

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

要么通过设置来说明要从中删除的工作表,要么直接以Columns 开头

您遇到的错误是由于它无法识别您在Columns("$Q:$AC") 之前遇到的Worksheet

如果您需要指定要从中删除的工作表,您可以这样做。

Dim ws As Worksheet

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

甚至这个

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

并且根据 cmets,如果您有多个空白单元格,您将抛出错误,因此如果您在一行中有多个空白单元格,并且任何空白单元格都决定了要删除的整行,此代码应该为您执行此操作.

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2020-10-12
      • 2020-03-22
      • 2013-10-18
      相关资源
      最近更新 更多