• ベストアンサー

【Excel365マクロ】続:プリンター指定

先日 https://okwave.jp/qa/q10301453.html にて PDF化の際に『Microsoft Print to PDF』を自動選択できるマクロをご教示いただきましたが、別の問題が出てきました。 先の質問にはシートの選択について記載しませんでしたが、実は質問に記載した2つのマクロの先頭にシート選択のコマンド( Sheets("シート1)").Select や Sheets(Array("シート1", "シート2")).Select )を入れてありました。 ご回答のCall Test~の前にシート選択のコマンドを入れれればいいやと思っていたのですが、なぜか左側のシート(シート1)しかPDF化できませんでした。 マクロボタンは別シートに配置するのでシートの選択コマンドが必要で、且つ選択するシートは内容毎に異なります。 どの部分を改修すれば複数シートのPDF化ができるのでしょうか?

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.3

プロシージャで宣言した変数はそのプロシージャ内だけでしか使えません。 なので fnameやfullnameはTestの中でだけ有効です。 Testの Application.ActivePrinter = orgPrinter と Set Sh = Nothing の間ぐらいにMsgBoxを入れて Application.ActivePrinter = orgPrinter MsgBox ("「" & fname & "」 保存完了"), vbInformation Set Sh = Nothing としておくとTestを呼び出す方の Sub PDF保存_指定フォルダ() などに毎回MsgBoxkを書かなくてすみます。

KO1014
質問者

お礼

何度もご回答ありがとうございました。 なるほど、Testの方に入れればいいのですね。 びっくりマークも付けた方が目立ってよいですね。 これだけあれば、マクロがどれだけ増えようが各名称(フォルダ、ファイル、メッセージボックスなど)を変更するだけで済みます。 大変助かりました。

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.2

> Application.ScreenUpdating = False/True のように2行程度のマクロはありませんか? VBAだけでは制御できないみたいで数行ではありませんがWindowAPIを使った方法がありました。 ただ古い情報のせいか実行してもダイアログは表示されて中の文字が非表示になるだけみたいな感じで使えない感じでした。 一行ですますとすると 印刷前にメッセージボックスを出して MsgBox "印刷中がでますが印刷しているわけではありません" & vbCrLf & vbCrLf & "PDFファイルとして保存します", vbInformation といった感じのメッセージで説明しておくという方法とかもありかなと思います。

KO1014
質問者

お礼

再度のご回答ありがとうございました。 やはり無いですか、仕方が無いですね。 元々「保存完了」メッセージを出す予定でしたので、ファイル名も一緒に出そうと設定していたのですが、ファイル名が表示されません。 MsgBox ("「" & fname & "」 保存完了") ”fname”を”fullname”に変えてもダメでした。 最初の質問でご教示いただいたマクロのどこかに別途ファイル名を設定する必要があるのでしょうか? Sub Test(ByVal saveFolder As String, ByVal fname As String) Dim fullname As String Dim Sh As Object Set Sh = ActiveWindow.SelectedSheets Dim orgPrinter As String fullname = saveFolder & fname orgPrinter = Application.ActivePrinter Call Sh.PrintOut(ActivePrinter:="Microsoft Print to PDF", PrintToFile:=True, PrToFileName:=fullname) Application.ActivePrinter = orgPrinter Set Sh = Nothing End Sub Sub PDF保存_指定フォルダ() Sheets(Array("シート1", "シート2")).Select Call Test("C:\PDF\", ActiveSheet.Range("A1").Value & ".pdf") MsgBox ("「" & fname & "」 保存完了") '←「」保存完了 と表示されます End Sub Sub PDF保存_同一フォルダ() Sheets(Array("シート1", "シート2")).Select Call Test(ActiveWorkbook.Path & "\", ActiveSheet.Range("A1").Value & "_Invoice" & ".pdf") End Sub

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.1

> どの部分を改修すれば複数シートのPDF化ができるのでしょうか? Sub PDF保存_同一フォルダ() Sheets(Array("シート1", "シート2")).Select Call Test(ActiveWorkbook.Path & "\", ActiveSheet.Range("A1").Value & "_Invoice" & ".pdf") End Sub 上記のような感じだとしたら Testの Dim Sh As Worksheet Set Sh = ActiveSheet のところを Dim Sh As Object Set Sh = ActiveWindow.SelectedSheets に変更してみてください。 Sheets(Array("シート2", "シート1")).Select となっているとシート2のA1のデータがファイル名になります。 名前のセルを先に指定しておくと後の順番を気にしなくてもいいかもしれません。 Sub PDF保存_同一フォルダ() Dim FileName As String FileName = Sheets("シート1").Range("A1").Value Sheets(Array("シート2", "シート1")).Select Call Test(ActiveWorkbook.Path & "\", FileName & "_Invoice" & ".pdf") End Sub

KO1014
質問者

お礼

前回に引き続きご回答ありがとうございました。 できました!! シート数が1つだろうが4つだろうが選択シートすべてPDF化されました。 いつもながら完璧なご回答です。 もし可能でしたら、もう1つわがままを聞いていただけると幸いです。 PDF作成の際に「印刷中」ダイアログが一瞬表示されます。 印刷用マクロボタンもすぐ横に配置するので、マクロに詳しくない人が見たら「えっ、間違って印刷ボタン押した?」と勘違いすると思います。 「印刷中」ダイアログを非表示にする方法をググっていろいろなサイトを見てみましたが、どれも異様に長いマクロばかりでした。 Application.ScreenUpdating = False/True のように2行程度のマクロはありませんか?

関連するQ&A

専門家に質問してみよう