こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

一覧 → 帳票へ転記 → 自動差込印刷

Excel2013使用

シートAに一覧表があり、それをシートBの帳票に
vlookupを使って転記をしています。


現在の状況です↓

【シートA】(一覧表)

・A列には、1~30の通し番号があらかじめ入っています
・1行目は、項目名が入っています

よって、実際のデータは「B2」から始まります



【シートB】(帳票)

・セル「B6」に、シートAのA列の番号を入力すると、その他の
 項目がvlookupによって自動で反映されます



ここからが本題です。

現在、シートBの帳票を印刷する際は、セルB6に手で「1」と入力→「印刷」
次に「2」と入力→印刷・・・という風にしています。

日によっては20以上になる事もあるので、自動で印刷が出来れば…と思います。

なにとぞよろしくお願いいたします。

投稿日時 - 2017-04-04 15:14:29

QNo.9313280

暇なときに回答ください

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

4です。
日本語ってのは難しいものですね(笑)。
「テストプリントすると用紙が勿体ないので、
 テストの間はプレビューを表示するようになさったらいかがでしょう?
 そうすればテストプリント用紙は無駄になりませんよ。
 うまくいくことを確認できたら、印刷に戻すと良いですよ。」
の意味で申し上げたつもりだったのですが(笑)。

本来ですと、これ以上は「作成依頼」とみなすところではありますが・・
なんとなく、乗り掛かった舟。
Sub SampleMacro()
    For i = 2 To Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
        Worksheets("Sheet2").Range("B6") = Worksheets("Sheet1").Cells(i, 1)
        Worksheets("Sheet2").Range("A1:B31").PrintPreview
    Next
End Sub
まずは、コレをお試しください。
で、今までのモノと何が違うか、ご自身でもお考え(お調べ)下さい。
それが理解への近道です。

上記が理解出来たら次は
Sub SampleMacro2()
    For i = 2 To Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
        With Worksheets("Sheet2")
            .Select
            .Range("B6") = Worksheets("sheet1").Cells(i, 1)
            .Range("B6").Select
        End With
        If MsgBox(i - 1 & "ページ目を印刷します", vbOKCancel) = vbCancel Then
            MsgBox "以降の印刷を中止します"
            Exit Sub
        Else
            Worksheets("Sheet2").Range("A1:B31").PrintPreview
        End If
    Next
End Sub
これとの違いをお考え(お調べ)ください。
 ワークシート上で入力データの確認
    ↓
 OKで印刷(プレビュー)/CANCELで中止
をページ(データの行)の数だけ繰り返します。
なお、プレビュー画面はEscキーで閉じることができます。
確認が終わったらPrintPreviewをPrintOutに書き直し、
少数ページ(2~3ページ)でお試しください。

もちろん、印刷前の確認を飛ばすことも可能ですが、
仰る通り数十ページにわたる場合は入力ミスに気付いてしまうと
印刷したすべてが無駄になる可能性もありますね。
なので、印刷前のチェックを促すため、印刷前にOK/CANCELを問うわけです。
ただし、これだとページの数だけクリックが必要です。
それでは自動化した利便性ってどこにあるのか?という疑問が生じます。
印刷対象の行番号を指定して、入力データを確認。
Ctrl+Pで印刷画面を表示、Enterキーで印刷。
実際のところ、ショートカットキーを知れば手間hばかなり省けるはずです。
なので、正直なところを言わせていただくと
「(大量)印刷は自動化は積極的にオススメしない。
 エクセルの基本機能で簡略化可能なのではないか?」
というのが個人的な意見ではあります。

投稿日時 - 2017-04-12 18:51:34

お礼

tsubu-yuki様

ご指導ありがとうございました。

私の読解力不足のため、プレビューの意味がわからず申し訳
ありませんでした。


とりあえず先に結論から申し上げますと、まさに私が希望して
いた通りの印刷ができました。

ありがとうございました。

が、今回は私の無知を痛感いたしました。

このサイトに質問する前に、自分でも色々調べてはみたのですが、
なかなか思ったような物を見つけられず…。

私は安易に「こんなのきっと簡単にできるだろう」と思っていた
のですが、そもそもそれが間違いだったと分かりました。

tsubu-yuki様のおっしゃる通り、

「(大量)印刷は自動化は積極的にオススメしない。
 エクセルの基本機能で簡略化可能なのではないか?」

という前提があるからこそ、事前に探しても探しても答えが
無かったのですね。

教えて頂いたVBAの詳しい内容については、職場では考える時間が
ないので、自宅でゆっくり調べてみます。

取り急ぎお礼まで。

本当にありがとうございました。

投稿日時 - 2017-04-14 17:00:29

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

プリントアウトすると紙が~~~とのこと。
ま、確かに無駄にはなりますが、確認するには必要な作業なのですよ。
ということを頭に置いていただきたいところです。

さて。

Worksheets("Sheet2").Range("A1:B31").PrintOut
         ↓
Worksheets("Sheet2").Range("A1:B31").Printpreview
に直してお試しくださいませ。
これだと多分、時間以外は無駄が出ませんから。

投稿日時 - 2017-04-07 17:47:37

補足

月初で多忙だったため、返信が遅くなり申し訳ありませんでした。

ご指摘ありがとうございました。

だいぶんイイ感じになりました。

今回、sheet1の元データは3行のみという状態で試したのですが、
印刷ウィンドウは、No.6まで出てきました。

ウィンドウには「OK」ボタンしかないので、4~6までは×で閉じて
強制的に閉じました。(×で閉じた分は印刷されませんでした)

なので、欲を言えば…

 ・sheet1の元データの数だけウィンドウが表示される
  もしくは
 ・×で閉じたら、それ以降はもうウィンドウが表示されない
  (×で閉じるのが1回で済む)

…ように、もし出来たら嬉しいです。

出来なくても、だいぶ楽にはなりました。

ありがとうございます。

投稿日時 - 2017-04-12 16:07:00

ANo.3

差し込み印刷については Wordを使った方が簡単です。

差し込みしたい部分は抜いた状態で人数分出力し 連番だけ Wordで差し込み
印刷(手差し)したらどうですか? 多分 VBAの知識がない人にマクロは難
しいと思います。

投稿日時 - 2017-04-06 10:20:54

お礼

ご提案ありがとうございました。

おっしゃる通り、素人にVBAは難しかったです。

差込印刷も選択肢の一つにしたいと思います。

投稿日時 - 2017-04-14 17:04:09

ANo.2

うまく行かないとのことですが、下記に具体例で説明します。
Sheet1 原本データA1:E5見出しも含めているので自室データは3行(3人分)です
生徒番号氏名組通学所属
1234木村 正人2山田地区バスケ
2313鈴木 滋1下谷地区サッカー
3321山村 美香3川上地区美術
Sheet2
印刷帳票 と  行指定のための数字がH2セルに入る
生徒カードのレイアウトを模した、セルの配置図
生徒カード

氏名山村 美香<--C4セル
生徒番号3321<--C5セル

通学地区(自宅川上地区 <--E7セル

所属    美術   <--E9セル
ーーー
H2セルには1が入っています。
C4セルの氏名の関数式 =INDEX(Sheet1!$A$3:$E$9,$H$2,2)
C5セルのせいあさ生徒番号の関数式 =INDEX(Sheet1!$A$3:$E$9,$H$2,1)
E7の通学地区の関数式 =INDEX(Sheet1!$A$3:$E$9,H2,4)
E9の所属の関数式  =INDEX(Sheet1!$A$3:$E$9,$H$2,5)
ここでH2の数字を1づつ増やして、降らした瞬間にVBAから自動で、PrintOut指令を出します。
Sub test01()
For i = 1 To 3
Worksheets("Sheet2").Range("H2") = i
Sheets("Sheet2").Activate
MsgBox "準備完了" '画面を見てOKをクリック。確認のため
Worksheets("Sheet2").Range("A1:F10").PrintOut
Next i
End Sub
一応当方でテストはしてます。3枚の紙は無駄になりますが、やってみて仕組みを理解してください。VBAを少しわかる人は、回り道的な方法です。関数になれた人をVBAに導く方法です。関数だけでは、印刷は絶対できないので、PrintOutのVBAの1行は使わざるを得ない・やむを得ないのです。
このコツを理解し、自分の質問のケースに変えてやって見ましょう。また要求が増えたとき、VBAをどう変えるべきか、初心者あての説明が苦労するところです。
例えば不要な行は印刷しないとか、上記でh3としている、行数をどうとらえるかなど
色々あります。
なおSheet2のセルの色や枠線の有無、フォントなどはVBAでもできますが、当面手動操作で、凌いでください。

投稿日時 - 2017-04-05 18:42:14

お礼

色々教えていただきありがとうございました。

素人の私には、やはりVBAは難しかったです。

少しずつ勉強してみます。

投稿日時 - 2017-04-14 17:05:44

ANo.1

この課題はVBAというものを使うとよい。ForNextという(繰り返しの)仕組みがあって、例えば「i」という変数を1->2->3->・・とプログラムで自動で順次変化させる(してくれる)方法がある。この仕組みはVBAの「イの1番」と言ったものです。

標準モジュールというところに
以下標準モジュールやVBAやForNextについては、WEBでなどで(たとえばGoogleで)照会してください。
Sub test01()
For i = 1 To 6
MsgBox i '確認用
Worksheets("Sheet1").range("R1")=i 'R1セルに連続数を順次入れる
Worksheets("Sheet1").Range("A1:J50").PrintOut
Next i
End Sub
このR1セルの i によって、元データシートの何行目のデータを使って、印刷帳票項目を作るかは、エクセル関数INDEX関数などでできる。
例えば帳票の印刷範囲以外の1セルに、 「i」が決める数字を入れて、関数ではそのセルの値を使って、行番号として関数で使い、列(列はいつも決まっているのが普通(会社名はC列のように)して、項目内容を決める。
仕事にエクセルを使いだすと、VBAが必須というのが持論だが、とうとうその岸まで質問者はやってきたのだ。
ーー
帳票シートは1枚を中身項目を変えて、毎回印刷で使いまわすことにする。
今はメモリが豊富になって、1帳票1シートなどに作る人がいそうだが、昔はメモリが少なく、狭いメモリを使いまわしたので、こういう発想が伝統にある。Googleで「imogasi 請求書」で照会すれば、過去に回答した中に類似のことを何度も答えている。
Googleで
「エクセル 行と列指定してデータ参照」
Excel- 行と列の交差する位置の値を取り出すIndex 関数
http://office-qa.com/Excel/ex48.htm
この質問麻場合項目によって列だけ手動で指定することになり行はVBAのiが決めることになる。
項目の配置場所は、関数を入れるセルということになる。
体裁は、どのセルに関数を入れるか、行高、セル幅などで決まる。
フォントなどは手動設定でまずやる(VBAででもやれるが先の課題)

投稿日時 - 2017-04-04 16:51:06

補足

すみません、上手く行きませんでした。

実行するとウィンドウが出てきますが、「OK」のボタンしかありません。

sheet1の一覧表が3行しかなくても、「OK」ボタンは延々と表示され
「×」で閉じても延々とプリントされ続けるので、仕方なくプリンター側で
ジョブの強制終了をしました。


ちなみに、下記のように内容を変更しました

Sub 印刷実行()
For i = 1 To 6
MsgBox i '確認用
Worksheets("Sheet1").Range("B6") = i 'B6セルに連続数を順次入れる
Worksheets("Sheet2").Range("A1:B31").PrintOut
Next i
End Sub

実行したあとで、3行目の

Worksheets("Sheet1").Range("B6") = i

Worksheets("Sheet2").Range("B6") = i

に変えるべきだと気づきましたが、またプリントが大量に出てしまうと困るので
それで上手く行くのか?検証できずにいます。

※一覧表はsheet1で、帳票はsheet2になります

投稿日時 - 2017-04-05 16:57:20

あなたにオススメの質問