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