• ベストアンサー

マクロで連続印刷

いつもお世話になっております。 困っておりますのでお願い致します。 エクセルでSheet1のリスト(住所ろくのようなもの)のデータを Sheet2の特定の形式(はがきのフォーマットのようなもの) に反映させていって(リストの一番うえから入力のある通し番号のところまで) 印刷をするマクロはないでしょうか? ただし、お恥ずかしながら当方はマクロといえば 「マクロを記録⇒操作⇒マクロの保存」程度の知識しかありません。 お手数で申し訳ないのですがご教示下さい。

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

  • ベストアンサー
  • Zero_0
  • ベストアンサー率35% (72/201)
回答No.4

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を使うといろいろなことができます。頑張ってください。

zonu
質問者

お礼

丁寧なご説明を頂き誠にありがとう御座います。 早速ためさせて頂こうかと思いますが、 例えば、指定した行までを限定して印刷をかけるとかは不可能でしょうか? またとりあえず2シート目には VLOOKUP関数で表示させているのですが それでも可能でしょうか?

その他の回答 (5)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.6

以前の回答で申し訳ありませんが、使えるかもしれません。 http://oshiete1.goo.ne.jp/qa3064424.html

  • Zero_0
  • ベストアンサー率35% (72/201)
回答No.5

No1です。 指定した行までと言うのは、常にはじめから何行という指定でしょうか。 それであれば数値を入力させて、その後While~Wendの部分をfor~nextでループすればいいかと思います。 suu=inputbox("何行印刷しますか。") for i=2 to suu +1    'suu+1 2行目から始まるので+1 処理の部分 next i という形で また、指定した番号だけ印刷するというのであれば 連番を取り込んだ後、if文で判定して、処理を実行させるとか。 の方法をとります。

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

既に指摘があるように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)
回答No.2

 ワードの「はがき印刷ウィザード」「差し込み印刷ウィザード」を利用してみてはいかがですか。 エクセルのデーターから作成出来ます。うまくフォーマットが出来れば 後はご希望の作業をしてくれます。 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)
回答No.1

Excelのマクロ機能だけでは、連続印刷は難しいと思います。 VBAをつかって、(マクロの拡張編集のようなもの)作成する必要があります。 お使いのofficeは2003ですか、2007ですか? 考え方は、sheet1データの1行目から順にデータを変数に取り込み、sheet2の所定の場所に貼り付け、印刷をする。 これを順に通し番号の無くなるまで行えばいいと思います。