• ベストアンサー

【Excel】マクロでページを追加することはできますか?

いつもお世話になっております。 Excel2003使用して、Sheet1に1ページ分のひな形(A1:X40)を作り、このひな形をコピーして使っています。 例えば、Sheet2の1ページ目の入力欄がなくなったので、Sheet1のA1:X40の範囲を2ページ目としてコピペして追加したいのですが、マクロで可能でしょうか?もし可能であれば、どのようにコードを書いたらいいでしょうか? マクロ勉強中です。よろしくお願いします!

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

  • ベストアンサー
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

選択した位置(ActiveCell)に「ひな形」をコピーします。 Sub cpy() Sheets("Sheet1").Range("A1:X40").Copy ActiveCell End Sub

rx-z5815
質問者

補足

早々の回答ありがとうございます。 早速試してみたのですが 『実行時エラー9 インデックスが有効範囲にありません』 というダイアログが表示されてエラーが出てしまいました。

その他の回答 (3)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

こんにちは。 > もともと、空き行を想定していたりすると、レイアウトが崩れたりするので、 > あまり好まれません。 確かにそうですね^^; では、空行をパラメータとしてもっておき、ページの切れ目ではなく、ページの 頭に改ページを挿入するというロジックでどうですか? Sub InsTemplate()   Dim Sh  As Worksheet   Dim rSrc As Range   Dim rDst As Range      ' 設定 ------------------------------------------------------------   ' 雛形ごとに空行を設けたいとき(現在 1 行)   Const MARGIN_ROW As Long = 1   ' 雛形のセル範囲(行の高さもコピーするので行全体で指定します)   Set rSrc = Worksheets("Sheet1").Rows("1:40")   ' 貼り付け先のシート   Set Sh = Worksheets("Sheet2")   ' -----------------------------------------------------------------      Application.ScreenUpdating = False   ' 既存データの有無で分岐処理   If Application.CountA(Sh.Cells) = 0 Then     ' 空シートの場合は貼り付け先を1行目とし列幅をテンプレートにそろえる     Set rDst = Sh.Rows(1)     rSrc.Parent.Cells.Copy     rDst.PasteSpecial xlPasteColumnWidths   Else     ' 既にデータがあるシートなら使用済み最終セルから転記先を参照     Set rDst = Sh.UsedRange     Set rDst = Sh.Rows(rDst.Cells(rDst.Count).Row + MARGIN_ROW + 1)   End If   ' 雛形を複写   Sh.Activate   rSrc.Copy   rDst.PasteSpecial xlPasteAll   ' 雛形の頭に水平改ページを挿入(rDst.Row = 1 のエラートラップ)   On Error Resume Next   Sh.HPageBreaks.Add Before:=rDst   On Error GoTo 0   ' 印刷範囲を拡張   Sh.PageSetup.PrintArea = Sh.UsedRange.Address   ' 後始末ほか   Application.ScreenUpdating = True   ' 貼り付け先までスクロールさせます   Application.Goto Reference:=Selection, Scroll:=True   Set rSrc = Nothing: Set rDst = Nothing: Set Sh = Nothing    End Sub ' # マクロ勉強中とのことですから、#1 ご回答が汎用的・シンプルで一番良い ' # と思います。ご参考までということで。

rx-z5815
質問者

お礼

KenKen_SPさん、おはようございます。 詳しいご回答ありがとうございます<(_ _)> #3のWendy02さんのご指摘で、確認がてらシート名を入力しなおしたところ、うまくいきました。KenKen_SPさんのおっしゃるとおり、#1 ご回答が汎用的・シンプルで一番良いとのことなので、今回は#1のhana-hana3さんのコードを使わせていただきました。 KenKen_SPさんが記載してくださったコードは今後の参考にさせていただきます。 ありがとうございました。

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

こんにちは。 >『実行時エラー9 インデックスが有効範囲にありません』 それは、実際のシート名と、マクロのSheets("Sheet1") が合っていないからではないでしょうか?インデックスというのは、シート名のことのはずですから。 私も考えてみましたが、 >Sheet1のA1:X40の範囲を2ページ目としてコピペして追加したいのですが、マクロで可能でしょうか? この手のマクロは、私の考え方からすると、かなりむつかしいです。 2ページ目に入るためには、 A1:X40 次は、どこに貼り付けるか? と同じ質問ですね。難問だと思います。 要するに、二つの方法があると思います。 1. ページの切れ目に、手動改ページを入れること。  (比較的簡単です。もともと、空き行を想定していたりすると、レイアウトが崩れたりするので、あまり好まれません。) 2. 貼り付けた後の水平自動改ページの位置を探すこと。 2 は、貼り付け時点では、1ページが決まっていないわけで、水平自動改行(HPageBreak) がありません。したがって、そのまま貼り付けると、ページの切れ目にデータが載って、データが切れ切れになってしまいます。 以下のコードは、一旦、印刷領域を削除し、自動改行による印刷領域からページ数を取り、次に、1ページの行数を取り出しています。次に貼り付けた時に、データが切れる場合もあるので、それをもう一度、1ページの行数とページ数で掛けて、その位置を設定し直し、再度、次のページの最初の行を取り出しています。 今のところ、A列の最後尾に対して、印刷範囲を取っていますので、不用意に下の場所にあると、それを印刷領域にまで入れてしまいます。それを注意して行ってください。 こちらでは、上手くできましたが、これは、かなり難しい種類のマクロです。 #1 のhana-hana3 さんので上手く行きましたら、こちらのは、参考にするだけで結構です。 いずれにしても、Ver 4 マクロ関数以外には、この方法は思いつきませんでした。 '貼り付けは、標準モジュールをお勧めします。 '------------------------------------------------------- Sub AddPages()  Dim i As Integer  Dim oPageRow As Integer '元のページ行数  Dim aPageRow As Integer '再度取得したページ行数  Dim PageCount As Integer 'ページ数  '注意:これは、A:X までの列が、1ページに収まることを想定して作られています。    Const PAGE_EXT As String = "A1:X40" '1ページの大きさ  Const MYSHEET As String = "Sheet1" 'コピー元シート    On Error Resume Next    With ActiveSheet   .PageSetup.PrintArea = ""   PageCount = ExecuteExcel4Macro("COLUMNS(GET.DOCUMENT(64))") + 1   If PageCount = 0 Then PageCount = 1   oPageRow = ExecuteExcel4Macro("INDEX(GET.DOCUMENT(64),0,0)")   If oPageRow = 0 Then oPageRow = Range(PAGE_EXT).Rows.Count 'ダミー   i = PageCount * oPageRow - 1 '次のページの開始位置を探す      '貼り付けた後の状態のダミーを作る   .PageSetup.PrintArea = .Range(PAGE_EXT).Resize(Range(PAGE_EXT).Rows.Count * (PageCount + 1)).Address    aPageRow = ExecuteExcel4Macro("INDEX(GET.DOCUMENT(64),0,0)")   If oPageRow <> aPageRow Then    i = PageCount * aPageRow '次のページの開始位置を探す   End If      Worksheets(MYSHEET).Range(PAGE_EXT).Copy .Cells(i, 1)   .PageSetup.PrintArea = .Range("A1", .Range("A65536").End(xlUp)).Resize(, 24).Address  End With    On Error GoTo 0 End Sub

rx-z5815
質問者

お礼

Wendy02さん、おはようございます。 いつもご丁寧な回答ありがとうございます。 >>『実行時エラー9 インデックスが有効範囲にありません』 >それは、実際のシート名と、マクロのSheets("Sheet1") が合っていないからではないでしょうか?インデックスというのは、シート名のことのはずですから。 とのご指摘がありましたので、シート名を再入力してみましたところ、うまくいきましたので、Wendy02さんのおっしゃるとおり、#1 のhana-hana3 さんのコードを使わせていただきました。 これに、アクティブセルから39行下までを印刷範囲に指定するコードを書き加えて、無事完成しました。 今回、Wendy02さんが記載してくださったコードはとってもムズカシイですね。。。(@_@) 今後の参考にさせていただきます。ありがとうございました。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>『実行時エラー9 インデックスが有効範囲にありません』 どのような方法で実行されていますか? 貼付け先のセル(左上)は選択されていますか?

rx-z5815
質問者

お礼

No.3のWendy02さんの回答より >>『実行時エラー9 インデックスが有効範囲にありません』 >それは、実際のシート名と、マクロのSheets("Sheet1") が合っていないからではないでしょうか?インデックスというのは、シート名のことのはずですから。 とご指摘がありましたので、ひな形(Sheet1)のシート名を再度入力しなおして、コードの方も入力しなおしてみたところ、うまくいきましたので、シート名が一致していなかったようです。 『インデックスが有効範囲にありません』というメッセージがどういうことを意味しているのかがわかりませんでしたので、お手数かけて申し訳ありませんでした。ありがとうございました。

rx-z5815
質問者

補足

>どのような方法で実行されていますか? 標準モジュールに教えていただいたコードを書いて、「Alt」+「F8」キーでマクロを実行しました。 >貼付け先のセル(左上)は選択されていますか? 左上のセルを選択した状態でマクロを実行しました。 お手数かけて申し訳ありませんが、よろしくお願いします。

関連するQ&A

  • エクセルでシートを追加するマクロについて

    マクロ初心者ですよろしくお願いします エクセルでシート1は名前などの入力用、シート2はフォーム用として作成しております シート1のA1から最大でA20(変動あり)に名前を入力すると名前の数だけシート2のコピーが追加され、シート名も入力した名前に変更する場合のマクロはどうすれば良いのでしょうか? またシート2のB1にも入力した名前を表示させたいです ご教授お願いいたします

  • 【Excel】 マクロをチェックして頂けないでしょうか。

    こんにちは 毎月更新するシートを追加する コマンドボタンを設置したいと思います。 シートをコピーし、名前を付けた範囲「翌月繰越」を F6にコピペ。 名前を付けた範囲「クリア範囲」をクリアし、カーソルをG6に置く という、マクロを記録しました。 コマンドボタンをクリックすると、記録したマクロを 実行するようにしましたが、 Range("F6").Select の、ところで止まってしまいます。 どのように修正したら良いでしょうか。 Private Sub CommandButton2_Click() ActiveSheet.Copy Before:=ActiveSheet Application.Goto Reference:="翌月繰越" Selection.Copy Range("F6").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.Goto Reference:="クリア範囲" ActiveWindow.SmallScroll Down:=-48 Application.CutCopyMode = False Selection.ClearContents Range("G6").Select End Sub また、これを実行するとコピー元シートの左側にシートが追加されますが、 コピー元シートの右側に追加するにはどうしたら良いでしょうか。 Excelは2003です。 よろしくお願いいたします。

  • エクセルでページをコピーして貼り付けるマクロ

    [sheet1]内での作業ですが… 雛形のページを1枚作成して、複数枚のページが必要になったので「マクロの記録」で1ページ分の行をコピーして、1ページの下に貼り付けてみました…で、それは実行できるのですが、3ページ目では実行できません。 マクロの知識はありませんが、ページを貼り付ける行が変更できないからだなぁ~と。 ===================== Sub ページを追加() ' ' Macro1 Macro ' マクロ記録日 : 2013/12/12 ユーザー名 : エクセル-NOTE ' ' Rows("9:51").Select Selection.Copy Rows("52:52").Select ActiveSheet.Paste End Sub ===================== 何処でも好きな行を選択してページを増やすことはできないのでしょうか? ただ、単純にページを下へ下へと、必要な分だけ追加したいのです…が。 上の「数行」は見出しに利用しています。

  • 【Excel】マクロで印刷範囲の設定

    Excel2003を使用しています。 マクロで印刷範囲を設定するコードを書きました。ページを追加するマクロを実行したときに一緒に実行するようにしているのですが、コードで指定している範囲外にデータがあるせいか、その列まで印刷範囲に設定されてしまいます。このデータは印刷範囲には入れたくないのですが、どうしたらいいでしょうか? ちなみに、印刷範囲部分のコードは  .PageSetup.PrintArea = Range(Cells(1, 1), Cells(j, 24)) Y1セルとZ1セルにデータが入力されています。マクロを実行すると、印刷範囲がA1:Zjに設定されます。印刷範囲はX列までに設定したいのですが、可能でしょうか?よろしくお願いします。

  • 【Excel】2つのBook間のマクロ

    Excel2003を使用しています。 BookAのSheet1とSheet2のある範囲をそれぞれBookBのSheet1とSheet2に値のみコピーするというマクロを作成しようとしています。 (1)Sheet1を値のみコピーするコード   を書いて (2)Sheet2を値のみコピーするコード   を書こうと思っていたのですが、(1)から(2)へどのように続けて書いたらいいでしょうか? (1)のコードは  Sheets("Sheet1").Range("A1:G30").Select  Selection.Copy  Workbooks.Open Filename:="A:\B.xls"  Sheets("Sheet1").Range("A1").Select   Selection.PasteSpecial Paste:=xlPasteValues   Application.CutCopyMode = False と書いています。 また、こういう場合は、BookAとBookBのどちら側にコードを書いた方がいいのでしょうか?

  • 【Excel365】マクロを削除するマクロ

    特定のシート(仮にAとします)に添付画像のマクロ(別のマクロを実行するマクロ)を組み込んであります。 シートAをコピーしてシートBを作成し、値コピー・行削除などいろいろ編集した後にxlsxとして保存するという作業をしています。 しかし、シートBにも画像のマクロが組み込まれたままなので、1行目を削除するとマクロ「更新」が実行されてしまいます。 シートをコピーした後、画像のマクロを削除する方法はありませんか? 各Q&Aサイトをググるといろいろ出てきますが、理解できませんでした。 もしくは、シートAとそっくりなシート(ページレイアウトや書式もそのままでデータのみ値コピー)を作成するマクロの提示でも構いません。

  • マクロで、新しいシートを作りたい。

    エクセルのマクロを教えてください。 今は、Sheet1のA2に年月日、B2:H2にコード、項目1、項目2、・・・と入力します。 入力が終わったら、マクロを実行し、その後A2:H2をクリアしています。 今回やりたいのは、マクロの実行時に新しいシートを追加し、A2:H2をコピーしたいのです。 1 Sheet1のA2から、年月を取り出す。2003/1/1→200301 2 シートの中に、Sheet200301が有るかどうか調べ、無かったらSheet200301というシートを作る。 3 新しいシートを作ったら、Sheet4のA1:Z2をSheet200301に貼り付ける。 4 Sheet200301の最後の空白行を調べる。(新しいシートを作って最初は2行目になってもらいたい) 5 4で調べた空白行を次の行に貼り付ける。 6 4で調べた空白行にSheet1のA2:H2を貼り付ける。 7 Sheet1のA2:H2をクリアします。 よろしくお願いします。

  • EXCEL2003でマクロを作りたいのですが教えて下さい。

    エクセル2003を使っています。 マクロの初心者なので、 下記のようなマクロの作り方を詳しく教えて下さい。 他にも簡単な方法があればお願いします。     <シート1>               <シート2>   A     B   C  D    A    B  C  D 1 名前 郵便番号 住所 金額   1 名前     2    以下、データ          2 郵便番号 3                    3 住所    ・                   ・ 10                   10           金額                          <シート1>にはA1~D1までデータがあります。(50行) <シート2>の1ページ目に<シート1>の1行目のデータを入れたいです。 <シート1>は全部で50行のデータがあり、 <シート2>は1~10行までを1ページとし、50ページ作りたいです。 いろいろ調べてみたのですが、わからなかったので 説明不足かもしれませんが、よろしくお願いします。

  • エクセルマクロのコードを隠す

    とあるExcel2003で開けるxlsファイルを貰いました。 セルに値を入力すると、セルの背景の色が変わります。 そういうマクロを組んでいるんだと思ったのですが、 シートに対して「コードを表示する」で見ても何も書かれていません。 プロジェクト欄にはこのシートと[ThisWorkbook]しかなく、 [ThisWorkbook]にも何も書かれていません。 組んだマクロのコードを何かして隠しているのでしょうか? それともエクセルの設定でそのようなことが可能なのでしょうか。

  • Excelマクロで質問です。

    Excelマクロで質問です。 Sheet1にデータが入力されていて(ここでは100行入力されているとします)、 Sheet2のA2からE2に数式が入力されています。 ↓ この数式をSheet1のA列に入力されているデータ行数分プラス1(ここでは100+1) Sheet2のA3以降(A3からA103)にコピペするマクロを教えていただけないでしょうか。 100は、毎回変化します。

専門家に質問してみよう