1195195180 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 (この行で印刷ダイアログ)

回答の条件
  • 1人1回まで
  • 登録:2007/11/16 15:39:42
  • 終了:2007/11/17 05:38:05

ベストアンサー

id:ardarim No.1

ardarim回答回数892ベストアンサー獲得回数1422007/11/17 00:36:26

ポイント250pt

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
id:lionfan

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

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

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

2007/11/17 05:37:15
  • id:notapachi
    >[2]の段階でなぜかファイルごとに、「名前をつけて保存」確認ダイアログが出ます。
    ●[2]の「どの段階」かがわかりませんが、動作を確認して、直前に保存してみてはいかがでしょうか。
     保存して困るようなものなら、まるごとコピーしておくとよいでしょう。
  • id:lionfan
    notapachi様
    コメントありがとうございます。
    プログラムの最終行、
     Selection.PrintOut Preview:=False, Collate:=False
    でダイアログが出てしまいます。

    で・・・申し訳ございません。
    「動作を確認して、直前に保存」という言葉の意味がよくわかりませんでした。
  • id:notapachi
    ●言葉足らずでしたね、すいません。
     「マクロを走らせてみて(=動作を確認して)」保存ダイアログが出る直前でワークブックを保存しておけば、
     保存ダイアログもでないのではないか、という意味でした。

     直前に
     ActiveWorkbook.Save
     の一行を追加してみてはいかがでしょうか。
     
     ActiveSheet.PageSetup.PrintArea = "$A$1:$F$21"
     プリントエリア情報などもワークシート情報に含まれるものだから、保存するかどうかを聞いてきてもおかしく
     ないですしね。
  • id:lionfan
    notapachi様、ありがとうございます。
    やってみました・・・が、残念なことにうまく行きませんでした。

    ActiveWorkbook.Save
    Selection.PrintOut PrintToFile:=True, ActivePrinter:="いきなりPDF Professional on Ne01:", Preview:=False, Collate:=True, PrToFileName:=PDFファイル名

    とか、いろいろ直してみたのですがダメでした。
    ですがアドバイスありがとうございます。
  • id:tetsu-i
    質問の趣旨とはずれているのでコメントで。

    このダイアログボックスはExcelではなく、
    「いきなりPDF」が制御している物ではないでしょうか?
    (拡張子がpdfですし…)
    となると、Excelマクロで表示を止めるのは難しそうです。
    いきなりPDFの設定(プリンタのプロパティあたりかな)で、
    回避できる可能性はあると思うので、そちらを確認してみてはいかがでしょう。
  • id:lionfan
    tetsu-i様、たしかに「いきなりPDF」が制御している物のようですね。
    確認してみます。ありがとうございます!!
  • id:Nigitama
    Send Key なんていう荒業もありますね。
    スマートではありませんが。

    http://q.hatena.ne.jp/1158922091
  • id:lionfan
    Nigitama様、ありがとうございます。
    SendKeyもやってもたのですが、なぜかダメでした。
    いったん制御が「いきなりPDF」に移るからですかね?
  • id:taknt
    いきなりPDFにファイル名を渡す手段がない限り 難しいでしょう。
  • id:lionfan
    taknt様、了解です。
    「いきなりPDF」のマニュアルを読んだのですが、ダメそうでしたね。
    というわけで、今は「エンターキーの上に本を縦に置いてキーを押しっぱなす」
    という荒技で解決しています。ありがとうございます。
  • id:ognad
    VBscript(拡張子vbs)の場合、こんな感じです。
    "名前をつけて保存"のダイアログが出るまで監視、出たらEnterを押してLoopから抜けます。
    VBAも同じような気もするけど、分らないのでなんともですが最後の行に組み込めるかな?
    ---------------------------------------------------------------
    Set objWshShell = CreateObject("WScript.Shell")
    Do While True
      CtrlWin = objWshShell.AppActivate("名前を付けて保存")
        If CtrlWin = True then
          objWshShell.SendKeys "~"
          Exit Do
        End If
      WScript.Sleep 1000 'とりあえずチェックは1秒間隔にしてあります
    Loop
    ----------------------------------------------------------------
  • id:lionfan
    ognadxj様、ありがとうございます。
    明日は出張ですので、これは日曜日に試してみます。
  • id:ardarim
    高ポイント頂きありがとうございます。
    動作確認して頂いてからでも良かったのですが...

    いちおう、同様の保存ダイアログが出るOffice Document Image Writer(Office付属の仮想プリンタドライバ)では動作確認できています。
    ウェイト時間は長めに2秒にしていますが、環境に合わせて変える必要があるかもしれません。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません