VBA:对于每个循环删除空单元格

凑DBO

首先感谢您的帮助。我尝试执行以下代码:遍历工作簿中的不同工作表,在每个工作表的第一列中找到最新的非空单元格并删除空单元格的行。

Sub DeletedBlanks()
Dim ws as Worksheet
Dim i as Integer
Dim lrow as Integer

For Each ws In ThisWorkbook.Worksheets
 lrow = ws.Cells(Rows.Count,1).End(xlUp).Row
 For i = lrow to 1 Step -1
  If Trim(Cells(i,1))="" Then
   Rows(i).EntireRow.Delete
  End If
 Next i 
Next 
End Sub

我不明白为什么它不起作用..为了测试它,我在 3 张纸上创建了 3 个数组,但所有内容都已删除或只是一部分。

谢谢你的帮助。

马修·金东

该过程中存在许多问题,Rubberduck可以警告所有这些问题:

Dim i as Integer
Dim lrow as Integer

Integer是 16 位有符号整数类型,这使得其最大合法值为 2^15-1,即 32,767。问题是,Excel 工作表的行数可能比这多很多倍,因此如果有足够的数据,使用Integer变量来计算工作表的行数将不可避免地变成溢出错误。IntegerDataType检验标志这些声明并提供快速修复将其更改为Long(32位有符号整数)来代替。

但这不是你来到这里的原因。

lrow = ws.Cells(Rows.Count,1).End(xlUp).Row

假设代码位于标准模块而不是工作表模块中,这里Rows.Count将返回ActiveSheet 上的行数通常不是问题,因为通常工作簿中的所有工作表都具有相同的行数。

If Trim(Cells(i,1))="" Then

这是不同的。现在我们正在查看 row 上的一个单元格i,但不在工作ws表上;不合格,Cells隐含地指代任何事物ActiveSheetImplicitActiveSheetReference Rubberduck检查标志,这些隐含合格成员的呼叫。

Rows这里相同

Rows(i).EntireRow.Delete

我们删除的行iActiveSheet,没有ws

正如@FunThomas 在评论中所说:

ws.Trim(Cells(i,1)ws.Rows(i).EntireRow.Delete

这里有一个错字,应该是这样的:

Trim(ws.Cells(i,1)ws.Rows(i).EntireRow.Delete

换句话说,这应该按预期工作:

Sub DeletedBlanks()
    Dim ws as Worksheet
    Dim i as Long
    Dim lrow as Long

    For Each ws In ThisWorkbook.Worksheets
        lrow = ws.Cells(ws.Rows.Count,1).End(xlUp).Row
        For i = lrow to 1 Step -1
            If Trim(ws.Cells(i,1))="" Then
                ws.Rows(i).EntireRow.Delete
            End If
        Next i 
    Next 
End Sub

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章