遍历所有工作表问题

时间:2018-10-31 16:33:59

标签: excel vba excel-vba

我有一个长宏,它的末尾有以下内容:

        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列之后仅将第一张工作表更改为包含空白行。这也非常慢。

我希望对此能有所帮助,也许是更快更好的分辨率?

预先感谢您的帮助。

2 个答案:

答案 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