- ベストアンサー
AccessVBAで簡単にレポートをPDF出力する方法
- AccessVBAを使用して、簡単なレポートをPDFとして出力する方法を紹介します。
- ループを使用して、複数のレポートをPDFとして自動的に保存する方法について解説します。
- VBA上で保存先を指定し、「名前を付けて保存」ダイアログを開かないようにする方法についてもお教えします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 開発環境は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)
ミス訂正。My Document のスペース忘れてました。 × If UCase$(sTmp) Like "MYDOCUMENT*" Then ○ If UCase$(sTmp) Like "*MY DOCUMENT*" Then
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 > VBA上で、保存先を指定して、「名前を付けて保存」ダイアログが開か > ないようにする方法はないでしょうか? 印刷設定で Adobe PDF 設定-「PDF ファイルの保存先を確認」のチェックを 解除することで、ダイアログが表示されなくなります。この時、ファイルが 保存されるのは印刷ポートで指定したフォルダです。 保存先フォルダは Printer オブジェクトで調べられるかな? プリンタ名の「 ~ On ポート名」とかから...確認してませんが。 VBA で保存先を指定となると...アイディアですが、印刷キューを送信した 後、そのフォルダにファイルがあるか Dir 関数などで監視しながら待機して ファイルが出来上がったら移動するとか? # 確実な方法なら ACROBAT SDK のドキュメントを読むしかないかなと思い # ます。英語版しかありませんが... PDFWriter なら、レジストリか INI ファイルに上記のような設定があるの ではないかと思いますが、これは推測でしかありません。レジストリエディ ターで HKEY_CURRENT_USER\SOFTWARE\ADOBE 辺りを調べてみて下さい。 INI なら Windows フォルダ内か、Program Files フォルダ辺りでしょう。 それらしい INI がないか確認してみて下さい。 # 私の環境には、PDFWriter がインストールされてませんので確認できません。
お礼
KenKen_SPさん!細かい説明真にありがとうございます! >印刷設定で Adobe PDF 設定-「PDF ファイルの保存先を確認」のチェック>を解除することで、ダイアログが表示されなくなります。この時、ファイル>が保存されるのは印刷ポートで指定したフォルダです。 なるほど!Adobe Acrobatの方で、事前に設定しておくということですね! >保存先フォルダは Printer オブジェクトで調べられるかな? >プリンタ名の「 ~ On ポート名」とかから...確認してませんが。 そうなんです!Printerオブジェクトなんですが、今色々と調べてはいるのですが、開発環境はAccess2000なのですが、PrinterオブジェクトはAccess2002~実装されているオブジェクトのようです。(私が調べた結果が勘違いしているかもしれませんが・・・) >INI なら Windows フォルダ内か、Program Files フォルダ辺りでしょう。それらしい INI がないか確認してみて下さい。 こちらももう一度調べてみますね! また何か解りましたら、情報よろしくお願いいたします。
お礼
KenKen_SPさん!! わざわざ参考ソースまで載せて頂き、本当にありがとうございました! KenKen_SPさんのソースを参考にさせて頂き、組み込んだ結果、万事うまくいきました(^^)! 本当に助かりました! ありがとうございました!! No.2も重ねて、お礼申し上げあげます。 本当に助かりました!