2016-12-22 45 views
1

Do Untilステートメントは完全に機能します。しかし、私は最初のワークシートを通過することはできません。助けをありがとうございました。VBAネストされたDo Until Loop For Each Loop

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を削除しました。行を追加することができました。それでも、すべてのワークシートをループしません。

私が現在取り組んでいることを提供するコードを編集しました。

+6

それぞれの 'Cells'リファレンスを' ws'で修飾します。だから 'IsEmpty(ws.Cells(行数+ 1、" D "))など。そうでなければ、コードはマクロが実行されたときにのみActiveSheetを参照します。また、[回避選択](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros)を参照してください。 –

+2

また、 'Rows..'は' wsです。行(rowCount + 1).Select' –

答えて

0

最初のシートの行数が増えていて、次のシートが1枚目と比較してさらに多くの行を持っていないと推測しています。したがって、このように、あなたのrowCountFor 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から開始します。

0

Scott^2(Holtzman and Craner)のフォローアップでは、For Eachループ内のすべてのオブジェクトを参照する必要があります。 With wsを使用し、コードを整理して簡略化します。Withステートメント内にネストされたすべてのオブジェクトの接頭辞は..Cells(rowCount, "D")および.Rows(rowCount + 1).Insert Shift:=xlDown)です。

また、間に2つの行を挿入する前に行を選択する必要はありません(SelectSelectionを使用しない方が良い場合があります)。.Rows(rowCount + 1).Insert Shift:=xlDownを直接使用できます。

全「クリーン」コード

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 

エクストラ

:あなたが1つのコード行と列D内の異なる値の間で2行を挿入したい場合は、以下のコード行を使用します
.Range(.Cells(rowCount + 1, "D"), .Cells(rowCount + 2, "D")).EntireRow.Insert Shift:=xlDown 
+0

ありがとうございました。 –

+0

@ElisabethCurtisようこそ、覚えておいてください –