- ベストアンサー
エクセルマクロ繰り返し処理制御方法
- エクセル初心者のため、登録用のシートから印刷用のシートへの転記を考えています。
- A列のセルの値が変わるまで、同じ処理を繰り返したいです。
- エラーメッセージに従い、Loopの位置を変えましたが、無限ループに陥っています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは! こういうことですかね? 仮にA列の値が「2」(固定している間)だけLOOPするのであれば Sub test1() Dim i As Long i = 1 Do While Cells(i, 1) = 2 With Cells((i - 1) * 5 + 1, 10) .Value = Cells(i, 2) .Offset(, 1) = Cells(i, 3) .Offset(, 2) = Cells(i, 4) .Offset(1) = Cells(i, 5) .Offset(2) = Cells(i, 6) .Offset(3) = Cells(i, 7) End With i = i + 1 Loop End Sub こんな感じですかね? もし、A列の値が決まってなくて同じ値が連続するだけLoopするのであれば Sub test2() Dim i As Long With Cells(1, 10) .Value = Cells(1, 2) .Offset(, 1) = Cells(1, 3) .Offset(, 2) = Cells(1, 4) .Offset(1) = Cells(1, 5) .Offset(2) = Cells(1, 6) .Offset(3) = Cells(1, 7) End With i = 2 Do While Cells(i - 1, 1) = Cells(i, 1) With Cells((i - 1) * 5 + 1, 10) .Value = Cells(i, 2) .Offset(, 1) = Cells(i, 3) .Offset(, 2) = Cells(i, 4) .Offset(1) = Cells(i, 5) .Offset(2) = Cells(i, 6) .Offset(3) = Cells(i, 7) End With i = i + 1 Loop End Sub こんなんではどうでしょうか? あくまで個人的な考えですが、Loopを使うのであれば変数は一つにした方が良いと思います。m(__)m
その他の回答 (1)
- keithin
- ベストアンサー率66% (5278/7941)
転記元の姿: 1行が1データ A列に大分類を列記 BCDEFG列に各データ タイトル行はとりあえず無しにして1行目から実データ 転記先の姿: 5行1組で転記元1行データをこの5行の中に配置 大分類が変わるまで下向けに追記 大分類が変わったら印刷,リセットして1行目に戻る タイトル行は無しにしてとりあえず1行目から実データ 基本パターン: do A列が空っぽになるまで繰り返す 転記先初期化 do 1行を5行に転記・追記する loop 大分類が変わるまで繰り返す 大分類が変わったら印刷する loop 作成例: sub macro1() dim i, j i = 1 do until cells(i, "A") = "" j = 1 range("J:L").clearcontents do cells(j, "J") = cells(i, "B") cells(j, "K") = cells(i, "C") cells(j, "L") = cells(i, "D") cells(j + 1, "J") = cells(i, "E") cells(j + 2, "J") = cells(i, "F") cells(j + 3, "J") = cells(i, "G") j = j + 5 i = i + 1 loop while cells(i, "A") = cells(i - 1, "A") worksheets("シート名").printout loop end sub
お礼
keithin さん ありがとうございます。昨日は質問後しばらく待ったものの、あの時間に回答をいただけるとは思っていなかったので、遅くなりました。まず希望通りの実行もできました。また考え方を当初に記載していただいたおかげで、ループの前と後での条件判断が理解でき、今後の参考になりました(実際に条件判断やその位置をkeithin さんのコードから変えて、動きやエラーも確認できました…また無限ループに陥ったこともありましたが。)ありがとうございました。今後もお世話になるかと思いますが、よろしくお願いします。なお、大変恐縮なのですが、tom04 さんからも事前に有意なご回答をいただいており、今回お二方両方のご回答に優劣はつけかねるので、時間の早かったtom04 さんをベストアンサーとさせていただくこと、御容赦下さい。ありがとうございました。
お礼
tom04 さん ありがとうございます。昨日は質問後しばらく待ったものの、あの時間に回答をいただけるとは思っていなかったので、遅くなりました。大変参考になり、またA列の値が可変である後段のコードで、希望通りの実行ができました。ループ処理の制御のため、A列の最初の行の処理と2行目以降の処理を分けること、「With Cells((i - 1) * 5 + 1, 10)」の「(i - 1) * 5 + 1」の考え方も、大変勉強になりました。「Loopを使うのであれば変数は一つにした方が良いと思います」との点も留意したいと思います。ありがとうございました。