• 締切済み

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

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

みんなの回答

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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/17068)
回答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% (1771/3407)
回答No.1

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAを用いて繰り返し自動的に印刷するにはどうしたら良いのですか

    VBAを用いて繰り返し自動的に印刷するにはどうしたら良いのですか?ループコードって何? エクセルで作った納品書、件数が数百件あっても自動的にある件数全て打ち出せるようにしたいのですが。。。

  • オートフィルタで抽出したデータの行を削除(VBAで記述)

    Excel2000を利用しています。 VBAで、オートフィルタを利用した作業を記述したいと思っています。 データは一行目にタイトルが入っています。 オートフィルタで抽出したデータを その行まるまる削除したいと思っています。 その時、タイトル行(1行目)を除いて オートフィルタで抽出された行のみ選択して 削除する、という場合、どのように記述すればよいのでしょうか。 自分では全然分からないので 教えてください、よろしくお願い致します。

  • 【VBA】複数の条件、項目で別のシートへ1行ずつ

    VBAで質問です とあるデータの一覧があります (サンプルでは「名前」「住所」「埋蔵」「状況」としています) このデータを、それぞれの項目で複数の条件(3件以上)で抽出し、 「住所」名のシートに順番に貼り付けていくのを自動で行う マクロがつくりたいのですが、どうにもうまくいきません オートフィルタでは2件までしか抽出できないので条件が3件以上になると 抽出ができなくなってしまいます どうかご教授のほどよろしくお願いいたします

  • オートフィルタオプションをVBAで指定したい

    表中に、このような列があるとします。 肩ロース100g 肩ロース500g ヒレ100g ヒレ250g ヒレ500g レバー100g レバー250g 他の列には注文日や個数、小計金額があるとします。 オートフィルタをかけて、フィルタオプションで「○○で始まる」を指定し、例えばレバーの行のみを手作業で抽出することはできます。 この動作を、フィルタオプションでの設定を経由せずに行えないものでしょうか? たとえば、別の列などに「肩ロース」「ヒレ」「レバー」が記載されていて、そのデータを元にオートフィルタの▼をクリックすると「肩ロース」「ヒレ」のように抽出条件データが表示される、というふうには出来ないものでしょうか? VBA等を使用しても構いません。 抽出項目は固定ですので、コード中に記述しても構いません。 動作が要望を満たせば、オートフィルタを使用しなくても構いません。 フォームウィンドウで抽出項目を指定し、その項目をCriteria等に設定してフィルタオプションでも構いません(この方法は自力で出来そうですが)。 良い方法があれば、お教え下さい。

  • エクセルのシート上でオートフィルターを使った際に関する、VBA上でのコードの記述について

    大変稚拙な質問の仕方をお許しください。 エクセルのシート上で、オートフィルターを使ってデータを抽出した前提で、VBAを使ってある作業をするためのマクロを組もうと思ったのですが、抽出されて表示された一番最初データの行を確定させるコードの記述が思い浮かびません。なにかいい方法はないでしょうか?よろしくお願いします。

  • VBA 印刷について教えてください

    シートにデータを日ごと入力しています。そのデータを印刷をかけたいのですが、その日ごとに件数が異なります。 1行目は、項目 その下からデータになります。 件数は200件の時もあれば、300件のときも・・・ そこで、VBAを利用して印刷をしたいのですが、1枚に40件印刷をしたいのです。 1行は項目、40行データ よって一枚に41入る事のなります。 見出しの設定はわかります。 2枚目は 42から82 3枚目は 83から122 という感じです 行は、kまで 用紙はA4横です どのようにVBAを組めばよろしいでしょうか? よろしくお願いいたします。

  • エクセルの名簿から、団体ごとに抽出して自動印刷したいのですが

    毎回参加者が異なる名簿(エクセルデータ)があります。 B列には団体名が入っています。 なお、1行目はタイトル行で、名簿ごとに20行~150行くらいのボリュームになります。 このような状況下で、団体名ごとに抽出して自動で印刷したい(タイトル行も込みで)のですが、どのような関数またはマクロを作成すればよろしいのでしょうか。 マクロの使用経験は、標準モジュールの簡単な記述を修正してフォームのボタンに登録して使用したことがある程度です。 なお、これまでは、改ページを一つずつ設定するか、オートフィルターで一つずつ抽出して印刷していました。 よろしくお願いします。

  • エクセル VBA 連続行コピー?

    オートフィルターで抽出後、最終行へ飛び、そこから最終行含む上に連続する5つの行をコピーしたいです。 現在は、最終行へ飛ぶコードまでは書いたのですが、そこから5行コピーするコードが分かりません。 宜しくお願いします。

  • 「オートフィルタ」の作業を自動化したいのですが…

    「Excel」のオートフィルタを使って、 自動的にリストを上から順番に抽出していって、 印刷したいのですが…。 具体的には、「部署名」が入っているA列 (B列以降に「名前」等)を、 オートフィルタを使って部署ごとに グルーピングした後、印刷をします。 これを部署の数だけ順番に繰り返していくのですが、 部署名がとても多いので、 それを自動化したいのですが…。 マクロはよく分からないので、 「マクロの記録」ボタンを使ってしか 出来ないのですが、それだと、一度 全部の署名を「グルーピング→印刷」 して、記録させなければいけませんよね? 部署名の変更・追加等にも対応出来る 良い方法はないでしょうか? 宜しくお願い致します。

  • VBAでオートフィルタの可視セルクリア後空白行削除がうまくできません

    VBA初心者です。 オートフィルターで抽出した行を削除したくて、以下のように書いたのですが、最後の一文でエラーになってしまいます。 ◆エラー内容◆ 実行時エラー1004 重複する選択範囲に対してそのコマンドを使用することはできません。 ◆書いたVBA◆   Range("A2").Select Selection.AutoFilter Field:=1, Criteria1:="=1111", Operator:=xlAnd 'オートフィルターで「1111」を抽出 Dim r As Range Set r = Range(Range("A3"), Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible) r.ClearContents 'A列の可視セルの値をクリア Range("A2").Select Selection.AutoFilter 'オートフィルターの解除 r.SpecialCells(xlCellTypeBlanks).EntireRow.Delete 'A列が空白の行は削除→ ココがエラーになります --------------------------------------------------------- 元のファイル構成は2行目に項目名で、3行目からデータが入っています。 いろいろ調べたのですが、よくわからなかったので教えていただければ 幸いです。 宜しくお願いします。

このQ&Aのポイント
  • ノートパソコンの電池が新しい状態でも2週間しか持たないトラブルが発生しています。
  • 説明書には電池の持ちが10カ月と記載されているのに、実際には短い持ち時間しかないようです。
  • エレコム株式会社の製品に関する質問です。ノートパソコンの電池トラブルについて回答をお願いします。
回答を見る

専門家に質問してみよう