首先感谢您的帮助。我尝试执行以下代码:遍历工作簿中的不同工作表,在每个工作表的第一列中找到最新的非空单元格并删除空单元格的行。
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
也隐含地指代任何事物ActiveSheet
。该ImplicitActiveSheetReference Rubberduck检查标志,这些隐含合格成员的呼叫。
与Rows
这里相同:
Rows(i).EntireRow.Delete
我们删除的行i
上ActiveSheet
,没有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] 删除。
我来说两句