- ベストアンサー
マクロで連続印刷
いつもお世話になっております。 困っておりますのでお願い致します。 エクセルでSheet1のリスト(住所ろくのようなもの)のデータを Sheet2の特定の形式(はがきのフォーマットのようなもの) に反映させていって(リストの一番うえから入力のある通し番号のところまで) 印刷をするマクロはないでしょうか? ただし、お恥ずかしながら当方はマクロといえば 「マクロを記録⇒操作⇒マクロの保存」程度の知識しかありません。 お手数で申し訳ないのですがご教示下さい。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 Wordを使って実行できればNo2の方の方法が最適かと思います。 Excelだけでよろうと思えばVBAの作成です。長くなりますがExcel2007の場合の処理を書いておきます。(1)~(2)は、マクロの記録です。 (1)sheet1からデータをコピーし、sheet2へ貼り付け、印刷するマクロを作成しておく。 →表示メニューからマクロ、マクロの記録 →sheet1のデータをひとつコピー。sheet2の適当な場所に貼り付け。 →印刷をする。 →表示メニューからマクロ、マクロの終了 (2)できあがったマクロを、VBA命令で編集する。 →表示メニューからマクロ、マクロの表示 →作成されているマクロを選び、編集ボタン。 →MicrosoftVisualBasicの編集ウィンドウが開く。 (3)VBAを作成。 Sub Macro1() ' ' Macro1 Macro ' Range("B2").Select ←セルB2を選んだ。 VBA(1) Selection.Copy ←コピーをした。 VBA(2) Sheets("Sheet2").Select ←sheet2に移動した。 VBA(3) Range("E5").Select ←セルE5を選んだ。 VBA(4) ActiveSheet.Paste ←貼り付けをした。 VBA(5) Application.CutCopyMode = False ←コピー、貼り付けモード終了 VBA(6) ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" ←印刷した。 VBA(7) End Sub の様な命令が表示される。(内容は右のような感じです) (4)編集内容 ■VBA(1)より前に行う作業 ・本当に実行していいかの確認。 i = msgbox("印刷を実行してよろしいですか。",vbokcancel) if i=2 then exit sub 'キャンセルが選ばれたとき終了する。 ・確実にデータを取るようにsheet1へ移動する。 Sheets("Sheet1").select ・何行目からデータが入っているかの指定。 i=2 '2行目からがデータの時 変数iで行を指定 ・通番があれば繰り返す。A列に通番があるとすると。 while cells(i,1)<>"" 'i行目、項目1つめ(項目A) が空欄でなければ繰り返し実行 ■VBA(1)(2)セルを選んで、クリップボードのコピー より、変数に入れてsheet2に貼り付け の方がよい。VBA(1)(2)を修正。 ・変数にデータを取り込む。B列に名前、C列に住所とすると。 b=cells(i,2) 'i行目、項目2つめ(B項目)からデータを変数bに取り込む。 c=cells(i,3) 'i行目、項目3つめ(C項目)からデータを変数cに取り込む。 必要に応じてさらに追加。 ■VBA(3) シート2へ移動・・・・このまま Sheets("Sheet2").Select ■VBA(4)(5)は、セルを選んで、貼り付け VBA用に変更 ・指定したセルに、データを書き込む cells(5,5) = b '名前データbを、セル5行目、5項目目(セルE5)に書き込む cells(3,4) = c '住所データcを、セル3行目、4項目目(セルC4)に書き込む 必要に応じてさらに追加。 ■VBA(6)そのまま Application.CutCopyMode = False ■印刷の処理 VBA(7) 印刷はそのまま使います。 ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" ■VBA(7)の後に行う作業。 ・次の行に移動する。 i=i+1 '行変数iを次の行にする。 ・繰り返しの最後の指定 Wend '繰り返しの終わりポイント まとめると i = msgbox("印刷を実行してよろしいですか。",vbokcancel) if i=2 then exit sub 'キャンセルが選ばれたとき終了する。 Sheets("Sheet1").select i=2 '2行目からがデータの時 変数iで行を指定 while cells(i,1)<>"" 'i行目、項目1つめ(項目A) が空欄でなければ繰り返し実行 b=cells(i,2) 'i行目、項目2つめ(B項目)からデータを変数bに取り込む。 c=cells(i,3) 'i行目、項目3つめ(C項目)からデータを変数cに取り込む。 必要に応じてさらに追加。 Sheets("Sheet2").Select cells(5,5) = b '名前データbを、セル5行目、5項目目(セルE5)に書き込む cells(3,4) = c '住所データcを、セル3行目、4項目目(セルC4)に書き込む 必要に応じてさらに追加。 Application.CutCopyMode = False ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" i=i+1 '行変数iを次の行にする。 Wend '繰り返しの終わりポイント (5)VisualBasicの画面を閉じて終了。 マクロを実行するとすべての行の印刷をします。 このVBAは、sheet1の2行目からデータ、A項目に通番、B項目に名前、C項目に住所があるものとし、sheet2のC4に住所をE5に名前を入れて印刷するように作りました。 A項目は、通番と言うより何か入っていれば、印刷処理を実行します。 VBAを使うといろいろなことができます。頑張ってください。
その他の回答 (5)
- zap35
- ベストアンサー率44% (1383/3079)
以前の回答で申し訳ありませんが、使えるかもしれません。 http://oshiete1.goo.ne.jp/qa3064424.html
- Zero_0
- ベストアンサー率35% (72/201)
No1です。 指定した行までと言うのは、常にはじめから何行という指定でしょうか。 それであれば数値を入力させて、その後While~Wendの部分をfor~nextでループすればいいかと思います。 suu=inputbox("何行印刷しますか。") for i=2 to suu +1 'suu+1 2行目から始まるので+1 処理の部分 next i という形で また、指定した番号だけ印刷するというのであれば 連番を取り込んだ後、if文で判定して、処理を実行させるとか。 の方法をとります。
- papayuka
- ベストアンサー率45% (1388/3066)
既に指摘があるようにWordと連携した方が簡単で Excel だけでやるのはVBAが必要です。 大変ですがあえて Excelだけでやる方法の一例として回答します。 Sheet1 の A1:C1 がタイトル行で 「通し番号」「氏名」「住所」とします。 Sheet1 の A2:C10 が住所リストとします。 Shhet1 の A2:C10 には 1~9 が入力されているします。 Sheet2 の A1 を通し番号を入れるセルとします。 これでSheet2の適当なセルに =IF(ISERROR(VLOOKUP($A$1,Sheet1!$A$2:$C$10,2,0)),"",VLOOKUP($A$1,Sheet1!$A$2:$C$10,2,0)) =IF(ISERROR(VLOOKUP($A$1,Sheet1!$A$2:$C$10,3,0)),"",VLOOKUP($A$1,Sheet1!$A$2:$C$10,3,0)) とすると、Sheet2 の A1 に通し番号を入れる事で「氏名」「住所」を表示するようになります。 次に Sheet2 の A1 以外を選択した状態からマクロ記録を開始し A1 に 1 を入れて印刷をするマクロを記録します。 下記のような記述になりました。 Sub Macro1() Range("A1").Select ActiveCell.FormulaR1C1 = "1" Range("A2").Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True End Sub これをループさせるように書き換えます。 ループの構文は For ~ Next など数種類しかないので覚えておくと便利です。 Sub Macro1() Worksheets("Sheet2").Select 'Sheet2を選択する文を追加 Range("A1").Select For i = 1 To 9 'ループ開始番号と終了番号を追加 ActiveCell.FormulaR1C1 = i '変数 i を代入するように修正 ' Range("A2").Select '不要な記述なので削除 ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True Next i '次へループ End Sub
- hayasi456
- ベストアンサー率40% (2402/5878)
ワードの「はがき印刷ウィザード」「差し込み印刷ウィザード」を利用してみてはいかがですか。 エクセルのデーターから作成出来ます。うまくフォーマットが出来れば 後はご希望の作業をしてくれます。 http://www.eurus.dti.ne.jp/~yoneyama/Word/ouyou/w-sasiko.html http://www.eurus.dti.ne.jp/~yoneyama/Word/ouyou/w-label.html
- Zero_0
- ベストアンサー率35% (72/201)
Excelのマクロ機能だけでは、連続印刷は難しいと思います。 VBAをつかって、(マクロの拡張編集のようなもの)作成する必要があります。 お使いのofficeは2003ですか、2007ですか? 考え方は、sheet1データの1行目から順にデータを変数に取り込み、sheet2の所定の場所に貼り付け、印刷をする。 これを順に通し番号の無くなるまで行えばいいと思います。
お礼
丁寧なご説明を頂き誠にありがとう御座います。 早速ためさせて頂こうかと思いますが、 例えば、指定した行までを限定して印刷をかけるとかは不可能でしょうか? またとりあえず2シート目には VLOOKUP関数で表示させているのですが それでも可能でしょうか?