• ベストアンサー

エクセルVBAでPDF/実行時エラー

以下はネットで検索して見つけたPDFのプリント用VBAですがやってみるとSet acroApp = CreateObject("AcroExch.APP")のところで実行時エラー「インターフェイスがサポートされていません」になります。 Adibe Acrobat 10.0 Type Liblaryも参照設定しました。 Windows11でエクセルは2019です。Acrobat Readerも入っています。 どうすればいいのでしょう? https://ziomatrix18.blog.fc2.com/blog-entry-406.html Sub test01() Dim ret As Integer Dim filePath As String filePath = "C:\Temp\Test.pdf" Dim acroApp As CAcroApp Dim pdDoc As CAcroPDDoc Dim avDoc As CAcroAVDoc Set acroApp = CreateObject("AcroExch.APP") Set pdDoc = CreateObject("AcroExch.PDDoc") Set avDoc = CreateObject("AcroExch.AVDoc") ret = acroApp.Show ret = avDoc.Open(filePath, "") Set pdDoc = avDoc.GetPDDoc() Dim numPage As Long numPage = pdDoc.GetNumPages ret = avDoc.PrintPages(0, numPage - 1, 2, 0, 0) ret = avDoc.Close(False) acroApp.Exit Set avDoc = Nothing Set pdDoc = Nothing Set acroApp = Nothing End Sub

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.7

No.6の追加です。 すぐだと印刷までにAcrobat Reader終了させてしまうので、時間をおいた方がいいですね、 Set wshObj = Nothing の後に(10秒待ちだと) Application.Wait Now() + TimeValue("00:00:10") Call TerminateAcrobat

emaxemax
質問者

お礼

ありがとうございます。 10秒では足りませんでしたが終了させることができました。 お世話になりました。

その他の回答 (6)

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.6

> このプリントで起動されたAcrobatReaderをプリント後自動的に終了させるにはどうしたらよろしいでしょうか? これは気になっていたのですが、強制的に終了させるしかないみたいです。 Acrobat OLEのエラーを防ぐVBAロジック https://pdf-file.nnn2.com/?p=1142 Acrobat ReaderではなくAcrobatのOLEでの操作(質問のコードと同じ)のページですが、強制終了はAcrobat Readerでも動きます。 上記の説明コードにある '*************************************************** ' メモリ上に残っているAcrobatプロセスを強制終了する。 '*************************************************** Private Sub TerminateAcrobat() Dim items As Object Dim item As Object Set items = CreateObject("WbemScripting.SWbemLocator") _ .ConnectServer.ExecQuery( _ "Select * From Win32_Process " & _ "Where Name = 'Acrobat.exe'") If items.Count > 0 Then For Each item In items item.Terminate Next End If End Sub 現在のコードの最後に '【2】Acrobatプロセスの強制終了:最後※非推奨 Call TerminateAcrobat として実行してください。 また AFormAut特有のVBA実行エラー https://pdf-file.nnn2.com/?p=1141 上記の 処理の最後で強制終了しない理由 あたりにも目を通して強制終了するかどうかは決めてください。

emaxemax
質問者

お礼

ありがとうございました。 助かります。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.5

> printPdf = "Acrobat.exe/t " & filePath & " " & printerName おしいです Acrobat.exe/t 「/」の前にスペースが必要です。 printPdf = "Acrobat.exe/t " & filePath & " " & printerName ↓ printPdf = "Acrobat.exe /t " & filePath & " " & printerName

emaxemax
質問者

お礼

ありがとうございます! 無事プリントできました。 最後にもう一つだけ教えていただけませんか? このプリントで起動されたAcrobatReaderをプリント後自動的に終了させるにはどうしたらよろしいでしょうか?

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.4

> printPdf = "test01.pdf/t " & filePath & " " & printerName ファイル名はそちらではなくAcrobat ReaderのEXEファイル名です。 Acrobat Readerのショートカット右クリックで プロパティのリンク先で見るか ファイルの場所を開くで確認してください。 64bit版なら以下のようになるかもしれません。 printPdf = "Acrobat.exe /t " & filePath & " " & printerName

emaxemax
質問者

お礼

あ、すみません。 ショートカット右クリックで確認しました。Acrobat.exeでした。 しかし、 printPdf = "Acrobat.exe/t " & filePath & " " & printerName でやりましたが同じところで同じエラーとなりました。

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.3

No.1の追加です。 リンクだけ記載してテストしてなかったので追加です。 通常使うプリンタで印刷する場合printerNameは指定しなくてもいけました。 また、AcroRd32.exeですが実際のAcrobat Readerのファイル名を指定してください。 なお、ページ指定したい場合は(どちらもテストしていません) ユーザーフォームのAcroPDFコントロールを使う エクセルのVBAからページ数を指定してPDFを印刷したい https://www.excel.studio-kazu.jp/kw/20120427163339.html もしくは PDF-XChange Viewerを使う PDF-XChange Viewer コマンドライン印刷について https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13201105318

emaxemax
質問者

お礼

ありがとうございます。ご教示のサイトのコードとアドバイスを参考に以下のようにやってみました。 オートメーションエラー「指定されたファイルが見つかりません」となってしまいました。 Sub Print_PDF() Dim WSH As Object Set WSH = CreateObject("Wscript.Shell") Dim wshObj As IWshRuntimeLibrary.WshShell Set wshObj = New IWshRuntimeLibrary.WshShell Dim printPdf As String Dim fileName As String Dim filePath As String Dim printerName As String Path = "C:\Users\xxxx\Documents\" 'WSH.SpecialFolders("Desktop") & "\" & "請求書" & "\" printerName = "EW-052A Series(ネットワーク) " '"Microsoft Print to PDF" fileName = "test01.pdf" 'Dir(Path & "*.pdf") ' Do While fileName <> "" filePath = Path & fileName ' printPdf = "AcroRd32.exe /t " & filePath & " " & printerName printPdf = "test01.pdf/t " & filePath & " " & printerName wshObj.Run (printPdf) 'ここでエラー! ' fileName = Dir() ' Loop Set wshObj = Nothing End Sub

  • MT765
  • ベストアンサー率56% (1898/3332)
回答No.2

有料版のAcrobatでないと使えないメソッドのようですね。 無料のAcrobat Readerの場合は下記サイトを参考にされたら良いかもしれません。 【VBAでPDFを印刷する方法・管理しやすいツールにする方法を解説!】 https://www.sejuku.net/blog/99169

emaxemax
質問者

お礼

ありがとうございます。 ご教示のサイトのコードを参考に以下のようにしてみましたが実行時エラーとなりました。 Sub PDF印刷_Shell() Dim wshShellObj As IWshRuntimeLibrary.WshShell 'Shellオブジェクト Set wshShellObj = New IWshRuntimeLibrary.WshShell Dim strShellCommand As String 'Shellコマンド Const folderPath = "C:\Users\xxxx\Documents\" '"C:UsersSiroDesktopPDF印刷_Shell" 'フォルダパス Const printFileName = "test01.pdf" '分割元のPDFファイル名 Const printFilePath = folderPath & printFileName '分割元のファイルパス Dim printerName As String 'プリンタ名 printerName = "EW-052A Series(ネットワーク) " 'Shellコマンドを設定 strShellCommand = "AcroRd32.exe /t " & printFilePath & " " & printerName 'Shellコマンドを実行 wshShellObj.Run (strShellCommand) '*ここでオートメーションエラー「指定したファイルが見つかりません」 'オブジェクトを強制開放 Set wshShellObj = Nothing End Sub

  • kkkkkm
  • ベストアンサー率65% (1617/2456)
回答No.1

AcrobatだといけるけどReaderだと駄目っぽい感じの情報が多いですね。 こちらもReaderで同じエラーでした。 WScript.Shellを利用する方法とか紹介されてました。 マクロ(VBA)を使ってPDFをまとめて複数印刷する方法 https://zangyou-macro.com/vba-pdf1/

emaxemax
質問者

お礼

ありがとうございます。AcrobatReaderではだめということですね。

関連するQ&A

  • VBAでPDFをテキスト出力する時のエラー

    PDFをテキスト出力するVBA実行時、Acrobatから「ファイルを開けません」とエラーメッセージが表示されます。何のファイルなのかわからないので教えてください。 下記VBAで、最終行の「objJs.SaveAs txtFilePath, "com.adobe.acrobat.plain-text"」でPDFは読み込まれて画面表示されますが、同時に「ファイルを開けません」というメッセージが表示されます。PDFは正常に読み込まれていると思われるので、ほかに何が必要なのか教えてください。 AcrobatとMicrosoftScriptingRuntimeは組み込んでいます。 -------------------------------------------- 'PDFのデータをExcelに読み込むメイン処理 Sub Main() 'PDFファイルをテキストに変換するための定数を用意 Const fileName = "テストファイル" Const folderPath = "C:\Data\" Const pdfFilePath = folderPath & fileName & ".pdf" Const txtFilePath = folderPath & fileName & ".txt" 'PDFファイルをテキストに変換 Call convPDFtoText(fileName, folderPath, pdfFilePath, txtFilePath) End Sub 'PDFファイルをテキスト変換する処理 Sub convPDFtoText(fileName As String, folderPath As String, pdfFilePath As String, txtFilePath As String) 'Acrobat操作用の変数を宣言 Dim objAcrobatApp As New Acrobat.AcroApp Dim objAcrobatAVDoc As New Acrobat.AcroAVDoc Dim objAcrobatPDDoc As Acrobat.AcroPDDoc Dim AcrobatId As Long Dim objJs As Object 'Acrobatアプリを起動 AcrobatId = objAcrobatApp.Show 'PDFファイルを開く AcrobatId = objAcrobatAVDoc.Open(pdfFilePath, "") 'PDDocオブジェクトを取得 Set objAcrobatPDDoc = objAcrobatAVDoc.GetPDDoc() 'Acrobat JavaScriptオブジェクトを作成 Set objJs = objAcrobatPDDoc.GetJSObject 'PDFをテキストで保存 objJs.SaveAs txtFilePath, "com.adobe.acrobat.plain-text"

  • VBAで外部プログラムを非表示で実行するには

    VBAとVBScriptを混同しているのかもしれませんがよく分からないので教えてください。 Excel2010のVBAから、外部プログラム(test.exe)をコマンドプロンプトを非表示の状態で実行して、外部プログラムの実行が終了するのを待ってから、次の処理をさせたいのですが、test1のプログラムでは(A)の部分でエラーになってしまいます。また、test2のプログラムでは正しく実行されるのですがコマンドプロンプトのウインドウを非表示にする方法がよく分かりません。 test1のプログラムでエラーをでなくする方法、または、test2のプログラムでコマンドプロンプトのウインドウを非表示にする方法がありましたら教えてください。 ------------------------------------------------------- Sub test1()  Dim ws As Object  Dim we As Object  Dim command As String  command = "C:\test.exe"  Set ws = CreateObject("WScript.Shell")  Set we = ws.Run("%ComSpec% /c " & command, 0, False) '<===(A)  Set we = Nothing  Set ws = Nothing End Sub ------------------------------------------------------- Sub test2()  Dim ws As Object  Dim we As Object  Dim command As String  command = "C:\test.exe"  Set ws = CreateObject("WScript.Shell")  Set we = ws.exec("%ComSpec% /c " & command)  Do Until we.Status   DoEvents  Loop  Set we = Nothing  Set ws = Nothing End Sub -------------------------------------------------------

  • エクセルvba

    エクセルvbaなのですが Sub test() Dim xlApp As Object Dim xlBook As Object Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) 'コード・・・ Set xlApp = Nothing Set xlBook = Nothing End Sub これだと Set xlBook = xlApp.Workbooks.Open(ActiveWorkbook.FullName) の部分で、エラーになります。 実行時エラー1004です。 自身ファイルをオブジェクトに格納して操作したいのですがどうすればいいでしょうか?

  • VBAで既存のパワポのファイルを開くには?

    アクセスやエクセルからVBAで既存のパワポのファイルを開くには? 参照設定をして、 Sub test() Dim App As PowerPoint.Application Dim MyFileName As String Set App = CreateObject("PowerPoint.Application") MyFileName = CurrentProject.Path & "サンプル.ppt" App.Visible = True Set App = Nothing End Sub を実行すると、パワポの空のアプリケーション開きますが肝心のファイルが開きません。 開く方法を教えてください。

  • エクセルVBAで実行時エラー438

    自宅のエクセル2019や、会社のMicrosoft365では問題なく動く下記のコードですが、エクセル2016のパソコンでは「実行時エラー '438':オブジェクトは、このプロパティまたはメソッドをサポートしていません。」となります。これはエクセルのバージョンの問題でしょうか?対応する方法はありませんか? Sub sample() Dim url As String Dim zip As String Dim httpReq As Object Dim httpDoc As Object Dim data As Object Dim line As Object Dim State As String Dim city As String Dim addressLine As String 'URL url = "https://www.post.japanpost.jp/cgi-zip/zipcode.php?zip=" '郵便番号 zip = "1000001" 'HTTPリクエスト実行 Set httpReq = CreateObject("WinHttp.WinHttpRequest.5.1") httpReq.Open "GET", url & zip, False httpReq.Send '「HTMLDocumentオブジェクト」にHTTPレスポンスを設定 Set httpDoc = CreateObject("htmlfile") httpDoc.body.innerHTML = httpReq.responseText '都道府県と市区を抜き出す Set data = httpDoc.getElementsByClassName("data") 'ここでエラー State = data(1).innerText city = data(2).innerText '町村を抜き出す Set line = httpDoc.getElementsByClassName("line") addressLine = line(0).innerText '結果 MsgBox (State & city & addressLine) '後片づけ Set httpReq = Nothing Set httpDoc = Nothing End Sub このコードは以下のサイトからコピペしたものです。 https://excel-vba.work/2023/03/27/%e3%80%90vba%e3%80%91%e9%83%b5%e4%be%bf%e7%95%aa%e5%8f%b7%e3%81%8b%e3%82%89%e4%bd%8f%e6%89%80%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b/

  • エクセルVBAでPDFを1枚目のみ印刷したい

    下記のVBAに複数PDFが重なっている場合は、一枚目のみ印刷する文面を 挿入したいのですがうまくいきません Sub Test() Dim z As Object Dim i As Long Dim f, p As String Application.ScreenUpdating = False Set z = CreateObject("WScript.Shell") p = Application.ActivePrinter For i = 1 To Range("A1").End(xlDown).Row f = "h:\hozei\" & Cells(i, 1).Value & ".pdf" If Dir(f) <> "" Then z.Run ("AcroRd32.exe /t " & f) Else Cells(i, 2).Value = Cells(i, 1).Value Cells(i, 1).Value = "" End If Next i Set z = Nothing End Sub お忙しいところ申し訳ございません どなたかご教示願います。

  • CreateObjectとGetObjectの違い

    当方エクセル2003です。 Sub test_CreateObject() Dim App As Excel.Application Dim MyFileName As String Set App = CreateObject("Excel.Application") MyFileName = ActiveWorkbook.Path & "\新規Microsoft Excel ワークシート.xls" With App .Workbooks.Open FileName:=MyFileName .Visible = True End With Set App = Nothing End Sub --------------------------------------------------------- Sub test_GetObject() Dim App As Excel.Application Dim MyFileName As String Set App = GetObject(, "Excel.Application") MyFileName = ActiveWorkbook.Path & "\新規Microsoft Excel ワークシート.xls" With App .Workbooks.Open FileName:=MyFileName .Visible = True End With Set App = Nothing End Sub この二つは何が違うのでしょうか? どちらも既存のエクセルファイルがが開きます。

  • エクセルVBAでPDFを開く

    以下のような記述でアクロバットリーダーは立ち上がるのですが、 「この文書を開くときにエラーが発生しました。このファイルが見つかりません」 と出てきてしまいます。 どのようにしたら開いてくれるのでしょうか? Sub test3() Dim P As String P = "\\C:\AAA\sample.PDF" Shell "C:\Program Files\Adobe\Reader 11.0\Reader\AcroRd32.exe" & " " & P, vbNormalFocus End Sub

  • エクセルVBAでエラー!

    エクセルでVBAを組んでいます。 Aシート・Bシートにデータがあり、それをSQLで集計し、 Cシートに出力をしたいのですが、 『リンクされているExcelのワークシートを表示するための接続が切断されました。』 というエラーが出て、解決しません。 (調べてみましたが、似たような例がなく解決には至りませんでした・・・。) どなたかご教示お願い致します。 Private Sub CommandButton1_Click() Dim dbCon As Object Dim dbCols As Object Dim dbRes As Object Dim strSQL As String Dim sh1 As Worksheet Set sh1 = Worksheets("Cシート") Set dbCon = CreateObject("ADODB.Connection") dbCon.Provider = "Microsoft.Jet.OLEDB.4.0" dbCon.Properties("Extended Properties") = "Excel 8.0" dbCon.Open ThisWorkbook.FullName strSQL = "" strSQL = strSQL & "SELECT *" strSQL = strSQL & vbCrLf & "FROM [Aシート$] LEFT JOIN [Bシート$] ON [Aシート$].NO= [Bシート$].NO" Set dbRes = CreateObject("ADODB.Recordset") dbRes.Open strSQL, dbCon, adOpenKeyset, adLockReadOnly sh1.Range("A1").CopyFromRecordset dbRes dbRes.Close Set dbRes = Nothing dbCon.Close Set dbCon = Nothing End Sub

  • SETを使ったほうがよい?

    accwessからエクセルファイルを開きたいのですが、 App.Workbooks.Open と、 Set xlBook = xlApp.Workbooks.Open とどちらを使った方がいいのでしょうか? ////////////////////////////////////////////////////////// Private Sub ファイル1_Click() Dim App As Object Dim MyFileName As String MyFileName = "D:\My Documents\test.xls" Set App = CreateObject("Excel.Application") App.Workbooks.Open FileName:=MyFileName App.Visible = True End Sub でも Private Sub ファイル2_Click() Dim xlApp As Object Dim xlBook As Object Dim FileName As String Const FolderName = "D:\My Documents\test.xls" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(FolderName & FileName) xlApp.Visible = True Set xlApp = Nothing Set xlBook = Nothing End Sub ////////////////////////////////////////////////////////// でも開けました。 多分、SETを使うかどうかの違いだと思うのですが VBAでコードを作る際、どちらのコードを使った方がいいか教えてください。

専門家に質問してみよう