エクセルマクロ繰り返し処理制御方法

このQ&Aのポイント
  • エクセル初心者のため、登録用のシートから印刷用のシートへの転記を考えています。
  • A列のセルの値が変わるまで、同じ処理を繰り返したいです。
  • エラーメッセージに従い、Loopの位置を変えましたが、無限ループに陥っています。
回答を見る
  • ベストアンサー

エクセル マクロ 繰り返し処理の制御方法について

お世話になります。エクセル初心者です。 登録用のシートから(データ数は、5000行ほど)、印刷用のシートへの転記を考えています。  下記のコードはテスト用の簡易なものですが、試行錯誤でここまではたどりついたのですが。  A列には大分類用の番号を入れてあるので、A列のセルの値が変わるまで、同じ処理を繰り返したいのですが、そのためにはどうしたらよいでしょうか。下記のコードの i と j の変数部分を連動させたい(A列の同じ値の数だけ、5行おきの転記をしたい)のですが。  Do until 構文も試してみたのですが(下記のコードでは、テストなので、「=2」のように固定にして(a)の部分に挿入してみました。)、エラーメッセージに従い、Loop の位置を(b)から(c)に変えてみたところ、無限ループに陥り、対処に困っています。  よろしくお願いします。 Sub test3() Dim i As Long Dim j As Long i = 1 '転記元の行 'Do until range("A"&i)=2 -----------------------(a) For j = 1 To 200 Step 5 '転記先の行 Range("J" & j) = Range("B" & i) Range("k" & j) = Range("C" & i) Range("L" & j) = Range("D" & i) Range("J" & j + 1) = Range("E" & i) Range("J" & j + 2) = Range("F" & i) Range("J" & j + 3) = Range("G" & i) i = i + 1 'Loop-------------------------------------------'(b) Next j 'Loop-------------------------------------------'(c) End Sub

  • Yeyen
  • お礼率87% (7/8)

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! こういうことですかね? 仮に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

Yeyen
質問者

お礼

tom04 さん ありがとうございます。昨日は質問後しばらく待ったものの、あの時間に回答をいただけるとは思っていなかったので、遅くなりました。大変参考になり、またA列の値が可変である後段のコードで、希望通りの実行ができました。ループ処理の制御のため、A列の最初の行の処理と2行目以降の処理を分けること、「With Cells((i - 1) * 5 + 1, 10)」の「(i - 1) * 5 + 1」の考え方も、大変勉強になりました。「Loopを使うのであれば変数は一つにした方が良いと思います」との点も留意したいと思います。ありがとうございました。

その他の回答 (1)

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

転記元の姿: 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

Yeyen
質問者

お礼

keithin さん ありがとうございます。昨日は質問後しばらく待ったものの、あの時間に回答をいただけるとは思っていなかったので、遅くなりました。まず希望通りの実行もできました。また考え方を当初に記載していただいたおかげで、ループの前と後での条件判断が理解でき、今後の参考になりました(実際に条件判断やその位置をkeithin さんのコードから変えて、動きやエラーも確認できました…また無限ループに陥ったこともありましたが。)ありがとうございました。今後もお世話になるかと思いますが、よろしくお願いします。なお、大変恐縮なのですが、tom04 さんからも事前に有意なご回答をいただいており、今回お二方両方のご回答に優劣はつけかねるので、時間の早かったtom04 さんをベストアンサーとさせていただくこと、御容赦下さい。ありがとうございました。

関連するQ&A

  • エクセルVBAの繰り返し処理の質問

    C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

  • マクロでCOUNTIFを使いたい(続)

    マクロでCOUNTIFを使いたい(続) Excel2003を使用しています。 【転記元】B列の値が【転記先】A列には何回出てくるのか?を転記先C列に書き出す作業を しております。 【転記元】H列は空白・数値が入力されています。 【転記先】C列には【転記元】のH列が「0以上で"計"を含まない」件数をカウントさせたい のですが、現状のコードだと正確な数値が入りません。(2のところが5だったりとか) お解りの方がいらっしゃればどうぞご指摘ください。 宜しくお願いします。 ------------------------------------------------------------ 【転記元】  B列 … H列  あ    50  あ    20  計    70 ------------------------  い    ※空白  い    0  計    0 ------------------------  う    0  計    0 ------------------------  え    20  え    ※空白  計    20 ------------------------  お    10  お    20  計    30 ------------------------ 【転記先】  A列  B列  C列 ←★このC列に結果を表示させたい  あ      2  え      1  お      2 ------------------------------------------------------------ Sub テスト() Dim ent As Worksheet, mst As Worksheet Dim i As Integer, j As Integer, mstsh As Integer Dim lstcel As String Dim mstRge As Range Dim sach As Variant Set ent = Workbooks("転記先").ActiveSheet Set mst = Workbooks("転記元").ActiveSheet Set mstRge = mst.Range("B5:H2000") ent.Activate ent.Range("C2:C1000").ClearContents lstcel = mst.Cells(Rows.Count, "B").End(xlUp).Row For i = 1 To lstcel sach = ent.Cells(i + 1, "A") If mst.Cells(i + 5, "H") > 0 And mst.Cells(i + 5, "H") <> "計" Then ent.Cells(i + 1, "C").Value = Application.WorksheetFunction.CountIf(mstRge, sach) End If Next i End Sub

  • マクロでCOUNTIFを使いたい

    マクロでCOUNTIFを使いたい COUNTIFを使いたく、下記のマクロを作成しました。 【転記元】A列の値が【転記先】A列には何回出てくるのか?を転記先C列に書き出す作業を したいのですが、提示したコードだと、★のC列全てに「1」が入ってしまいます。 ところが、★★の部分を下記のように書き替えると、正常にカウントされた値が入ります。 ent.Cells(i + 1, "C").Formula = Application.WorksheetFunction.CountIf(mst.Range("A2:A100"), ent.Cells(i + 1, "A")) なぜこうなるのか?原因が知りたくて頭を悩ませております。 お解りの方がいらっしゃればどうぞご指摘ください。 宜しくお願い致します。 ------------------------------------------------------------ 【転記元のシート】  A列  10    10  20  20  50 【転記先のシート】  A列  B列  C列 ←★このC列に結果を表示させたい  10      2  20      2  50      1 ------------------------------------------------------------ Sub カウントテスト() Dim ent As Worksheet, mst As Worksheet Dim i As Integer Dim lstcel As String Dim mstrange As Range Dim sach As Variant Set ent = Workbooks("転記先").ActiveSheet Set mst = Workbooks("転記元").ActiveSheet Set mstrange = mst.Range("A2:A100") i = 1 lstcel = mst.Cells(Rows.Count, "A").End(xlUp).Row sach = ent.Cells(i + 1, "A") For i = 1 To lstcel If mst.Cells(i + 1, "A") <> "" Then '↓★★ここの部分を書き替えるときちんとカウントされる ent.Cells(i + 1, "C").Formula = Application.WorksheetFunction.CountIf(mstrange, sach) End If Next i End Sub

  • エクセル マクロについてです

    Sub 転記_Click() Dim wst1 As Worksheet Dim wst2 As Worksheet Set wst1 = ThisWorkbook.Worksheets("Sheet1") Set wst2 = ThisWorkbook.Worksheets("Sheet2") For i = 10 To 12 If wst1.Range("A" & i) <> "" And Not IsNull(wst1.Range("A" & i)) Then myRow = wst2.Cells(Rows.Count, 1).End(xlUp).Row + 1 wst2.Range("A" & myRow) = wst1.Range("D4") wst2.Range("B" & myRow) = wst1.Range("A4") wst2.Range("C" & myRow) = wst1.Range("A" & i) wst2.Range("D" & myRow) = wst1.Range("B" & i) wst2.Range("E" & myRow) = wst1.Range("C" & i) wst2.Range("F" & myRow) = wst1.Range("D" & i) End If Next i wst1.Range("A4").ClearContents wst1.Range("A10:C12").ClearContents End Sub こんにちは、はじめまして!よろしくお願いします!! 今回イベントの係になりました、複数人の回答を集計するのに上のを 作って頂きシュミレーションも上手くいったのですが… この集計とは別にA6の項目も準備の為に必要だと個人的に思い 昨日一晩色々と試したのですが、上手くいきません。 メモ的なものですので、同じSheet2(転記データの横)の G H I とかに  D4 A5 A6と3箇所 上から順番に"一行だけ"入るようには出来ないでしょうか。 もしくは、シートを増やして新Sheet3のA B C に D4 A5 A6 と上から順番に転記され入る様にしたいです。(一行だけ) (※自分でやると G H I に3行も同じものが転記されてしまいます、上3行空いて4行目から、入ったりします) クラブ活動の合間とかに各々に回答してもらう予定です。 ボタンを押すと転記されその後クリアで空欄にし次の人…なる設定にします、 1回のボタンで出来ますでしょうか(上のものに組み込んだり出来るでしょうか) お詳しい先生方どうぞよろしくお願いします。

  • エクセルのマクロで転記

    シート1とシート2があり、 シート1の20Aから39Lまでのセルの中に情報を書き込んでいます。 シート1の20Lから39LのL行で、数値が入っているセルがあれば、その行のA、B、I、L列と、J2、A7を取り出し、シート2の2行目から下に転記していくのですが、 シート2のA列にはシート1のJ2を、B列にはシート1のA7を、C列以降は、シート1のA、B、I、Lを入れるようにします。 また同じ条件がシート1で発生すれば、シート2の3行目以降に転記していく感じです。 どのようにすればいいでしょうか。

  • Excelマクロの大量行の処理速度を上げたい

    Excel VBA 勉強中です。 Excel VBA を利用して大量の行の処理をしたいのですが、時間がかかってしまい、場合によっては固まってしまうので困っています。 色々と調べながら自分で作ってみたのですが、少量の行で試しに行った時にはきちんと動いたのですが、大量の行で行った時には固まってしまう(動かなくなってしまう)ので困っています。 転記先(シート1)には番号とコードが入っていて、基データ(シート2)にある番号とコードが一致した場合のみ基シート(シート2)にある日付を転記先(シート1)へ転記させたいと思っています。 ・シート1にもシート2にもそれぞれ、データが10000行ぐらいあります。 シート1(転記先) D列   E列    I列 番号   コード   日付←転記させたいセル 12345   123    4/30 23456   234 34567   345 シート2(基データ) B列   G列    I列 番号   コード   日付 23456   123    3/31 12345   123    4/30 45678   345    5/1 Dim sh1, sh2 Set sh1 = Sheets("シート1")  ’転記先 Set sh2 = Sheets("シート2")  ’基データ d = sh1.Range("A65536").End(xlUp).Row On Error Resume Next For i = 2 To d r = 2 d1 = sh1.Cells(i, 4) & sh1.Cells(i, 5) d2 = sh2.Cells(r, 2) & sh2.Cells(r, 7) Do While d2 <> "" If d1 = d2 Then sh1.Cells(i, 9) = sh2.Cells(r, 9) Exit Do End If r = r + 1 d2 = sh2.Cells(r, 2) & sh2.Cells(r, 7) Loop Next i どこがいけないのか、教えていただけると大変助かります。

  • (マクロ)カット&ペーストを列毎に繰り返したい

    下のように、A列から50列目までデータが入力されています。 各列、データは上から順に詰まっている状態です。 C列のように1つもデータが入力されていない列もあります。 ------------------------------------------ A列 B列 C列 D列 ・・・ Z001 Z003 Z004 Z002 Z005 ------------------------------------------ これを、「B列から順にデータをカットして、A列最終行の下にペーストする」という作業を、各列毎に50列目まで繰り返したいと思っています。 完成イメージは下記のようになります。 ------------------------------------------ A列 B列 C列 D列 ・・・ Z001 Z002 Z003 Z004 Z005 ------------------------------------------ 下記のようにマクロを組みましたが、無限ループになっているのか、強制終了となってしまいます。 どういうふうにマクロを組めばいいのでしょうか? 宜しくご教授お願いいたします。 Sub ADD() Dim i, j As Long For j = 2 To 50 '列番号指定 'B列1行目から順にセルが空白でなければカットする。 i = 1 Do While Cells(i, j).Value <> Empty Cells(i, j).Select Selection.Cut 'A列の最終行の1つ下の行に貼り付ける。。 Range("A1").Select Range(Selection, Selection.End(xlDown).Offset(1, 0)).Select ActiveSheet.Paste i = i + 1 Loop Next End Sub

  • エクセルでのマクロが作れません

    簡単なマクロ構文が作れなくて困っています。 セルA1、B1、C1・・・と約5000個続く1行のデータを9列のデータに並べ直すだけなのですが(A1、B1C1・・・I1、A2、B2、C2・・・I2、A3、B3、C3・・・というふうに)、当方マクロなど組んだこともなく、途方に暮れております。一応ネット等を参考にして、以下のようにある程度組んでみたのですが、全然動きません(泣)。 Sub Sample() Dim i Dim j Dim k For i= 1 to 5000 j= INT(i \ 10) k=(i Mod 10) Worksheets("Sheet1").[1,i] Copy Destination=Worksheets("Sheet2").Paste(1+J,k) Next i Sub.End どなたか、ご教示頂けませんか。 よろしくお願いいたします。

  • エクセルマクロでデータの検索と転記方法

    エクセル2000です。 sheetAの 10行~165行に表Aがあります。 途中に、空白行や小計行もかなりあります。 C列のコード(文字列、数値両方あります)をキーにして、SheetBの4行目から91行目までの表B(A列にコードがあります)のB列の数値を、sheetAの10行~170行のD列に転記したいのです。sheetAの表の小計行のC列は空白です。SheetBの表Bのコードは、sheetAの表Aのコードの一部しかありません。ですから、sheetAの表AのコードがSheetBの表Bになかったらそこは何も転記しません。 わかりづらい説明かと思いますが、マクロの記述をお教えいただければ幸いです。

  • EXCELのマクロのシートを指定する方法

    下記にあるEXCELのマクロは、以前こちらのサイトで教えて頂いたマクロです。 私の質問の仕方がまずかったのですが、シートが指定ではなくて、次のシートとなっています。 これを、1列の元データがシート2で新しく貼り付ける場所をシート1という風に変更したくていろいろやってみましたが、EXCELのマクロ自体、初心者で全然できませんでした…。 どなたか教えて頂けないでしょうか?よろしくお願いします。 下記のマクロは 【Excel2003でA列に1行にあるデータ(半角英数字)を次のシートに、1行ずつコピーして、それを5列に振り分けするというマクロです(ただし、コピーは2つずつの時もあります。) 元データ(これをシート2にしたい) ●A列 B列 C列  1  2  3  4  5  ・  ・ 加工後 (シート1に貼り付けたい) ●A列 B列 C列 D列 E列   1   1   2   2   3   3   4   4   5   5  『sub macro1()  dim i as long, j as long, k as long  dim n, m  on error resume next  k = application.inputbox("duplication", type:=1)  if k = 0 then exit sub  activesheet.next.range("A:E").clearcontents  for n = 1 to range("A65536").end(xlup).row   for m = 1 to k    activesheet.next.cells(j + 1, i + 1).value = cells(n, "A").value    i = (i + 1) mod 5    j = iif(i = 0, j + 1, j)   next m  next n  activesheet.next.select end sub』

専門家に質問してみよう