我有一个长宏,它的末尾有以下内容:
On Error Resume Next
For Each ws In ActiveWorkbook.Worksheets
ws.Activate
Do
If Cells(iRow + 1, iCol) <> Cells(iRow, iCol) Then
Cells(iRow + 1, iCol).EntireRow.Insert Shift:=xlDown
iRow = iRow + 2
Else
iRow = iRow + 1
End If
Loop While Not Cells(iRow, iCol).Text = ""
ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).ClearFormats
Next ws
当B列发生更改(以分隔数据组)时,应该添加一个空白行,然后删除该空白行的格式。
这似乎无法正确遍历所有工作表,因为在更改B列之后仅将第一张工作表更改为包含空白行。这也非常慢。
我希望对此能有所帮助,也许是更快更好的分辨率?
预先感谢您的帮助。
答案 0 :(得分:3)
遍历工作表时,必须使 正 成为参考范围时要添加的工作表参考。否则,任何范围引用都将引用ActiveSheet
所发生的任何事情。
On Error Resume Next
For Each ws In ThisWorkbook.Worksheets
With ws
Do
If .Cells(iRow + 1, iCol) <> .Cells(iRow, iCol) Then
.Cells(iRow + 1, iCol).EntireRow.Insert Shift:=xlDown
iRow = iRow + 2
Else
iRow = iRow + 1
End If
Loop While Not .Cells(iRow, iCol).Text = ""
.UsedRange.SpecialCells(xlCellTypeBlanks).ClearFormats
End With
Next ws
答案 1 :(得分:1)
正如jsheeran所说,您必须在要循环的每个新表上初始化iRow
一种方法是从iCol列中的最后一个非空单元格行向后循环到第二个,这也简化了代码:
For Each ws In ActiveWorkbook.Worksheets
With ws
For iRow = .Cells(.Rows.Count, iCol).End(xlUp) To 2 Step - 1
If .Cells(iRow - 1, iCol) <> .Cells(iRow, iCol) Then .Cells(iRow, iCol).EntireRow.Insert Shift:=xlDown
Next
On Error Resume Next
.UsedRange.SpecialCells(xlCellTypeBlanks).ClearFormats
On Error GoTo 0
End With
Next