- ベストアンサー
【エクセル】シート1からシート2への差込印刷・連続印刷
約90件ほどのデータを差込印刷したいのですが、 VBAに詳しくないので苦戦しております。 VBAが得意な方、どうかお教え願います。 ●【下見】シートに入っているデータを【チェックリスト】シートに差し込みたい。 【下見】シート ⇒ 【チェックリスト】シート (連番:A9~A100) コード:D9~D100 ⇒ C1、J6 名前:G9~G100 ⇒ C6 住所:L9~L100 ⇒ C7 TEL:I9~I100 ⇒ IJ7(IとJは統合されています) 上記の通り、【下見】シートのデータを【チェックリスト】シートに表示させたいのです。 よろしくお願い致しますm(_ _)m
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。 特定の行だけ印刷しない、という機能はないのですが、わけあって暇なので機能追加してみました。 まず、さきほどのマクロを以下のものに置きかえます。(1行目のOption Base 1から) Option Base 1 Sub 差し込み印刷() Dim i As Integer, j As Integer Dim IsPrintOut As Integer, IsAutoPrint As Integer Dim WS1 As Worksheet, WS2 As Worksheet Dim Skip() As Variant, IsSkip As Boolean Const FromNum As Integer = 9 '印刷を開始する行 Const ToNum As Integer = 100 '印刷を終了する行 Skip = Array() '印刷をスキップする行をコンマで区切って書く Set WS1 = Worksheets("下見") Set WS2 = Worksheets("チェックリスト") IsPrintOut = MsgBox("処理を選択してください" & vbCrLf & _ "「はい」→印刷" & vbCrLf & _ "「いいえ」→プレビュー" & vbCrLf & _ "「キャンセル」→中止", _ vbYesNoCancel, "処理の選択") If IsPrintOut = vbCancel Then Exit Sub IsAutoPrint = vbNo For i = FromNum To ToNum IsSkip = False If UBound(Skip) <> 0 Then For j = 1 To UBound(Skip) If i = Skip(j) Then IsSkip = True Exit For End If Next End If If IsSkip = False Then WS2.Range("C1").Value = WS1.Cells(i, "D").Value WS2.Range("J6").Value = WS1.Cells(i, "D").Value WS2.Range("C6").Value = WS1.Cells(i, "G").Value WS2.Range("C7").Value = WS1.Cells(i, "L").Value WS2.Range("I7").Value = WS1.Cells(i, "I").Value If IsPrintOut = vbYes Then WS2.PrintOut Else WS2.PrintPreview End If If IsAutoPrint = vbNo Then IsAutoPrint = MsgBox("続行しますか?" & vbCrLf & _ "「はい→残りを連続して処理" & vbCrLf & _ "「いいえ」→次も確認メッセージを出す" & vbCrLf & _ "「キャンセル」→処理を中止", _ vbYesNoCancel, "印刷の確認") If IsAutoPrint = vbCancel Then Exit Sub End If End If Next End Sub 上記マクロの中に Skip = Array() '印刷をスキップする行をコンマで区切って書く という行があります。このままだと指定した範囲を全部印刷しますが、これを Skip = Array(20,21,22) のように指定すると、ここで指定した行(上の例では20~22行)を印刷しないようにできます。 実行するたびにマクロの中をいじるのは本来あまりよくないので、「印刷パラメータ」というようなシートを別に作って、そこに A B 1 開始行 9 2 終了行 100 3 スキップ行 20,21,22 と指定して、そこからパラメータを取ってくることもやろうと思えばできますが。
その他の回答 (3)
- imogasi
- ベストアンサー率27% (4737/17069)
VBAに余りなれてないのでしょうから、関数と組み合わせた方法を お勧めします。自分ではこのアイデアをimogasi方式と思ってます。 ーー それは、チェックシートの印刷範囲外に、作業セルをつくり(仮にここではO1セルとする)、行数を入れるものにします。その行数とは下見シートで今注目している行の行番号数です。 その行数を、VBAで1ずつ変化させては印刷、変化させては印刷を VBAでやる方法です。そうすると、このプログラムは下記のように、非常に簡単です。 VBE画面で、標準モジュールに Sub test01() Sheets("sheet2").Activate For i = 9 To 99 Cells(1, "O") = i Range("a1:h30").PrintOut Next i End Sub ーーー 下見シートの G6以下G列に例えば 山田 大下 木村 浦田 ・・ の名前が有るとします。 他列も推定できると思うので略。 ーーー チェックリストでの、氏名を表示するC6セルに 関数式=INDIRECT("下見シート!G"&O1)を入れます。 ーー O1を9にするとC6に山田、 O1を10にするとC6に大下、 O1を11にするとC6に木村、 ・・ とC6の値が変化します。 他の項目についても、まねてINDIRECT関数で入れてみてください。(略) ーーー このO1セルの値の変化をVBAプログラムで自動的に行い、その直後にPrintOutメソッドを実行し印刷します。 印刷範囲は普通固定されているので、上記Range("a1:h30").は適当に 指定してください。 ーー チェックシートの体裁(標題、罫線、行高、列幅、フォントサイズ、色、表示形式など)は全て、今は事前に手動で行ってください。 学が進むとVBAででもできるようになります。 ーー スキップする分も、複雑な条件で化ければ、VBAコードにIF文を入れて、スキップするようにできます。 ーー この方式の良さ(=関数になじんだ方にとっての判りやすさ)や、回りくどさが判るようになれば、それだけVBAになれた証拠で、おめでたいことです。そうなれば、Q1や関数式を使わない方式は、スグ目の前に見えて来ています。
お礼
遅くなってすみません。 参考にさせていただきました! ありがとうございました!!
- ham_kamo
- ベストアンサー率55% (659/1197)
とりあえず作ってみました。 Alt+F11でVBAの画面を起動し、「挿入」>「標準モジュール」を選択して、右の画面に以下のマクロをコピーして貼り付けてください。 Sub 差し込み印刷() Dim i As Integer Dim IsPrintOut As Integer, IsAutoPrint As Integer Dim WS1 As Worksheet, WS2 As Worksheet Const FromNum As Integer = 9 Const ToNum As Integer = 100 Set WS1 = Worksheets("下見") Set WS2 = Worksheets("チェックリスト") IsPrintOut = MsgBox("処理を選択してください" & vbCrLf & _ "「はい」→印刷" & vbCrLf & _ "「いいえ」→プレビュー" & vbCrLf & _ "「キャンセル」→中止", _ vbYesNoCancel, "処理の選択") If IsPrintOut = vbCancel Then Exit Sub IsAutoPrint = vbNo For i = FromNum To ToNum WS2.Range("C1").Value = WS1.Cells(i, "D").Value WS2.Range("J6").Value = WS1.Cells(i, "D").Value WS2.Range("C6").Value = WS1.Cells(i, "G").Value WS2.Range("C7").Value = WS1.Cells(i, "L").Value WS2.Range("I7").Value = WS1.Cells(i, "I").Value If IsPrintOut = vbYes Then WS2.PrintOut Else WS2.PrintPreview End If If IsAutoPrint = vbNo Then IsAutoPrint = MsgBox("続行しますか?" & vbCrLf & _ "「はい→残りを連続して処理" & vbCrLf & _ "「いいえ」→次も確認メッセージを出す" & vbCrLf & _ "「キャンセル」→処理を中止", _ vbYesNoCancel, "印刷の確認") If IsAutoPrint = vbCancel Then Exit Sub End If Next End Sub マクロを実行したら、最初に印刷か印刷プレビューか選択できます。 1枚印刷または印刷プレビューを実行したあと、確認メッセージが出ます。そのまま残りを一括処理するか、次も確認メッセージを出すか、処理を中断するか選択できます。 特定の行だけ再印刷したい場合は、 Const FromNum As Integer = 9 Const ToNum As Integer = 100 の部分が印刷する最初と最後の行の指定なので、たとえば20行目だけやりなおしたいときは、これらの数を両方20に修正して実行してください。
補足
お~!すごい!! ありがとうございます! ちなみに、特定の行だけ印刷しないようにするには どのように記述したらよろしいのでしょうか??
- ape5
- ベストアンサー率57% (85/148)
********************************************************** 【下見】シート ⇒ 【チェックリスト】シート (連番:A9~A100) コード:D9~D100 ⇒ C1、J6 名前:G9~G100 ⇒ C6 住所:L9~L100 ⇒ C7 TEL:I9~I100 ⇒ IJ7(IとJは統合されています) ********************************************************* 上記のところでD9~D100と92件がC1とJ6の二つになるとは? 同じようにG9~G100の92件がC6の一つになるとは? もしかして、【チェックリスト】っていうシートが92個あるとか?? もう少し詳しく書いたほうがよろしいかと。 (例えばサンプルを載せるとか)
補足
D9~D100に入っている各データを、【チェックリスト】のC1とJ6のセルに差し込みたく、 G9~G100の各データを【チェックリスト】C6のセルに差し込みたいのです。 92件のデータを1枚1枚に差し込み、それらを連続印刷したいということなのですが・・・ 上手く表現できず、すみません。
お礼
遅くなってすみません。 参考にさせていただきました! ありがとうございました!!