• ベストアンサー

エクセルのマクロ:連続動作を空白行で終了する方法

XP・Excel2003使用のマクロ素人です。 エクセルのマクロを使って以下のマクロを作りました。 1.Sheet1の1行目に入っているデータをSheet2にコピー 2.Sheet2をコピー 3.Sheet1の1行目を削除 4.上記1~3のマクロを実行するボタンをクリック 作業を繰り返し行いたかったので、(4)の「マクロボタンをクリック」という作業もマクロに組み込んでみたのですが、空白行でも延々に実行されてしまいます。 【Sheet1に入っているデータが空白になったら作業を止める】というマクロはどのように書けばいいのでしょうか? マクロの作り方が根本的に間違っていましたら、あわせてご指摘下さい。 宜しくお願い致します。 Range("A1").Select Selection.Copy Sheets("Sheet2").Select ActiveSheet.Paste Sheets("Sheet2").Select Application.CutCopyMode = False Sheets("Sheet2").Copy After:=Sheets(3) Sheets("Sheet1").Select Rows("1:1").Select Selection.Delete Shift:=xlUp Range("A1").Select Sheets("Sheet1").Select Application.Run "Book1!Macro1"

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんぱんは。Wendy02です。 私自身としては、あまり細かい部分には、立ち入れないような部分も感じますし、本当におせっかいになってしまうのですが・・・。少し、アドバイスをさせてください。 >3.1行目(一人目)のSheetを作り終わったので、1行目のデータを削除して、2人目のデータが1行目にくるようにしております。 手作業の場合は、確かにこのようにしてよいのですが、マクロで作成する場合は、一括して削除したほうがよいと思うのです。まあ、もちろん、全部を削除してしまう、ということには、私は、多少の抵抗は感じますが。そうした元データを削除するのは、念には念を入れて削除するようにしたほうがよいのではないか、と思います。 >2.Sheet2に作られた個人データをコピー(Sheet2を貼付のマスタと置いています) これは、どこかに個人名など、それをシート名にする名称がないのでしょうか?単にコピーするなら、貼付のマスタ(2),貼付のマスタ(3),, などなってしまいます。ActiveSheet.Name = ○○○で、名前が付けられます。 >1.Sheet1の1行目に入っている複数のデータを、Sheet2の連続しない複数のセルにコピー(Sheet2にはグラフが含まれており、Sheet1のデータをコピーすることにより、グラフが作成されます) たぶん、それ相応のデータがないと、グラフにはなりませんが、コピーする時に、横のデータを、縦のデータの並びにしてあげたら、見やすいような気がします。 なお、ループで行う時には、Cells(i,1) で行うと便利です。 私なりの想像でサンプルを作ってみましたが、必ずしもご要望とは一致しません。 それでも、部分的に参考にならないでしょうか? 例: 横のものを縦にして張り付ける 'なるべく標準モジュールでお試してください。 Sub CopyCells2Sheet()  Dim i As Long  On Error GoTo ErrHandler  With Worksheets("Sheet1")   For i = 1 To .Range("A65536").End(xlUp).Row    .Range(.Cells(i, 1), .Cells(i, 256).End(xlToLeft)).Copy    '横のものを縦にして張り付ける(Transpose が縦横変換)    Worksheets("Sheet2").Range("A1").PasteSpecial Paste:=xlPasteAll,Transpose:=True        Application.CutCopyMode = False        Worksheets("Sheet2").Copy After:=Sheets(Sheets.Count)    'シート1のA列のデータをシートの名前にする    Sheets(Sheets.Count).Name = .Cells(i, 1).Value   Next i   .Select  'シートのセレクト   '元データの削除   .Range("A1").CurrentRegion.Select   If MsgBox("データを削除してよろしいですか?", vbInformation + vbOKCancel) = vbOK Then    Selection.ClearContents    .Range("A1").Select   End If  End With  Exit Sub ErrHandler:  'シート名が同じものがある時のエラー処理  MsgBox Err.Description End Sub なお、少し、上記のコードをコメントすると、Sheet とWorksheet の意味が違います。 Worksheets("Sheet2").Copy After:=Sheets(Sheets.Count) Sheets(Sheets.Count)というのは、シートの種類に関係なくシートを数えて、その後ろにワークシートを貼り付ける、という意味です。それをAfter:=Worksheets(Worksheets.Count) でも可能ですが、少し、位置があやふやになってしまいます。

googooquestion
質問者

お礼

アドバイスありがとうございます。 想像で作っていただいたサンプルの大部分を使用して、理想的なマクロを組む事ができました。コードのことなど本当に何もわからないので、とても参考になりました。これから少しずつ上達していきます。 また困ったことがありましたら、助けてください。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 私には、コードというよりも元のマクロの意図が良く分かりません。 1.Sheet1の1行目に入っているデータをSheet2にコピー   **マクロでは、A1 を どこかの場所にコピーしています。繰り返す必要性があるのか、分かりません。 2.Sheet2をコピー   **シート2を、シート3の後ろにコピーしています。 3.Sheet1の1行目を削除   **シート1のA1だけコピーして、1行目を削除しています。 それを繰り返したら、場合によっては、Excelがハングするのではないでしょうか?もう少し、そのマクロのタスクがきちんと整理されていなければ、コードは書けても、実用にはならないように思います。

googooquestion
質問者

補足

説明不足でした。簡略化しすぎました。申し訳ありません。 具体的に言いますと、テスト結果の一覧表を個人別報告書に仕上げる作業をしたいのです。 Sheet1にはテスト受検者全員の結果(1人分で1行)が一覧表で入っています。これらを報告書用に1Sheetに1人ずつの個人データを入れたいのです。 1.Sheet1の1行目に入っている複数のデータを、Sheet2の連続しない複数のセルにコピー(Sheet2にはグラフが含まれており、Sheet1のデータをコピーすることにより、グラフが作成されます) 2.Sheet2に作られた個人データをコピー(Sheet2を貼付のマスタと置いています) 3.1行目(一人目)のSheetを作り終わったので、1行目のデータを削除して、2人目のデータが1行目にくるようにしております。 ※これは、連続してマクロを使うために設定しました なにぶんマクロ素人な為、とんちんかんな質問かもしれませんがアドバイスをお願い致します。マクロを作る際は最初[ツール]-[マクロ]-[新しいマクロを作成]で作ってから、修正を加えております。

  • Knl_Panic
  • ベストアンサー率38% (20/52)
回答No.4

すみません、No.1の訂正です。 EOFはプロパティ名にあるので、変数として適切でありませんでした。 次のように訂正します。 ---この下から (ここに「Sub」行をセット) LstROW = Worksheets("Sheet1").Range("A65536").End(xlUp).Row For i = 1 To LstROW (ここに質問文のマクロをセット) next (ここに「End Sub」行をセット) ---ここまで

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.3

こんな感じでしょうか Sub test01() With Sheets("Sheet1") 'Sheet1について Do While .Range("A1").Value <> "" 'A1が空白でない間 .Range("A1").Copy 'A1をコピー Sheets("Sheet2").Range("A1").PasteSpecial ' Sheet2のA1に貼り付け Application.CutCopyMode = False Sheets("Sheet2").Copy After:=Sheets(Sheets.Count) ' Sheet2をコピーし最後のシートにする .Rows("1:1").Delete Shift:=xlUp ' 1行目を削除 Loop '実行を繰り返す End With 'Sheet1について,おわり End Sub

  • driverII
  • ベストアンサー率27% (248/913)
回答No.2

普通はループを使って、実現します。 ---------------------------------- Dim fEnd As Boolean fEnd = False While fEnd = False 処理 If Range("A1").Value = "" Then fEnd = True Wend --------------------------

  • Knl_Panic
  • ベストアンサー率38% (20/52)
回答No.1

こんにちは。 そのマクロを以下の行で挟んでみてください。 ---この下から (ここに「Sub」行をセット) EOF = Worksheets("Sheet1").Range("A65536").End(xlUp).Row For i = 1 To EOF (ここに質問文のマクロをセット) next (ここに「End Sub」行をセット) ---ここまで これでデータのある行数回分だけ処理が繰り返されると思います。 以上、よろしかったら試してみてください。

関連するQ&A

  • 行を挿入するマクロがうまくいきません。

    Sheets("りんご").Select Rows("1:1").Select Selection.Copy Sheets("みかん").Select Range("人").Select Selection.Insert Shift:=xlDown Application.CutCopyMode = False End Sub というマクロは、りんごのシートにある1行をコピーして、 みかんのシートの人と名前定義してある特定の行にコピーする マクロです。この次に下のマクロを実行すると Sheets("りんご").Select Rows("2:3").Select Selection.Copy Sheets("みかん").Select Range("人").Select Selection.Insert Shift:=xlDown それまでのものが残ってしまい、行がどんどん増えていってしまいます。 いずれかのマクロを実行すればリセットされて行が増えないように コピーするにはどうすればよいでしょうか・・?

  • エクセル2007マクロ シート間のセルコピー

    [Sheet1]にあるデータを[Sheet2]にコピーするマクロボタンを[Sheet2]に作りたいのですが、マクロがよく分からないので、「マクロの記録」で作成してみました。 Sub siken() ' ' siken Macro ' ' Sheets("Sheet1").Select Range("A1").Select Selection.Copy Sheets("Sheet2").Select Range("A1").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B3").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B3").Select ActiveSheet.Paste Sheets("Sheet1").Select Range("B6:D6").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B6").Select ActiveSheet.Paste End Sub (実際はもっと多くのセルをコピーします) マクロを実行すると、ちゃんとコピーできるのですが、セルをコピーする都度[Sheet1]と[Sheet2]が交互に表示されます。 コピー元の[Sheet1]を表示させずにマクロを実行させるにはどのようにしたらよいのでしょうか? よろしくお願いします。

  • エクセルマクロ 繰り返して、別のシートへコピーしたい

    エクセルマクロ 繰り返して、別のシートへコピーしたい マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、 どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 1行目から10行目まで繰り返したくて、 1行目から2行目のセルの移動の差は10行目までかわりません。 '1行目 Sheets("Sheet1").Select Range("B14:C14").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B15:C17").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False '2行目 Sheets("Sheet1").Select Range("B18:C18").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Sheets("Sheet1").Select Range("B19:C21").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet2").Select Range("B2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False

  • エクセル マクロ

    エクセル2000を使っています。 「申請書」、「標準事務用品」の2種のシートがあって、「申請書」のシートは定型の入力フォーム、「標準事務用品」は入力フォームに反映させたいデータの一覧表になっています。データの項目は左から、1.申請2.品物3.商品名4.品番5.メーカー名となっており、データは全部で74行あります。1.申請項目の列には各行1個づつコマンドボタンを設けました。コマンドボタンがクリックされたときに、該当行のセルの内容を入力フォームにコピーする処理が実行されるようにしたいです。 マクロの記録で記述されたコードをコマンドボタンのコードにコピーしてみましたが、エラーになってしまい修正の仕方がわかりません。 Private Sub CommandButton1_Click() Range("K30").Select Selection.Copy Sheets("申請書").Select ActiveSheet.Paste Sheets("標準事務用品").Select Range("L30").Select Application.CutCopyMode = False Selection.Copy Sheets("申請書").Select  (↓ここでエラーになってしまします。) Range("B13:G13").Select ActiveSheet.Paste Sheets("標準事務用品").Select Range("M30").Select Application.CutCopyMode = False Selection.Copy Sheets("申請書").Select Range("B15:C15").Select ActiveSheet.Paste Sheets("標準事務用品").Select Range("N30").Select Application.CutCopyMode = False Selection.Copy Sheets("申請書").Select Range("B14:G14").Select ActiveSheet.Paste Application.CutCopyMode = False End Sub また、全部で74行あるので、全てに操作を記述するのは非効率的だろうと思います。何か良い方法はありますでしょうか。 ご助言お待ちしております。

  • Excel 繰り返しマクロ

    下記のようなマクロを使ってn個あるシートの内容を「集計」シートにコピーさせるようにしました。 (自動マクロとの組合せなので、スマートではないかもしれませんが) でも、これだと「集計」シートもコピー作業を行ってしまうので、 「集計」シートはコピー作業をしないように除外したいのですが、どうしたら良いのでしょう? 実際にはシート数は30程度、コピペ項目は1シートあたり30項目程度あります。 よろしくお願いします。 ------------------------- Sub テスト2() ' For i = 1 To Worksheets.Count '案件番号等コピー ' Sheets(i).Select Range("D3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("A4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '案件名 Sheets(i).Select Range("F3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("B4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '国名 Sheets(i).Select Range("E3").Select Application.CutCopyMode = False Selection.Copy Sheets("集計").Select Range("C4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False '選択セルの解放 Application.CutCopyMode = False '行挿入 ' Sheets("集計").Select Rows("4:4").Select Selection.Insert Shift:=xlDown Next i End Sub

  • エクセルのマクロについて

    エクセル97でマクロを組んで下記作業を行いたいと考えていますが(実際にやりたい事から抜粋した内容です)、不具合が起こっています。 ~やりたい事~ コマンドボタンを押すとあるシートのセルをコピーして、違うシートに貼り付ける。 ~不具合内容~ (1)普通にマクロを実行すると問題ないが、(2)コマンドボタンを使用するとエラーが起こる。 エラー内容は、 「実行時エラー'1004' RangeクラスのSelectメソッドが失敗しました。」 と言う内容です。 ~(1)のVB表記~ Sub Macro1() Sheets("sheet1").Select Range("A1").Select Selection.Copy Sheets("sheet2").Select Range("A1").Select ActiveSheet.Paste End Sub ~(2)のVB表記~ Private Sub CommandButton1_Click() Sheets("sheet1").Select Range("A1").Select (←ここでエラーが発生します) Selection.Copy  Sheets("sheet2").Select Range("A1").Select ActiveSheet.Paste End Sub ~質問事項~ 1)(2)の表記の何が原因でエラーが起こっているのでしょうか? 2)エラーが起きない為にはどのようにしたら良いでしょうか?

  • エクセルのマクロで各Sheetのデータを複数コピー&ペーストしたいです

    エクセルのマクロで各Sheetのデータを複数コピー&ペーストしたいです 1つのエクセルファイルの中に複数のSheetがあります。 各Sheetの4行目以降(5行目から)にデータのあるA列~O列をコピーしていって、 挿入-ワークシート(Sheet1という名前で構わない)に全てを順番にコピーしていきたいです。 ”新しいマクロの記録”で下記のように作成したのですが、  ・5行目からデータのあるA列~O列をコピーしていく   ・存在する全てのSheetから上記の作業をする というマクロの書き方が分かりません。 恐れ入りますがお時間ある方で上記の内容をご理解頂ける方がいましたらアドバイス頂ければ非常に助かります。 Sub Macro1() Sheets.Add Sheets("ER10(zy)").Select Rows("5:8").Select Selection.Copy Sheets("Sheet1").Select ActiveSheet.Paste Sheets("ER10(cx)").Select Rows("5:9").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("A5").Select ActiveSheet.Paste Sheets("ER10(zht)").Select Rows("5:13").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("A10").Select ActiveSheet.Paste End Sub

  • エクセルのマクロで各Sheetのデータを複数コピー&ペーストしたいです

    エクセルのマクロで各Sheetのデータを複数コピー&ペーストしたいです 1つのエクセルファイルの中に複数のSheetがあります。 各Sheetの4行目以降(5行目から)にデータのあるA列~O列をコピーしていって、 挿入-ワークシート(Sheet1という名前で構わない)に全てを順番にコピーしていきたいです。 ”新しいマクロの記録”で下記のように作成したのですが、  ・5行目からデータのあるA列~O列をコピーしていく   ・存在する全てのSheetから上記の作業をする というマクロの書き方が分かりません。 恐れ入りますがお時間ある方で上記の内容をご理解頂ける方がいましたらアドバイス頂ければ非常に助かります。 Sub Macro1() Sheets.Add Sheets("ER10(zy)").Select Rows("5:8").Select Selection.Copy Sheets("Sheet1").Select ActiveSheet.Paste Sheets("ER10(cx)").Select Rows("5:9").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("A5").Select ActiveSheet.Paste Sheets("ER10(zht)").Select Rows("5:13").Select Application.CutCopyMode = False Selection.Copy Sheets("Sheet1").Select Range("A10").Select ActiveSheet.Paste End Sub

  • マクロで切り取りしたものを貼り付ける方法

    エクセルのマクロを利用しております。 自動で作業を覚えるマクロボタンで切り取りし貼り付けたのですが マクロを実行するとデータが元の場所にも残ってしまいました。 結果としてコピーペーストとして出力されました。 私が行いたいことは、切り取りし貼り付けが行いたいのです。 (元の場所にデータは残らない) 以上よろしくお願いします。 以下は私が使用しているマクロになります。 Workbooks("2.xls").Sheets("Sheet1").Select Columns("Q:Y").Select Application.CutCopyMode = False Selection.Copy Columns("N:N").Select Selection.Insert Shift:=xlToRight Sheets("Sheet2").Select Columns("C:D").Select Application.CutCopyMode = False Selection.Copy Columns("N:N").Select Selection.Insert Shift:=xlToRight

  • エクセルのマクロを使って・・・

    見積書を作成するマクロを作っているのですが、シートの追加がうまくいかず困っています。 見積書を作る際に、明細を入力する行が足らない時に、あらかじめ、作ってある『明細マスター』と言う名前のシートから、明細書をコピーして新しいシートを挿入して、そこに貼り付けると言う作業を、最大で“明細書(1)~(5)”5枚のシートを追加できる…と言う、マクロを作りたいのですが… 追加する枚数はその都度、違うそうなので、1回実行すると、『明細書(1)』が追加され、2回目の実行で『明細書(2)』が追加・・・・・ と言うようなマクロを作りたいのですが・・・ Sub 明細書() Worksheets.Add After:=ActiveSheet ActiveSheet.Name = "明細書(1)" Sheets("明細マスター").Select Cells.Select Selection.Copy Application.CutCopyMode = False Selection.Copy Sheets("明細書(1)").Select Cells.Select ActiveSheet.Paste Range("B2").Select End Sub 上記のマクロで、一枚だけの追加だと明細書が追加されるんですが、それを最大5枚まで追加すると言うマクロが分かりません。 質問が、分かりにくかったら申し訳ありませんが、よろしくお願いいたします。

専門家に質問してみよう