我正在尝试运行代码以在整行没有数据时删除行。我目前正在使用下面的代码,但即使一个单元格为空,它也会删除行。我想我需要使用交叉函数,但不知道如何使用。
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
答案 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
如果您发现任何错误,请告诉我们。除了不删除其中包含空白的条目外,它适用于我使用的任何测试数据。