- ベストアンサー
オートフイルターで選んだデータを連続で印刷したい
マクロの初心者です。自動マクロでオートフイルターで該当する番号のデータを選んで印刷するという作業を登録しましたが、実は同じ作業を 7回から8回繰り返すことになり、つど登録のボタンを押すのは大変なので連続で印刷できないか考えました。 (1)Sheets("Sheet1").Select (2)Range("G3").Value = "2" (3)Selection.AutoFilter Field:=1, Criteria1:="2" (4)ActiveWindow.SelectedSheets.Printout (5)Selection.AutoFilter Field:=1 (2)と(3)の入力する番号を変えて(5)の前に以下のように印刷する回数だけ書き加えて実行したら、動きましたが印刷には結構時間がかかりました。別の書き方で印刷時間が短縮されるような方法はありませんか。 Range("G3").Value = "3" Selection.AutoFilter Field:=1, Criteria1:="3" ActiveWindow.SelectedSheets.Printout Range("G3").Value = "4" Selection.AutoFilter Field:=1, Criteria1:="4" ActiveWindow.SelectedSheets.Printout さらに、できればデータのない番号の時は印刷しないようにしたいのですがどうしたらよいのでしょうか。 G3とオートフイルターで選ぶ番号とは同じ番号です。G3に入れた番号で G4にあて先が入るように関数を設定してあります。 どうぞよろしくお願いします。 Windows XP Excel2000 を使っています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 こんな感じでしょうか。 Sub Test() Dim i Sheets("Sheet1").Select For i = 1 To 5 Range("G3").Value = i Selection.AutoFilter Field:=1, Criteria1:=i ActiveWindow.SelectedSheets.PrintOut Next Selection.AutoFilter Field:=1 End Sub
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
既回答でコードはわかると思いますが、考え方について。 マクロの記録を採っていると、変数を考えて、その変数に繰り返しの都度、別の値をセットして、似た処理を繰り返すというパターンは、絶対現れませんが、このタイプは、実はプログラムを使って処理・実行する最大のメリットなんです。 ーー 繰り返しについて (A)連続して繰り返す (B)最終回が判っている 場合はFor Nextが便利です。 ForNextは (A)も途中の1回ぐらいの例外ならスキップするようにできます (B)も他の条件を判断して、最終回にすることはできるので、万能的です(繰り返しはこれ一本やりでもできます)。 ーー 今回の質問は、何のデータを変えて、似た処理を繰り返したいのかを考えます。 Criteriaの部分のようです。それで、その変数をiに決めて For i=1 to 9 (フィルタ処理) (印刷処理) next の形にします。 今回の特殊事情として、クライテリアを文字列で、指定しなければならない場合は Trim(Str(i)) としてiを文字列化して使います。 数値数字、数字文字列で、ではダメで、語句で指定しなければならない場合は a=Array("東京","仙台","札幌")のように定義して、aを配列的に a(i)でiを変化させて、処理を繰り回しします。 または隣接セルに"東京","仙台","札幌"を入れてCells(i,"B")の iを変化させます。 ーーー (2)Range("G3").Value = "2" (3)Selection.AutoFilter Field:=1, Criteria1:="2" のように、G3セルに値をセットするなら。セルが変数の役割を担えて (2)Range("G3").Value = "2" (3)Selection.AutoFilter Field:=1, Criteria1:=Range"G3").Value のようにできて、それがより良いと思います。 ーー マクロの記録でSelectionが出てきたら、省けないか考え て見ましょう。普通省けるはずです。
お礼
ご親切な回答をいただきありがとうございます。まだマクロは本当の初心者で自動の登録をしてそのコードを修正して自分なりに書いている段階ですが、マクロは便利なものだと実感しました。これからもっと勉強したいと思います。本当にありがとうございました。
- misatoanna
- ベストアンサー率58% (528/896)
#1です。 > データのない番号の時は印刷しないようにしたい。 という部分を忘れてました。 と言っても、オートフィルタでデータがない場合の判断をどうするか、 私にはわかりませんが、苦肉の案として―― 1.例えばE列に =SUBTOTAL(3,$C$2:C2) のように入力して抽出デー タの連番になるようにしておいて、(E列は非表示にしておく) ActiveWindow.SelectedSheets.PrintOut の部分を If WorksheetFunction.Max(Range("E:E")) > 0 Then _ ActiveWindow.SelectedSheets.PrintOut に書き換えるとかではいかがでしょうか。
補足
データのないとき、というのは、オートフイルターのリストに表示されるのはデータに実際にある番号なのでリストに表示されないものは印刷しないようにするという意味でした。書き方が悪くてすみませんでした。つまり、リストに表示される番号を順に選びその番号をG3に入れてあて先を同時に表示して印刷したかったのです。自分でも頭のなかが整理できていなかったようです。ただ、データのないものは1件か2件と少ないのでとりあえずは全部連続で印刷する方向でやってみようと思います。 ありがとうございました。
お礼
きょう職場でこのとおりやってみましたが、期待通りに印刷でき、大変助かりました。本当にありがとうございました。
補足
さっそく回答いただきありがとうございます。 明日職場で早速やってみます。