使用VBA删除Excel表中的空行

使用VBA删除Excel表中的空行,excel,row,vba,Excel,Row,Vba,我试图运行一个代码,在整行没有数据的情况下删除行。我目前正在使用下面的代码,但即使一个单元格为空,它也会删除行。我想我需要使用intersect函数,但还不确定如何使用 Dim Rng As Range Dim MainSheet As Worksheet Set MainSheet = Sheet9 MainSheet.Select On Error Resume Next Set Rng = MainSheet.Range("table3")

我试图运行一个代码,在整行没有数据的情况下删除行。我目前正在使用下面的代码,但即使一个单元格为空,它也会删除行。我想我需要使用intersect函数,但还不确定如何使用

    Dim Rng As Range
    Dim MainSheet As Worksheet
    Set MainSheet = Sheet9
    MainSheet.Select

    On Error Resume Next
    Set Rng = MainSheet.Range("table3").SpecialCells(xlCellTypeBlanks)

    On Error Resume Next
    If Not Rng Is Nothing Then
       Rng.Delete Shift:=xlUp
    End If

这完全取决于你所说的空是什么意思。我注意到您使用的是
xlcelltypebanks
,因此如果您想继续使用range属性,那么您可以将行的单元格计数与
SpecialCells
单元格计数进行比较-如果它们匹配,则您有一个“空”行

还有很多其他方法可以做到这一点,但我不知道有哪种方法不需要迭代表中的每一行。假设您想走
SpecialCells
路线,您的迭代可能是这样的:

Dim lo As ListObject
Dim lRow As ListRow
Dim rng As Range
Dim delRows As Collection

Set lo = Sheet1.ListObjects("Table1") 'change to your table name
On Error Resume Next
For Each lRow In lo.ListRows
    Set rng = Nothing
    Set rng = lRow.Range.SpecialCells(xlCellTypeBlanks)
    If Not rng Is Nothing Then
        If rng.Count = lRow.Range.Cells.Count Then
            If delRows Is Nothing Then
                Set delRows = New Collection
                delRows.Add lRow
            Else
                delRows.Add lRow, Before:=1
            End If
        End If
    End If
Next
On Error GoTo 0

If Not delRows Is Nothing Then
    For Each lRow In delRows
        lRow.Delete
    Next
End If

这是另一种解决方案,但应以错误的形式考虑,因为它在删除行时实际上改变了表计数。这就是糟糕的编程实践

此外,如果有嵌入的空格,它也不会捕捉它们。仅供参考,我使用表1而不是表9进行调试

从好的方面来说,它更简洁(不管它值多少钱)

还有一些VBA的怪癖,我并不完全理解。例如,如果用它的表达式替换find命令中的“RNG”,你会得到一个错误,除非有人知道这是有道理的,否则我会考虑反直觉。p>
Sub DeleteEmptyTableRows()
    Dim MainSheet As Worksheet
    Dim tabRng As Range, rng As Range, found As Range
    Dim row As Integer

    Set MainSheet = Sheet1
    MainSheet.Select

    Set tabRng = MainSheet.Range("table3")

    row = 1
    Do While row < tabRng.Rows.Count + 1:
      Set rng = tabRng.Rows(row)
      Set found = rng.Find("*", rng.Cells(, 1), SearchDirection:=xlPrevious)
      If found Is Nothing Then
         tabRng.Rows(row).EntireRow.Delete Shift:=xlUp
      Else
         row = row + 1
      End If
    Loop
End Sub
Sub-DeleteEmptyTableRows()
将主工作表调整为工作表
尺寸标签rng As Range、rng As Range、FIND As Range
将行设置为整数
设置主图纸=图纸1
主工作表。选择
设置tabRng=MainSheet.Range(“表3”)
行=1
行
如果你发现任何错误,请告诉我。除了不删除有空格的条目外,它还适用于我使用的任何测试数据