• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:AccessVBAでレポートをPDFで出力)

AccessVBAで簡単にレポートをPDF出力する方法

このQ&Aのポイント
  • AccessVBAを使用して、簡単なレポートをPDFとして出力する方法を紹介します。
  • ループを使用して、複数のレポートをPDFとして自動的に保存する方法について解説します。
  • VBA上で保存先を指定し、「名前を付けて保存」ダイアログを開かないようにする方法についてもお教えします。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

> 開発環境はAccess2000なのですが、PrinterオブジェクトはAccess2002~ > 実装されているオブジェクトのようです。 その通りです。Access2000 ですか... ほぼ同程度の情報取得関数を自前で用意するしかなさそうですね。 WMI を使ってます。それと MyDocument のパス取得に手抜きで WSH を 使ってますのでご注意を。 2つの関数+使い方サンプルです。 WinXP + Access2002 VBA で動作確認しましたが、多分 Excel や Word VBA でも動きます。もちろん 多分 Access2000 でも。 自分の限られた環境でしかテストしてないので、できれば動作報告して いただけると助かります。 Option Explicit ' プリンタ情報を保持する構造体 Public Type PRINTER_STRUCT   PrinterName  As String  ' プリンタ名   PortName    As String  ' ポート名   DriverName   As String  ' ドライバー名   DefaultPrinter As Boolean ' 通常使うプリンタか? End Type ' // プリンタを列挙する(WMI版) Public Function EnumPrinters(ByRef uPrinter() As PRINTER_STRUCT) As Long      ' 引 数: uPrinter PRINTER_STRUCT ここにプリンタ情報が返る   ' 戻り値: Long 成功時/インストールされたプリンタ数 失敗時: -1      Dim Printers  As Object   Dim Prt     As Object   Dim lPrtCount  As Long   Dim i      As Long   Set Printers = CreateObject("WbemScripting.SWbemLocator").ConnectServer _           .ExecQuery("Select * From Win32_Printer")   lPrtCount = Printers.Count   ReDim uPrinter(lPrtCount - 1)   i = 0   For Each Prt In Printers     With uPrinter(i)       .PrinterName = Prt.Caption       .PortName = Prt.PortName       .DriverName = Prt.DriverName       .DefaultPrinter = CBool(Prt.Default)     End With     i = i + 1   Next Prt   If lPrtCount > 0 Then EnumPrinters = lPrtCount   Set Printers = Nothing   Exit Function ERROR_HANDLER:   EnumPrinters = -1 End Function ' // PDF プリンタのポート名からデフォルトの保存先パスを取得 Public Function GetPDFSavePath() As String      ' 戻り値: 成功時/PDF プリンタの保存先パス 失敗時/""(長さ0の文字列)   ' 注 意: 戻り値の終端に¥(パスセパレータ)があるかどうか要チェック      Dim uPrinter() As PRINTER_STRUCT   Dim lRet    As Long   Dim lCnt    As Long   Dim sTmp    As String   Dim i     As Long   GetPDFSavePath = ""   lRet = EnumPrinters(uPrinter)   If lRet > 0 Then     lCnt = UBound(uPrinter)     For i = 0 To lCnt       ' ドライバー名で PDF プリンタか判定       If UCase$(uPrinter(i).DriverName) Like "*PDF*" Then         sTmp = uPrinter(i).PortName         If UCase$(sTmp) Like "MYDOCUMENT*" Then           sTmp = CreateObject("WScript.Shell").SpecialFolders("MyDocuments")         Else           sTmp = Left$(sTmp, InStr(sTmp, "*.pdf") - 1)         End If         GetPDFSavePath = sTmp         Exit For       End If     Next i   End If   Erase uPrinter End Function Sub 使い方()   ' EnumPrinters 関数   Dim uPrinter() As PRINTER_STRUCT '<-- 構造体を配列で渡す   Dim lRet    As Long   Dim i     As Long   lRet = EnumPrinters(uPrinter)   Debug.Print "Installed Printer Device: " & CStr(lRet)   For i = 0 To lRet - 1     Debug.Print "----------------------------------------------------------"     Debug.Print " Name  : " & uPrinter(i).PrinterName     Debug.Print " Port  : " & uPrinter(i).PortName     Debug.Print " Driver : " & uPrinter(i).DriverName     Debug.Print " Default: " & CStr(uPrinter(i).DefaultPrinter)   Next i   Erase uPrinter   Debug.Print "----------------------------------------------------------"   ' GetPDFSavePath 関数   Dim sPath As String   sPath = GetPDFSavePath()   If sPath = "" Then     Debug.Print "PDF プリンタ発見できず...orz"   Else     Debug.Print "PDF Printer Save Dir Path"     Debug.Print " " & sPath   End If End Sub

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

ミス訂正。My Document のスペース忘れてました。 × If UCase$(sTmp) Like "MYDOCUMENT*" Then ○ If UCase$(sTmp) Like "*MY DOCUMENT*" Then

kyo----
質問者

お礼

KenKen_SPさん!! わざわざ参考ソースまで載せて頂き、本当にありがとうございました! KenKen_SPさんのソースを参考にさせて頂き、組み込んだ結果、万事うまくいきました(^^)! 本当に助かりました! ありがとうございました!! No.2も重ねて、お礼申し上げあげます。 本当に助かりました!

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

こんにちは。 > VBA上で、保存先を指定して、「名前を付けて保存」ダイアログが開か > ないようにする方法はないでしょうか? 印刷設定で Adobe PDF 設定-「PDF ファイルの保存先を確認」のチェックを 解除することで、ダイアログが表示されなくなります。この時、ファイルが 保存されるのは印刷ポートで指定したフォルダです。 保存先フォルダは Printer オブジェクトで調べられるかな? プリンタ名の「 ~ On ポート名」とかから...確認してませんが。 VBA で保存先を指定となると...アイディアですが、印刷キューを送信した 後、そのフォルダにファイルがあるか Dir 関数などで監視しながら待機して ファイルが出来上がったら移動するとか? # 確実な方法なら ACROBAT SDK のドキュメントを読むしかないかなと思い # ます。英語版しかありませんが... PDFWriter なら、レジストリか INI ファイルに上記のような設定があるの ではないかと思いますが、これは推測でしかありません。レジストリエディ ターで HKEY_CURRENT_USER\SOFTWARE\ADOBE 辺りを調べてみて下さい。 INI なら Windows フォルダ内か、Program Files フォルダ辺りでしょう。 それらしい INI がないか確認してみて下さい。 # 私の環境には、PDFWriter がインストールされてませんので確認できません。

kyo----
質問者

お礼

KenKen_SPさん!細かい説明真にありがとうございます! >印刷設定で Adobe PDF 設定-「PDF ファイルの保存先を確認」のチェック>を解除することで、ダイアログが表示されなくなります。この時、ファイル>が保存されるのは印刷ポートで指定したフォルダです。 なるほど!Adobe Acrobatの方で、事前に設定しておくということですね! >保存先フォルダは Printer オブジェクトで調べられるかな? >プリンタ名の「 ~ On ポート名」とかから...確認してませんが。 そうなんです!Printerオブジェクトなんですが、今色々と調べてはいるのですが、開発環境はAccess2000なのですが、PrinterオブジェクトはAccess2002~実装されているオブジェクトのようです。(私が調べた結果が勘違いしているかもしれませんが・・・) >INI なら Windows フォルダ内か、Program Files フォルダ辺りでしょう。それらしい INI がないか確認してみて下さい。 こちらももう一度調べてみますね! また何か解りましたら、情報よろしくお願いいたします。