アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。

現在、AccessVBAを使用して、簡単なレポートを、PDFとして出力するプログラムを立てているのですが、レポート出力をループで回して、VBAよりPDFファイルを自動的に保存したいのですが・・・。

'(テーブル情報のIDが1の情報のみ、PDFで出力)
DoCmd.OpenReport "レポート名", acNormal, , "ID=1"

以上のロジックを、実行すると、「ファイルの保存先ダイアログ」が勝手に開きます・・。

プリンタの設定は事前にAcrobatに設定してあるので、PDF化は容易に出来るのですが、上記のロジックを実際には(IDの数だけ)ループで回しているので、毎回「名前を付けて保存」ダイアログが開くのがとても煩わしいです(:_;)。

VBA上で、保存先を指定して、「名前を付けて保存」ダイアログが開かないようにする方法はないでしょうか?
今日一日調べても有力な手がかりが無かったので、どなたかご教授下さい。

A 回答 (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
    • good
    • 0

ミス訂正。

My Document のスペース忘れてました。
× If UCase$(sTmp) Like "MYDOCUMENT*" Then
○ If UCase$(sTmp) Like "*MY DOCUMENT*" Then
    • good
    • 0
この回答へのお礼

KenKen_SPさん!!
わざわざ参考ソースまで載せて頂き、本当にありがとうございました!

KenKen_SPさんのソースを参考にさせて頂き、組み込んだ結果、万事うまくいきました(^^)!

本当に助かりました!
ありがとうございました!!
No.2も重ねて、お礼申し上げあげます。
本当に助かりました!

お礼日時:2006/10/31 08:47

こんにちは。



> VBA上で、保存先を指定して、「名前を付けて保存」ダイアログが開か
> ないようにする方法はないでしょうか?

印刷設定で Adobe PDF 設定-「PDF ファイルの保存先を確認」のチェックを
解除することで、ダイアログが表示されなくなります。この時、ファイルが
保存されるのは印刷ポートで指定したフォルダです。

保存先フォルダは Printer オブジェクトで調べられるかな?
プリンタ名の「 ~ On ポート名」とかから...確認してませんが。

VBA で保存先を指定となると...アイディアですが、印刷キューを送信した
後、そのフォルダにファイルがあるか Dir 関数などで監視しながら待機して
ファイルが出来上がったら移動するとか?

# 確実な方法なら ACROBAT SDK のドキュメントを読むしかないかなと思い
# ます。英語版しかありませんが...

PDFWriter なら、レジストリか INI ファイルに上記のような設定があるの
ではないかと思いますが、これは推測でしかありません。レジストリエディ
ターで HKEY_CURRENT_USER\SOFTWARE\ADOBE 辺りを調べてみて下さい。

INI なら Windows フォルダ内か、Program Files フォルダ辺りでしょう。
それらしい INI がないか確認してみて下さい。

# 私の環境には、PDFWriter がインストールされてませんので確認できません。
    • good
    • 0
この回答へのお礼

KenKen_SPさん!細かい説明真にありがとうございます!
>印刷設定で Adobe PDF 設定-「PDF ファイルの保存先を確認」のチェック>を解除することで、ダイアログが表示されなくなります。この時、ファイル>が保存されるのは印刷ポートで指定したフォルダです。
なるほど!Adobe Acrobatの方で、事前に設定しておくということですね!

>保存先フォルダは Printer オブジェクトで調べられるかな?
>プリンタ名の「 ~ On ポート名」とかから...確認してませんが。
そうなんです!Printerオブジェクトなんですが、今色々と調べてはいるのですが、開発環境はAccess2000なのですが、PrinterオブジェクトはAccess2002~実装されているオブジェクトのようです。(私が調べた結果が勘違いしているかもしれませんが・・・)

>INI なら Windows フォルダ内か、Program Files フォルダ辺りでしょう。それらしい INI がないか確認してみて下さい。

こちらももう一度調べてみますね!
また何か解りましたら、情報よろしくお願いいたします。

お礼日時:2006/10/30 07:47

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

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


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