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 ご回答が汎用的・シンプルで一番良い
' # と思います。ご参考までということで。
KenKen_SPさん、おはようございます。
詳しいご回答ありがとうございます<(_ _)>
#3のWendy02さんのご指摘で、確認がてらシート名を入力しなおしたところ、うまくいきました。KenKen_SPさんのおっしゃるとおり、#1 ご回答が汎用的・シンプルで一番良いとのことなので、今回は#1のhana-hana3さんのコードを使わせていただきました。
KenKen_SPさんが記載してくださったコードは今後の参考にさせていただきます。
ありがとうございました。
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
Wendy02さん、おはようございます。
いつもご丁寧な回答ありがとうございます。
>>『実行時エラー9 インデックスが有効範囲にありません』
>それは、実際のシート名と、マクロのSheets("Sheet1") が合っていないからではないでしょうか?インデックスというのは、シート名のことのはずですから。
とのご指摘がありましたので、シート名を再入力してみましたところ、うまくいきましたので、Wendy02さんのおっしゃるとおり、#1 のhana-hana3 さんのコードを使わせていただきました。
これに、アクティブセルから39行下までを印刷範囲に指定するコードを書き加えて、無事完成しました。
今回、Wendy02さんが記載してくださったコードはとってもムズカシイですね。。。(@_@)
今後の参考にさせていただきます。ありがとうございました。
No.2
- 回答日時:
>『実行時エラー9 インデックスが有効範囲にありません』
どのような方法で実行されていますか?
貼付け先のセル(左上)は選択されていますか?
この回答への補足
>どのような方法で実行されていますか?
標準モジュールに教えていただいたコードを書いて、「Alt」+「F8」キーでマクロを実行しました。
>貼付け先のセル(左上)は選択されていますか?
左上のセルを選択した状態でマクロを実行しました。
お手数かけて申し訳ありませんが、よろしくお願いします。
No.3のWendy02さんの回答より
>>『実行時エラー9 インデックスが有効範囲にありません』
>それは、実際のシート名と、マクロのSheets("Sheet1") が合っていないからではないでしょうか?インデックスというのは、シート名のことのはずですから。
とご指摘がありましたので、ひな形(Sheet1)のシート名を再度入力しなおして、コードの方も入力しなおしてみたところ、うまくいきましたので、シート名が一致していなかったようです。
『インデックスが有効範囲にありません』というメッセージがどういうことを意味しているのかがわかりませんでしたので、お手数かけて申し訳ありませんでした。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelのマクロコードについて教えてください。 1 2022/03/27 13:25
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/01/27 13:15
- Excel(エクセル) マクロの付いたExcelが開けません 3 2023/02/01 10:54
- Visual Basic(VBA) VBA For Each 〜 複数条件について 3 2022/10/20 20:05
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/01/26 12:00
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/09 14:54
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/01/23 11:02
- Visual Basic(VBA) VBA Userform転記のみ編集可 1 2023/06/29 11:03
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
エクセルでページをコピーして貼り付けるマクロ
Visual Basic(VBA)
-
エクセルマクロでワードの一ページ目をコピーして新たに二ページを追加して、一ページ目の内容を貼り付ける
Visual Basic(VBA)
-
ExcelVBA Range クラスの PageBreak プロパティを設定できません。
Visual Basic(VBA)
-
-
4
エクセルの2ページ目の作り方
Excel(エクセル)
-
5
エクセルで複数枚になる請求書を作成したい
Excel(エクセル)
-
6
VBAでページ番号、ページ最終行を取得する方法
その他(プログラミング・Web制作)
-
7
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
8
Excelのマクロについて
Visual Basic(VBA)
-
9
【EXCEL】【VBA】空欄は飛ばして処理する方法を教えて下さい。
Excel(エクセル)
-
10
EXCEL VBAでHPageBreaks
Excel(エクセル)
-
11
EXCELで特定のセルに表示された項目をヘッダーやフッターに出力するには
Excel(エクセル)
-
12
エクセルのチェックボックスを保護対象から外すには
Windows Vista・XP
-
13
画像を削除したい(VBA)
Word(ワード)
-
14
別のシートから値を取得するとき
Visual Basic(VBA)
-
15
シートを保護しても入力規則を使えるようにしたい
Excel(エクセル)
-
16
ユーザーフォームに入力したデータを保持する方法
Visual Basic(VBA)
-
17
[Excel]画面上で表示されても、印刷されないようにする方法
Excel(エクセル)
-
18
エクセルVBA 4行飛ばしで転記するループ処理
Excel(エクセル)
-
19
VBA Cのセルが空白でなかったら、Aのセルに順番に数値を入力
Visual Basic(VBA)
-
20
VBA CommandButtonの文字ずれ
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セルに入力するたびにマクロを...
-
VBA Shapes コピーと名前
-
エクセルファイルを値でのみし...
-
VBAで行コピーして挿入
-
Excelでマクロ実行中に画面を固...
-
EXCEL 行番号や列番号が選択で...
-
VB.NETによるEXCELの行挿入
-
ブックの共有でVBAエラー
-
CSVデータをEXCELのテーブルに...
-
worksheet_changeの一時無効化
-
【Excel】マクロでページを追加...
-
VBAで保存しないで閉じると空の...
-
WPSOffice_マクロの有効化について
-
Excel マクロの編集がグレーに...
-
Excelのマクロでボタンを押すと...
-
エクセル ボタンに設定したマク...
-
エクセルで、「いいね」のよう...
-
マクロの保存先、開いてるすべ...
-
エクセルの表を複数枚印刷した...
-
エクセルの、記録を終了したマ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでマクロ実行中に画面を固...
-
エクセルファイルを値でのみし...
-
エクセル連番自動印刷について
-
【Excel】マクロでページを追加...
-
VBA Shapes コピーと名前
-
エクセル マクロ写真帳に一括で...
-
セルに入力するたびにマクロを...
-
エクセルVBAで納期管理システム...
-
EXCEL VBA 他のアプリケーショ...
-
エクセル 図形の寸法を取得したい
-
VBAで行コピーして挿入
-
EXCEL 行番号や列番号が選択で...
-
ブックの共有でVBAエラー
-
エクセルのマクロについて教え...
-
【ExcelVBA】マクロブックを通...
-
エクセルファイルの回数期限の...
-
VB.NETによるEXCELの行挿入
-
グラフ要素のセルを参照したい...
-
再度,ExcelVBA,public変数が消える
-
VBAの記述について 値のみの貼...
おすすめ情報