質問: i+1 Loop Next ### 補足情報(言語/FW/ツール等のバージョンなど) Excel2010 、win7
回答: 今回の処理を行う場合、以下が前提になると思いますが認識あってますでしょうか? ・実行前シートのA列先頭2桁をキーとして判定をする ・欠番が判定できることから、キー2桁は最低が「00」、最大が「99」である あと欠番の自動作成の部分について、 ・実行後シートには実行前シートの先頭キー番号~最終キー番号(例では「01」~「05」の5行)のデータが作成される。 ⇒前行のデータから自動作成するのは番号が飛んだ時だけで、最終データ以降の欠番は作成しない という認識ですがあってますでしょうか? 以上を前提として改修方針を説明します。 全体の流れは ``` 1キー退避変数の作成・初期化を行う 2実行前シートのデータ行をループ処理 (行ループここから) 3処理行のA列セルからキー値(先頭2桁)を取得 4キー値の判定 4-a キー値が退避変数と同じ場合 ⇒ 4-a-1 次の行へスキップ 4-b キー値が退避変数+1の場合 ⇒ 4-b-1 今回行の内容を実行後シートに出力 4-b-1 退避変数に今回のキー値をセット 4-c キー値が退避変数+1でない場合 ⇒ 4-c-1 退避変数+1からキー値-1まで欠番を補うループ処理 (欠番ループここから) 4-c-2 前行の内容で実行後シートに出力 (欠番ループここまで) 4-c-3 今回行の内容を実行後シートに出力 4-c-4 退避変数に今回のキー値をセット (行ループここまで) 5処理終了 ``` 条件分岐があって少しわかりずらいですが、こんな流れになると思います。 これをコードに落とすと以下のようになります。 ``` Sub test() Dim iKey As Integer '今回のキー値 Dim iKey_Bk As Integer '前回のキー値 iKey_Bk = -1 '初期化 Dim iRowR As Long '読込行 Dim iRowW As Long '出力行 Dim iLoop As Long '欠番ループカウンタ iRowW = 2 With Sheets("元シート") For iRowR = 2 To .Cells(Rows.Count, 1).End(xlUp).Row 'キー値を取得 iKey = CInt(Left(.Cells(iRowR, 1), 2)) If iKey = iKey_Bk Then '前回と同じキーなら処理しない ElseIf iKey_Bk = -1 Or (iKey = iKey_Bk + 1) Then '初回、もしくは前回キー+1の場合はコピー処理 Sheets("別シート").Cells(iRowW, 1) = Format(iKey, "00") Sheets("別シート").Cells(iRowW, 2) = .Cells(iRowR, 2) Sheets("別シート").Cells(iRowW, 3) = .Cells(iRowR, 3) '出力行を進める iRowW = iRowW + 1 'キーを退避 iKey_Bk = iKey Else '前回キー+1でない場合は欠番作成 For iLoop = iKey_Bk + 1 To iKey - 1 '前行と同じ値でコピー処理 iKey_Bk = iKey_Bk + 1 Sheets("別シート").Cells(iRowW, 1) = Format(iKey_Bk, "00") Sheets("別シート").Cells(iRowW, 2) = Sheets("別シート").Cells(iRowW - 1, 2) Sheets("別シート").Cells(iRowW, 3) = Sheets("別シート").Cells(iRowW - 1, 3) '出力行を進める iRowW = iRowW + 1 Next iLoop '今回キーのコピー処理 Sheets("別シート").Cells(iRowW, 1) = Format(iKey, "00") Sheets("別シート").Cells(iRowW, 2) = .Cells(iRowR, 2) Sheets("別シート").Cells(iRowW, 3) = .Cells(iRowR, 3) '出力行を進める iRowW = iRowW + 1 'キーを退避 iKey_Bk = iKey End If Next End With End Sub ``` 今回は元シートの行数分ループして欠番を判定しましたが、 1先頭キー番号と最終キー番号をあらかじめ取得する 2先頭キー番号~最終キー番号までをループする 3処理中のキー番号(先頭行)を元シートから検索し、見つけた行からコピーする という方法でも実現できると思います。 この場合、出力する行数分しかループしないのでループ回数は減りますが、検索する分処理が重くなりそうです(^-^; ここで伝えたかったのは、実装方法は一つではないので用途に応じて使い分けましょう、ということです。 参考になれば幸いです。