• 締切済み

VBAによる自動印刷について

エクセル初心者です。VBAのことで教えていただきたいです。 VBAを使って項目ごとにオートフィルタ→抽出されたものを印刷というのを、したいのですがどういったコードを書けばよいか、調べてみましたがしっくりくるものがありませんでした。 イメージ的には名前毎にフィルターをかけて、 その結果を印刷したいのですが、どのようなコードになるのでしょうか。 全部で2000行くらいあるので、いちいちフィルターをかけて→印刷 を手でしていると時間がかかります。(名前も重複なしで1000以上あるので、、、) フィルター→印刷、次の名前でフィルター→印刷を自動化するには どうすればよいのでしょうか。 説明が下手ですみませんが、できれば実際のどういったコードになるのかを教えていただきたいです。

みんなの回答

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

#2です。 色々な処理方法があると書いたので、別のやり方の例を挙げてみます。 (1)#2はいわばFilter法です (2)下記はソート法とでも言うべき方法です。 エクセルをVBAでなく、操作法で使いこなしてないと、適当な処理ロジックは思い浮かばないのです。大切なのは、VBAコード以前に、この点なのです。 コード数は少なくなったり、間違いが出にくかったり、あとに読んだ人が 何をどうやっているか、理解しやすくなったりします。 だからVBAコードの回答を求めて丸写ししようという態度は的を得ていない。 ーー データ例は#2のSheet1をSheet3にコピペして、Sheet4も用意して実行します。 今回は各氏名ごとに印刷する処理にしてます。 本番的なケースの実行ではMsgbox行はすべて削除して実行すること。 Sub test02() '--Sheet4の最終行 lr = Worksheets("Sheet3").Range("A10000").End(xlUp).Row MsgBox lr '---Sheet4見出しセット Worksheets("sheet3").Range("a1:G1").Copy Worksheets("Sheet4").Range("a1") '---Sheet4のデータ部をクリア Worksheets("sheet4").Range("A2:G10000").Clear '--Sheet3をA列=氏名でソート Worksheets("Sheet3").Range("A2:D9").Sort key1:=Worksheets("sheet3").Range("A1") '--最初の市名開始行を初期設定 k = 2 '--繰り返し Do MsgBox "氏名グループ先頭 " & k 'その氏名グループ先頭行 c = WorksheetFunction.CountIf(Worksheets("Sheet3").Range("A2:A" & lr), Worksheets("Sheet3").Cells(k, "A")) MsgBox "件数 " & c 'その氏名該当件数 '--Sheet4へコピー貼り付け Worksheets("Sheet3").Range("A" & k & ":D" & (k + c - 1)).Copy Worksheets("sheet4").Range("A2") Worksheets("Sheet4").Activate MsgBox "AA" '--印刷 Worksheets("Sheet4").Range("A1:G" & k + c - 1).PrintOut '--次の氏名分の準備 k = k + c '次の氏名行の最初行 Worksheets("sheet4").Range("A2:G100000").Clear Loop While k <= lr '-- End Sub

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

VBAコードを作れというのは、業者に外注すれ数万円するものを、回答者にやれと言うのはどうかと思う。 また質問して、出た回答をコピペして実行していると、VBAについて進歩がない。他の種の問題に力がつかない。 ーー 色んな構想がある。 これは経験して、または指導役にアドバイスを受けて磨くしかない。コードそのものより重要なことだと思う。 ここでは エクセルのフィルタ機能を使った方法でやってみる。 ーー また、下記例では、重複しないところの、出現する名前を一旦別シートに出しておいて、それを使って、「繰り返し作業」に持ち込む方法です。 (出現する名前を出す)この出し方はすでに知っているかな。知らないようなら、エクセルの操作の全般的な勉強(エクセルでどんなことができるか)が、VBAをやる前に必要なのだ。エクセルは、操作でできるものしかできないと考えて95%間違いない。 ーー データ例 本来、これぐらい掲示して質問すべきだ。 Sheet1のA1:D9 氏名  組 成績  時期 山田 一郎 1 35 19/05 佐藤 修 2 42 19/05 木村 正 3 61 19/05 山田 一郎 1 44 19/06 佐藤 修 2 51 19/06 木村 正 3 58 19/06 山田 一郎 1 49 19/07 木村 正 3 63 19/07 VBA(マクロの記録をとるなど)でもできるが、今回は操作でやった。 VBA学習の論点を広げないためにね。 ーー データ ーフィルター詳細設定ーフィルタオプションの設定 で ・選択した範囲 オン ・リスト範囲 A1:D9 ・抽出範囲 K1 ・重複するレコードは無視する オン K1には見出しの「氏名」を入れておく。 結果 K1から 氏名 山田 一郎 佐藤 修 木村 正 異なる氏名がこれだけあるということ。 ーー いよいよVBAコード。 勉強用にMsgBoxが各所に入れているが、本番では削除して実行のこと。 標準モジュールに Sub test01() lr = Range("K10000").End(xlUp).Row MsgBox lr Worksheets("sheet2").Cells.Clear k = 1 For i = 2 To lr MsgBox Worksheets("Sheet1").Cells(i, "k") Worksheets("Sheet1").Range("a1:D9").AutoFilter 1, Cells(i, "k") Worksheets("Sheet1").Range("A1").CurrentRegion.Copy Sheets("Sheet2").Range("A" & k) Worksheets("Sheet1").Range("A1").AutoFilter k = Worksheets("Sheet2").Range("A10000").End(xlUp).Row + 2 MsgBox k Next i End Sub 実行 結果 Sheet2に 氏名 組 成績 時期 山田 一郎 1 35 19/05 山田 一郎 1 44 19/06 山田 一郎 1 49 19/07 氏名 組 成績 時期 佐藤 修 2 42 19/05 佐藤 修 2 51 19/06 氏名 組 成績 時期 木村 正 3 61 19/05 木村 正 3 58 19/06 木村 正 3 63 19/07 これを操作で、シート印刷すればよい。VBAでも印刷は1行加えるだけ。 私の好みで、一覧のため、各人を続けて出したが、1人分抽出後のデータを印刷して、Sheet2のシートをデータクリアすることを、繰り返す方法に、変えるのは簡単。

  • kon555
  • ベストアンサー率51% (1845/3565)
回答No.1

まずシートを印刷するコードは WorkSheets(1).PrintOut です。もちろんこれはインデックス番号1のシートの場合なので、2,3のシートを印刷したい場合などは適宜指定する必要があります。 アクティブなシートなら「ActiveSheet.PrintOut」となります。 次にフィルタさせるコードについてですが、これは具体的にどのような条件でフィルタしたいかによるので、貴方以外の誰も具体的なコードを記述することはできません。 ただ毎回決まったフィルタをかけているなら、マクロの記録機能を使えばたしか記録できたはずなので、そのコードの末尾に、先ほど挙げた「ActiveSheet.PrintOut」をくっつければ、お望みの動作はほぼ実装できるかと思います。 また同一ファイルに連続して別のフィルタをかけたいなら、一度フィルタの絞込みを全て解除する必要があるので、ActiveSheet.ShowAllDataを最後に使います。 後は、もしマクロの記録でなくフィルタを記述したいなら下記ページを参考にどうぞ。 http://officetanaka.net/excel/vba/tips/tips155.htm

関連するQ&A

専門家に質問してみよう