- 締切済み
指定のシート枚数をマクロで印刷
こんにちは。 エクセルマクロを使用しての印刷に関して、皆様の知恵をお借りしたく投稿させて頂きました。 現在は ・マクロを実行し印刷したいエクセルブックを開く。 ・指定した名前のエクセルシートの選択。 ・選択した名前のシートの印刷。 となります。 それを ・マクロを実行し印刷したいエクセルブックを開く。 ・2枚目のシートから4枚目のシートまでを選択。 ・空白のシートを追加(両面印刷する際に奇数だと次のファイルが同じ紙の裏面に印刷されてしまうため) ・2枚目から4枚目シート+空白シートの印刷。 と変更したいのです。 ※2~5枚目シート選択、1~6枚目シート選択など、変更できると助かります。 ※偶数シートの印刷の場合は空白シート追加は不要となります。 1000近くのエクセルブックを印刷しているのですが、シート名が統一されていないため、マクロが止まってしまい困っておりました。 なんとか知恵をお貸し頂けないでしょうか。 宜しくお願い致します。 下記に現在使用しているマクロのコードを提示致します。 --------------------------------------------------------------------------------------------------------- Sub Excelファイルの指定したシートのみ印刷_資料2から資料3Ver() '複数のファイルを選択する Dim vntFileName As Variant Dim vntGetFileName As Variant Dim B As Boolean Dim W As Workbook 'ファイルを開くダイアログを開きます vntFileName = _ Application.GetOpenFilename( _ FileFilter:="xlsxファイル(*.xlsx),*.xlsx" & _ ",エクセルファイル(*.xls),*.xls" _ , FilterIndex:=1 _ , Title:="印刷するファイルを選択" _ , MultiSelect:=True _ ) If IsArray(vntFileName) Then For Each vntGetFileName In vntFileName Set W = Workbooks.Open(vntGetFileName) If B Then Sheets(Array("資料2", "資料3", "資料4")).Select ActiveWindow.SelectedSheets.PrintOut Copies:=1 '通常設定のプリンタで出力 Else Sheets(Array("資料2", "資料3", "資料4")).Select Application.Dialogs(xlDialogPrint).Show '印刷ダイアログを表示 B = True End If W.Close False Next End If End Sub ----------------------------------------------------------------------------------------------------
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
#3です。 いまさら言っても無駄だと思いますが、気になって、追加してみます。 それなので、本件記述に返信は不要です。参考にしてください。 ・基データは1000ブックなのか、1000シートなのでしょうか。あいまい。 1シートの項目は10項目程度以内ですか。回答するときは気になる。 ・質問者はVBAでプログラムできるのですか? 質問にVBAコードを載せているので、できるとの仮定でした。 あるいは、会社のパソコンでVBAを入れることは禁止されているのですか? それなら、本件も無意味ですが。これらは明記して質問すべきことです。 ーー 私が#3で述べたロジックを考える前に、7人の作ったブックやシートは、本件内容のブック「だけが!」入った、フォルダが作られていると考えてよいのですか。 下記の構想は、データの各人の(その他の)バリエーションをバッファとして吸収する機能を持たせるのです。統一シートを作るのです。 それならロジック(構想)として、本件に関する7人のそれらのフォルダを対象に、1つの(ブックの)1シート(約1000行)のデータに集約してはどうですか。 この点に注力する。 フォルダやブックに、除外すべきブックやシートが混入されていても、区別ができるなら、プログラム(自動で)で除外は簡単です。 Googleで「フォルダ エクセル ファイル 集約」で照会すれば、コード例が多数出ます。このコーナーの質問も再々出ています。 VBScriptでFolderに対しFor Each Nextで繰り返しをするか Dir関数で繰返します。 そののちに、この作った1シートを対象にして、私が#3で述べたロジックで印刷すればよい。PrintOutの1行で、用紙の 裏を白紙にするとかも気にしなくても良くなると思う。普通に印刷すれば、裏は印刷されない(片面印刷)ではないですか。 また印刷が多数枚に(市販A4ペーパーなら500枚入り2包)なるので、ファイルに印刷イメージを吐き出し、別途に随時印刷できるようにした方がよいと思う。パソコンではこの考えや利用が少ないが。
- imogasi
- ベストアンサー率27% (4737/17069)
>1000近くのエクセルブックを印刷しているのですが この質問には、詳しい説明されていないし、説明できないかのもしれませんが、私の勝手な想像ですが、質問者のエクセルを利用して、やりたいことを処理する方法に対する、構想、設計ミス(不適当)ではないでしょうか。 質問者のことは何もわからないが、なんとなく初心者のやりそうな、方法のにおいがしたので。 1000枚近くの印刷シートの中身は、ほぼ中身(様式・フォーマット)が同じで、 宛先など一部分が、各innsatu単位(セット)で、多少違っているのではないですか。 もしそういう場合では、1シートに1枚だけフォーマット(不動文字文章)を作り、 変わる部分は他のシートに1000人分を集めて、プログラムで、可変部分をその他シートを参照して代入すべきではないですか。いわゆる「差し込み印刷」的な考えを取り入れるとよいケースではないですか。 ーー 大雑把な処理ロジック 1-1000回繰り返し 可変フィールドのデータの入っているシートの適当なデータの入ったセルを参照 (可変フィールド複数のばあいは、印刷必要項目数だけ繰り返す) 印刷シートのフィールドにセット 印刷(多分空白シート印刷は必要ないと思う)印刷シートの可変フィールドをクリア 繰り返し(通常はデータシートの次行を次回印刷のためポイントで済む場合も多い) こういうのが基本的なデータベース的にエクセル(シート)を使うロジックと思う。 ーー シートは、(1)ひな形シート(2次元レイアウト的に文言や可変フィールドを配置しておく)1つ (2)データシート1つ(でデータ行数1000程度)、データ面的に2シートを参照しなければいけない構成の時は2シート。できれば1シートに事前に必要データを集約しておくとよい) もし私のか想像違いで、そう単純じゃない場合はご免、無視してください。 私ならエクセルごときで、1作業プロジェクト(例請求書印刷)で1000ブックも作って扱うのは狂気の沙汰とおもうが。
- chie65536(@chie65535)
- ベストアンサー率44% (8745/19849)
以下のコードを、適切な場所に追加して下さい。 'シートの名前を保持する配列。4つ分 Dim SheetName(4) As String '2~4番目のシートを印刷するため、4番目のシートの後ろに新規の空白シートを追加 Sheets.Add After:=Sheets(4) '2~5番目のシートの名前を取得 For i = 1 To 4 '配列の添え字は1~4、シートの番号は2~5になるので 'シートの番号の指定は「i + 1」になるので注意 SheetName(i) = Sheets(i + 1).Name Next '4つのシートを選択 'Sheets(Array("資料2", "資料3", "資料4")).Selectの代わり Sheets(Array(SheetName(1), SheetName(2), SheetName(3), SheetName(4))).Select >※2~5枚目シート選択、1~6枚目シート選択など、変更できると助かります。 >※偶数シートの印刷の場合は空白シート追加は不要となります。 上記の追加部分の「1」とか「4」とか「+ 1」とか、定数で指定しているのを変数に変えると、汎用性を持たせる事が出来ます。 但し、シートをまとめてセレクトする部分 Sheets(Array(SheetName(1), SheetName(2), SheetName(3), SheetName(4))).Select だけは、どうしても「何枚分あるかで、個別に記述しないといけない」です。 なので、if文で if 印刷するシート数 = 2 then Sheets(Array(SheetName(1), SheetName(2))).Select else if 印刷するシート数 = 4 then Sheets(Array(SheetName(1), SheetName(2), SheetName(3), SheetName(4))).Select else if 印刷するシート数 = 6 then Sheets(Array(SheetName(1), SheetName(2), SheetName(3), SheetName(4), SheetName(5), SheetName(6))).Select end if などのように「場合分け」して書く必要があるでしょう。
- dogs_cats
- ベストアンサー率38% (278/717)
シートインデックス番号でシートを選択するので良いのでしょうか? シートの一番左が1番で順次番号が割り振られます。 シートを移動させるとシートインデックス番号も自動的に変更されますので注意下さい。 質問ないようのシート数の可変をどう判断するのかコード上で理解出来ませんでしたので、とりあえず、1枚目を除くシート数をカウントして奇数の時は空白シート挿入。 2枚目以降のシートを選択するコードを作ってみました。 ご参考まで。 Sub Sample() Dim i As Integer '1シートを除くシート数が奇数の場合は空白シート挿入 If (Worksheets.Count - 1) Mod 2 = 1 Then Worksheets.Add after:=Worksheets(Worksheets.Count) End If '2枚~最終シートまでを選択 For i = 2 To Worksheets.Count Sheets(i).Select Replace:=False Next End Sub
お礼
返信ありがとうございます。 私もこんなに大量のエクセルブックを印刷するのは理解されないだろうと思っておりますが、実際に必要なものなのです。整理の仕方が悪くこの数になっているのではありません。 >1000枚近くの印刷シートの中身は、ほぼ中身(様式・フォーマット)が同じで、 1000個のブックとなります。中身はほぼ一緒という考えであっております。 ただ、作成する人によって(およそ7人がブック作成に参加)勝手にシート名を変更したりしている場合があるのでシート名指定選択でマクロ印刷をかけると、名前の不一致によりマクロが止まるということでした。 回答者様の大雑把な処理ロジックを見て、なるほどと独自でプログラムを組み直せるのであればいいのですが、それが出来ずに困っておりましたので質問させて頂いた次第です。 回答ありがとうございました。