人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ExcelでVBAのマクロを組みました。

おおよそやっていることは、
[1] ○○.csv というファイルの見栄えをよくして、○○.xlsに保存し直し、
[2] ○○.xlsの印刷範囲を指定して、いきなりPDFというソフトで印刷し、PDFファイルにすることです。

だいたい500個のPDFファイルを作成したのですが、現在のプログラムだと、
[2]の段階でなぜかファイルごとに、「名前をつけて保存」確認ダイアログが出ます。
つまり500回もエンターキーを押す必要があります。

これをなんとか回避する方法を教えていただけないでしょうか。

'ここから印刷

Range("A1:F21").Select
Range("F21").Activate

ActiveSheet.PageSetup.PrintArea = "$A$1:$F$21"
With ActiveSheet.PageSetup

.CenterHorizontally = False
.CenterVertically = False
.Orientation = xlLandscape

.PaperSize = xlPaperA4

.Order = xlDownThenOver
.BlackAndWhite = False
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = 1
.PrintErrors = xlPrintErrorsDisplayed
End With

Application.ActivePrinter = "いきなりPDF Professional on Ne01:"

→ Selection.PrintOut Preview:=False, Collate:=False (この行で印刷ダイアログ)

1195195180
●拡大する

●質問者: lionfan
●カテゴリ:コンピュータ
✍キーワード:A1 application CSV Excel ON
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● ardarim
●250ポイント ベストアンサー

Excel VBA内からPrintOutで印刷した場合、PrintOut処理の中でいきなりPDFが呼ばれますので、いきなりPDFが表示しているダイアログをOKなりキャンセルしないとPrintOutの次の行に制御が移りません。

そのためExcel VBAで処理を完結させることはふかのうです。


印刷とは非同期にダイアログを処理する必要がありますが、シェルスクリプト(WSH)で作ってみました。test.vbsなどの名前で保存し、コマンドラインで「cscript test.vbs」で実行してください。[1]の処理や、500個のファイルを順番に呼び出す処理などもvbs化する必要がありますが、基本的にExcel VBAをちょっと手直しすればそのまま動かせます(サンプルプログラムの流用部分を参考にしてください。ApplicationをobjExcelにするなどの他はそのままです)。


Dim wsh
Dim objExcel
Dim objWorkbook

Set wsh = WScript.CreateObject("Wscript.Shell")

Set objExcel = WScript.CreateObject("Excel.Application")
objExcel.visible = True

' ファイル名は環境に合わせて変更してください。
' 複数のファイルを処理する場合はここをループで回します。
Set objWorkbook = objExcel.Workbooks.Open("C:\test.xls")



' vbsでは定数類は定義されていないのでExcel VBAのブジェクトブラウザ
' で定数の定義を調べてコピーしてきます。
Const xlLandscape = 2
Const xlPaperA4 = 9
Const xlDownThenOver = 1
Const xlPrintErrorsDisplayed = 0

' -----------------------
' ここから元VBAコードをコピー(一部変更)
' -----------------------

objExcel.ActiveSheet.PageSetup.PrintArea = "$A$1:$F$21"
With objExcel.ActiveSheet.PageSetup
 .CenterHorizontally = False
 .CenterVertically = False
 .Orientation = xlLandscape

 .PaperSize = xlPaperA4

 .Order = xlDownThenOver
 .BlackAndWhite = False
 .Zoom = False
 .FitToPagesWide = 1
 .FitToPagesTall = 1
 .PrintErrors = xlPrintErrorsDisplayed
End With

objExcel.ActivePrinter = "いきなりPDF Professional on Ne01:"

' -----------------------
' ここまで
' -----------------------

' Excelに Ctrl+P (印刷キー) を送る
wsh.SendKeys "^p"

' 印刷ダイアログ表示待ち
WScript.sleep(2000)

' 印刷実行
wsh.SendKeys "{ENTER}"

' いきなりPDFのダイアログが表示されるのを待つ
WScript.sleep(2000)

' ファイル名決定
wsh.SendKeys "{ENTER}"

' 印刷待ち
WScript.sleep(2000)

' 保存せずクローズ
objWorkbook.Close False

objExcel.Quit
◎質問者からの返答

ardarim様、このたびは大変ありがとうございます。

自分のアホなプログラムをここまで修正頂き恐縮です。

それでは日曜日になったら、さっそく、実行させたいと思います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ