使用VBA

时间:2017-01-25 03:23:00

标签: excel excel-vba row vba

我正在尝试运行代码以在整行没有数据时删除行。我目前正在使用下面的代码,但即使一个单元格为空,它也会删除行。我想我需要使用交叉函数,但不知道如何使用。

    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

2 个答案:

答案 0 :(得分:0)

这真的完全取决于你的意思。我注意到您正在使用xlCellTypeBlanks,因此如果您想继续使用该范围属性,那么您可以将行的细胞计数与您的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 :(得分:0)

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

如果有嵌入的空白,它也不会捕获它们。仅供参考我使用Sheet 1而不是Sheet 9进行调试。

从好的方面来说,它更简洁(对于任何可能值得的东西)。

还有一些我不太欣赏的VBA怪癖。例如,如果你用它的表达式替换find命令中的'rng',你会得到一个我认为反直觉的错误,除非有人知道为什么这个有意义。

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

如果您发现任何错误,请告诉我们。除了不删除其中包含空白的条目外,它适用于我使用的任何测试数据。