Excel 2003 VBAにて、
PDFファイルを開き、印刷し、閉じるマクロを作りたいと思っています。

Dim AA, AAA

AA = "C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe C:\Scan\20131101160734050_001.pdf"
AAA = Shell(AA, vbNormalFocus)

にて、PDFファイルを開くことは出来ました。
このPDFファイルを、「印刷し、閉じる」ためには、
このPDFファイルを指定する必要があると思いますが、
その構文が判りません。
知っている方、教えて下さい。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

#3です。


WShell.Execを使うと閉じる事ができる様ですが、色々と気難しくて苦労しました。
まず、なぜかAdobe Reader/Acrobatのフルパスを与えないと、ファイルがみつからないとゴネます。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub test()
printPdf2 GetDesktopPath & "\test.pdf", "DocuWorks Printer", "DocuWorks Printer Driver"
' printPdf2 GetDesktopPath & "\test.pdf"
End Sub

Sub printPdf2(pdfDocument As String, Optional printerName As Variant, Optional printerDriver As Variant)
Dim cmdLine As String
Dim WShell As Object
Dim oExec As Object
'ここは調整の必要がありそう
Const waitTime As Long = 1000
'Windows7 Home 64bitの場合です
Const pgmFullPath As String = "C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe"

Set WShell = CreateObject("WScript.Shell")
If IsMissing(printerName) Or IsMissing(printerDriver) Then
cmdLine = "pgmFullPath /n /s /o /h /t ""pdfFullPath"""
cmdLine = Replace(cmdLine, "pgmFullPath", pgmFullPath)
cmdLine = Replace(cmdLine, "pdfFullPath", pdfDocument)
Else
cmdLine = "pgmFullPath /n /s /o /h /t ""pdfFullPath"" ""printerName"" ""printerDriver"""
cmdLine = Replace(cmdLine, "pgmFullPath", pgmFullPath)
cmdLine = Replace(cmdLine, "pdfFullPath", pdfDocument)
cmdLine = Replace(cmdLine, "printerName", printerName)
cmdLine = Replace(cmdLine, "printeDriver", printerDriver)
End If
Debug.Print cmdLine
Set oExec = WShell.exec(cmdLine)
Sleep waitTime
'Windows7Home/64bit環境ではここで実行時エラーが出るので無理矢理先に進めていますが
'Adobe Readerは閉じられる様です
On Error Resume Next
oExec.Terminate
Set WShell = Nothing
End Sub

Private Function GetDesktopPath() As String
Dim wScriptHost As Object, strInitDir As String
Set wScriptHost = CreateObject("Wscript.Shell")
GetDesktopPath = wScriptHost.SpecialFolders("Desktop")
Set wScriptHost = Nothing
End Function

Terminateで原因不明のエラーが出るのでWebを漁っいて下記をみつけました。64bit環境でエラーが出るのはこれも関係しているのでしょうか?少々無理をしている様なので、ご使用時はご注意下さい。
Terminate メソッドは最後の手段としてのみ使用します。これは、アプリケーションによっては適切にクリーンアップできない場合があるためです。通常は、プロセスを途中で中断せず、プロセス自身で実行を終了させるようにします。Terminate メソッドは WM_CLOSE メッセージを使ってプロセスを終了しようとします。これで終了できない場合は、通常のシャットダウン手順を実行せずに、プロセスを強制終了します。
http://msdn.microsoft.com/ja-jp/library/cc364387 …
    • good
    • 0
この回答へのお礼

度重なるご教示ありがとうございました。
やっと完成しました。

お答えいただいたtest()とPrivate Function GetDesktopPath() As Stringの意味が理解できず正直苦しみました。
VBAの参照設定のなかで、
Windows Script Host Object Model
を追加せよとのことなんですよね。
Sleep関数の使い方は以前より知っていたのですぐ理解できました。
完成品を見て頂きたく、記載させてもらいます。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub PDF()

Dim AA, BB, CC, DD
Dim AAA, BBB

AA = "C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe /t "
BB = "C:\Scan\MX-4111FN_20131003_162711.pdf"
CC = "RICOH MP C6003 白黒"
DD = AA & """" & BB & """" & " " & """" & CC & """"
Set AAA = CreateObject("WScript.Shell")
Set BBB = AAA.exec(DD)
Sleep 1000
On Error Resume Next
BBB.Terminate
Set BBB = Nothing
Set AAA = Nothing

End Sub

本当にありがとうございました。

お礼日時:2013/11/18 15:42

このViewの中に同様の質問が二つあるのに、灯台もと暗しというか面白いですね。

質問者様のコードに、コマンドラインオプションを追加するだけなのですが、関数化したので使いやすいかもしれません。
プリンター及び同ドライバ名は環境に合わせて下さい。指定しなければWindowsの標準プリンタに出力されます。
Sub test()
printPdf (GetDesktopPath & "\" & "test.pdf")
End Sub

Sub printPdf(pdfFullPath As String)
Dim objWShell As Object
Dim cmdLine As String
Dim printerName As String
Dim driverName As String

printerName = Chr(34) & "DocuWorks Printer" & Chr(34)
driverName = Chr(34) & "DocuWorks Printer Driver" & Chr(34)
Set objWShell = CreateObject("WScript.Shell")
cmdLine = "AcroRd32.exe /n /s /o /h /t " & pdfFullPath & " " & printerName & " " & driverName
objWShell.Run cmdLine, VbNormalFocus, True '連続実行時の誤動作が少ないことを期待して同期動作にしています。
Set objWShell = Nothing
End Sub

'これは試験の便宜上
Private Function GetDesktopPath() As String
Dim wScriptHost As Object, strInitDir As String
Set wScriptHost = CreateObject("Wscript.Shell")
GetDesktopPath = wScriptHost.SpecialFolders("Desktop")
Set wScriptHost = Nothing
End Function

参考URL:http://pdf-file.nnn2.com/?p=222
    • good
    • 0
この回答へのお礼

貴重なマクロ構文を教えていただきありがとうございます。
試したところ、印刷まではできましたが
アクロバットリーダー本体が閉じてくれません。

No2の方へのお礼欄に書きましたマクロ「SSS」と同じ状況です。
今一度ご教示をお願いします。

お礼日時:2013/11/15 10:18

参照先が繋がっていた


No1回答の
Adobe Reader で PDF ファイルを表示 / 印刷する方法

http://pdf-file.nnn2.com/?p=752http://www.f3.dio

http://pdf-file.nnn2.com/?p=752
http://www.f3.dion.ne.jp/~element/msaccess/AcTip …

です
    • good
    • 0
この回答へのお礼

2度に渡るご回答ありがとうございます。
色々な関係サイトをご紹介頂き勉強になりました。
Sub SSS()
Dim AA, AAA
AA = "C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe C:\Scan\MX-4111FN_20131003_162711.pdf"
AAA = Shell(AA, vbNormalFocus)
SendKeys ("^P"), True
SendKeys "{ENTER}"
SendKeys "%{F4}"
End Sub
では、PDFファイルが開くのみで、SendKeysが機能しませんでした。

そこで、知恵を絞りbatファイルを利用することにして、
Sub TTT()
Dim AA, AAA
AA = "START AcroRd32.exe /t ""C:\Scan\MX-4111FN_20131003_162711.pdf"" ""RICOH MP C6003 白黒"" ""50.28.99.211"""
AAA = "C:\XXX.bat"
Open AAA For Output As #5
Print #5, AA
Close #5
AAA = Shell(AAA, vbNormalFocus)
End Sub
を作りました。
印刷まではできましたが、アクロバットリーダー本体を閉じることができません。

いま少し、お知恵を拝借させてください。

お礼日時:2013/11/15 10:10

PDFファイルの印刷はReader上で行うので、Excelから直接実行はできません



VBAから実行するにはSendKeysでReaderを操作するのが一番簡単な方法
Readerがアクティブの状態で

SendKeys "^p", True
SendKeys "{ENTER}"

この2つを実行すれば印刷が始まります
SendKeysに関しては下記サイト参照
http://officetanaka.net/excel/vba/statement/Send …
http://www.moug.net/tech/exvba/0150016.html

終了動作もReaderがアクティブの状態で

SendKeys "%{F4}"

で終了できます


-----
その他の方法として

Adobe Reader で PDF ファイルを表示 / 印刷する方法

http://pdf-file.nnn2.com/?p=752http://www.f3.dio …

標準モジュール AdobeReaderは
https://app.box.com/shared/jisind0q7l

ココでダウンロードしたエクセルファイルに組み込まれています

私も、はじめ内容がよくわからなかったけど、Reader開かずにVBA上から直接印刷できるなど、理解できると結構便利に使えます
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qファイル名の作成について 写真のように複写するマクロを作成しています。 その中で平成AA年度のAAに

ファイル名の作成について

写真のように複写するマクロを作成しています。
その中で平成AA年度のAAに数字を代入し毎年更新の時に1を足していくように考えています。
AAに代入する方法を教えてください。


平成29年度
平成30年度
平成31年度
になるようにです。

よろしくお願いします。

Aベストアンサー

こんなふうにしてみたらどうでしょうか。
冗長なところがあるかもしれません。

'//
Sub SavingFileName()
Dim mPath As String
Dim WSH As Object
Dim FileName As String
Dim FName As String
Dim BaseName As String
Dim nums As Variant

Set WSH = CreateObject("Wscript.Shell")
mPath = WSH.SpecialFolders("Desktop") & "\"
nums = "*"
BaseName = "平成" & nums & "年度.xlsm"

FName = Dir(mPath & BaseName)
 If FName <> "" Then
 nums = Mid(FName, InStr(1, FName, "平成") + 2, 2)
 Do
   nums = nums + 1
   FileName = Replace(BaseName, "*", CStr(nums))
 Loop Until Dir(mPath & FileName) = ""
 Else
  nums = Format$(Date, "EE")
  FileName = Replace(BaseName, "*", nums)  '前ファイルがない場合
 End If
 ActiveWorkbook.SaveAs mPath & FileName
End Sub

こんなふうにしてみたらどうでしょうか。
冗長なところがあるかもしれません。

'//
Sub SavingFileName()
Dim mPath As String
Dim WSH As Object
Dim FileName As String
Dim FName As String
Dim BaseName As String
Dim nums As Variant

Set WSH = CreateObject("Wscript.Shell")
mPath = WSH.SpecialFolders("Desktop") & "\"
nums = "*"
BaseName = "平成" & nums & "年度.xlsm"

FName = Dir(mPath & BaseName)
 If FName <> "" Then
 nums = Mid(FName, InStr(1, FName, "平成") + 2, 2)
 Do
   nu...続きを読む

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QDimとは・・・

変数の宣言をする時の「Dim」は何の略でしょうか…
ほかにもプログラムをやっていて、何の略かわからないとなかなか覚えられません。よいサイトをご存知の方お願いします。

Aベストアンサー

ryくごの胃委細とを探したんですがなかなか良いところがありません。

http://www.geocities.co.jp/SiliconValley-Bay/6849/

http://www.geocities.co.jp/Milkyway-Orion/5125/dic.htm

ちなみにDImensionは「配列」などの意味です。

参考URL:http://www.bekkoame.ne.jp/~proud/abb-words.html

QFor ~ Next の中での Dim宣言について

四角形を下方向にずらしながら繰り返し描きたい場合、
以下のソースのようにFor ~ Next の中での Dim宣言を
行うのは一般的でしょうか。

他にスマートな記述があれば教えてください。
よろしくお願いします。

---------------------------------------
'四角形を下方向にずらしながら描画
For i = 0 To 10
  Dim rect As New Rectangle(x, y* i , w, h)
  g.DrawRectangle(Pen.Black, rect)
Next

Aベストアンサー

RectangleのOffsetメソッドを使うという方向なら Rectangleオブジェクトの生成は1回でいいことになります

dim rect as new Rectangle( x, y, w, h )
for i = 0 to 10
  g.DrawRectangle( Pens.Black. rect )
  rect.Offset( 0, 1 )
next
といった具合です …

Qマクロ初心者です。 インデックスが有効範囲にありませんとエラーになりました。 Dim Open

マクロ初心者です。
インデックスが有効範囲にありませんとエラーになりました。



Dim OpenFileName As string
Dim book1 As Workbook
Dim sheet1 As worksheet

sub 問題 ()

OpenFileName = GetOpenFileName(”エクセルファイル,*.*”)
If OpenFileName <>”False” Then
workbooks.Open OpenFileName
Else
msgbox ”キャンセルしました”
Exit sub
EndIf

Set book1 = Activeworkbook

Activesheet.Copy Before:=Thisworkbook.sheet(1)

workbooks(”book1”).Close SaveChanges:=False

Set sheet1 = Activesheet

ここまで作りました。

管理台帳を開き、
別ファイルにコピーし
管理台帳は閉じる、というところで、
実行するとエラーとなり、
デバッグをクリックしたら、管理台帳を閉じるコードが黄色くなります。

()の中の”を消してもダメでした。
配列数が大きい時と存在しない名前を指定した時になるとのことですが、、
Set〜のコードは、取得できていないのでしょうか?

マクロ初心者です。
インデックスが有効範囲にありませんとエラーになりました。



Dim OpenFileName As string
Dim book1 As Workbook
Dim sheet1 As worksheet

sub 問題 ()

OpenFileName = GetOpenFileName(”エクセルファイル,*.*”)
If OpenFileName <>”False” Then
workbooks.Open OpenFileName
Else
msgbox ”キャンセルしました”
Exit sub
EndIf

Set book1 = Activeworkbook

Activesheet.Copy Before:=Thisworkbook.sheet(1)

workbooks(”book1”).Close SaveChanges:=False

Set sheet1 = Ac...続きを読む

Aベストアンサー

こんにちは

>Set〜のコードは、取得できていないのでしょうか?
ご提示のコードではbook1が変数(=ワークブック)として設定されており、
 Set book1 = Activeworkbook
によって、Activeworkbookのオブジェクトが代入されています。

それなので、このブックを閉じるのであれば
 book1.Close SaveChanges:=False
で良いはずです。

>ネットでは、workbook(book1).Close〜
>もしくはworkbook(”book1.xls”)など
workbooks(”book1.xls”).Closeは、”book1.xls”(=文字列)という名のブックを閉じる際に用いますし、workbooks(book1).Closeの場合は、book1が文字列変数等であると考えられます。
例えば
 book1 = ”book1.xls”
 workbooks(book1).Close
で、一行目と同じ意味になりますよね。

変数とその意味するところを理解して使い分けることが必要です。
というか、意味を決めているのはそのコードを作成している質問者様なのですが。

こんにちは

>Set〜のコードは、取得できていないのでしょうか?
ご提示のコードではbook1が変数(=ワークブック)として設定されており、
 Set book1 = Activeworkbook
によって、Activeworkbookのオブジェクトが代入されています。

それなので、このブックを閉じるのであれば
 book1.Close SaveChanges:=False
で良いはずです。

>ネットでは、workbook(book1).Close〜
>もしくはworkbook(”book1.xls”)など
workbooks(”book1.xls”).Closeは、”book1.xls”(=文字列)という名のブックを閉じる際に用います...続きを読む


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報