• ベストアンサー

【エクセル】シート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

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

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 と指定して、そこからパラメータを取ってくることもやろうと思えばできますが。

sartan
質問者

お礼

遅くなってすみません。 参考にさせていただきました! ありがとうございました!!

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

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や関数式を使わない方式は、スグ目の前に見えて来ています。

sartan
質問者

お礼

遅くなってすみません。 参考にさせていただきました! ありがとうございました!!

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

とりあえず作ってみました。 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に修正して実行してください。

sartan
質問者

補足

お~!すごい!! ありがとうございます! ちなみに、特定の行だけ印刷しないようにするには どのように記述したらよろしいのでしょうか??

  • ape5
  • ベストアンサー率57% (85/148)
回答No.1

********************************************************** 【下見】シート  ⇒ 【チェックリスト】シート (連番: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個あるとか?? もう少し詳しく書いたほうがよろしいかと。 (例えばサンプルを載せるとか)

sartan
質問者

補足

D9~D100に入っている各データを、【チェックリスト】のC1とJ6のセルに差し込みたく、 G9~G100の各データを【チェックリスト】C6のセルに差し込みたいのです。 92件のデータを1枚1枚に差し込み、それらを連続印刷したいということなのですが・・・ 上手く表現できず、すみません。

関連するQ&A