VBA嵌套Do Until循环用于每个循环

时间:2016-12-22 17:05:50

标签: excel vba excel-vba

Do Until语句完美无缺;但是,我无法继续通过第一个工作表。预先感谢您的任何帮助。

Option Explicit
  Sub InsertBlankRow()
    Dim rowCount As Long
    Dim ws As Worksheet

   For Each ws In ThisWorkbook.Worksheets
     rowCount = 2

        With ws

      Do Until IsEmpty(Cells(rowCount + 1, "D"))
         If (Cells(rowCount, "D") <> Cells(rowCount + 1, "D")) Then
            Range(Cells(rowCount + 1, "D"), Cells(rowCount + 2, "D")).EntireRow.Insert Shift:=xlDown
            rowCount = rowCount + 3
        Else
            rowCount = rowCount + 1
        End If
    Loop
    End With
Next ws
End Sub

谢谢大家的回复。使用ws.Cells和ws.Rows导致Do Until语句不起作用。一旦我删除了ws。行可以添加。但它仍然不会遍历所有工作表。

编辑代码以提供我目前正在使用的内容。

2 个答案:

答案 0 :(得分:0)

你正在增加第一张表中的行数,我猜你的下一张表没有比第一张表更多的行。请将您的 rowCount 移到 For Each Loop 中,如下所示:

'rowCount = 2  'set to start row  'REMOVE FROM HERE

For Each ws In ThisWorkbook.Worksheets

    rowCount = 2  'set to start row
    Do Until IsEmpty(Cells(rowCount + 1, "D"))

因此,每个工作表行都将从2开始。还包含评论中建议的所有更改。

答案 1 :(得分:0)

跟踪Scott ^ 2(Holtzman和Craner),你需要引用For Each循环中的所有对象。我更喜欢使用With ws,它会清理并简化您的代码,嵌套在With语句中的所有对象都有.作为前缀(.Cells(rowCount, "D").Rows(rowCount + 1).Insert Shift:=xlDown

此外,在插入两行之前无需选择行(总是更好以避免使用SelectSelection),您可以直接使用.Rows(rowCount + 1).Insert Shift:=xlDown

完整&#34;清洁&#34;代码

Option Explicit

Sub InsertBlankRow()

    Dim rowCount As Long
    Dim ws As Worksheet

    For Each ws In ThisWorkbook.Worksheets
        rowCount = 2  'set to start row

        With ws
            Do Until IsEmpty(.Cells(rowCount + 1, "D"))

                If .Cells(rowCount, "D") <> .Cells(rowCount + 1, "D") Then
                    .Rows(rowCount + 1).Insert Shift:=xlDown
                    .Rows(rowCount + 1).Insert Shift:=xlDown
                    rowCount = rowCount + 3
                Else
                    rowCount = rowCount + 1
                End If
            Loop
        End With
    Next ws

End Sub

额外:如果要在D列中的不同值之间插入2行代码,请使用下面的代码行:

.Range(.Cells(rowCount + 1, "D"), .Cells(rowCount + 2, "D")).EntireRow.Insert Shift:=xlDown