プリントサーバーの全ての用紙サイズとIDを取得する方法はあるのか

このQ&Aのポイント
  • Accessにて印刷を行っている場合、通常使うプリンタの用紙サイズしか取得できないが、プリントサーバーにある全ての用紙サイズとIDを取得する方法はあるのか
  • 使用しているOSはVistaで、Access2007を使用している。プリンタはドットとレーザーを使用している。
  • プリンタデバイスドライバの能力を取得する関数を使用して、用紙名を取得し、テーブルに保存している。
回答を見る
  • ベストアンサー

プリントサーバーに登録してある用紙サイズの取得

いつもご参考にさせて頂いております。 現在Accessにて印刷を行っています。 そこで現状Accessを立ち上げた時に用紙サイズとそのIDを取得する様にしていますが、通常使うプリンタの用紙サイズしか見に行きません。 プリントサーバーにある全ての用紙サイズとIDを取得する方法はあるのでしょうか? どなたかご教授宜しくお願い致します。 OS:Vista , Access2007 プリンタはドットとレーザーを使用しています。 もし下記以外にもっといい方法があれば、是非ご教授宜しくお願い致します。 'プリンタデバイスドライバの能力を取得する関数の宣言 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal pDevice As String, ByVal pPort As String, ByVal fwCapability As Long, pOutput As Any, pDevMode As Any) As Long 'ある位置から別の位置にメモリブロックを移動する関数の宣言 Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) 'DeviceCapabilities function constants. Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 Private Sub Form_Load() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long Dim db As Database Dim rs As Recordset '用紙サイズと番号を保存するテーブルの削除 DoCmd.RunSQL "DELETE * FROM [T_PaperSize]" Set db = CurrentDb Set rs = db.OpenRecordset("T_PaperSize") With Printer strDeviceName = .DeviceName strDevicePort = .Port End With '問い合わせる内容を指定 'バッファに必要なサイズを取得 lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, _ ByVal vbNullString, ByVal vbNullString) ' バッファ確保 ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) '用紙名を取得 DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString '用紙IDを取得 lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) '用紙名を検索 For lngCounter = 0 To lngPaperCount - 1 '用紙名コピー MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 ' 用紙名追加 'Debug.Print Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) & " " & aintNubytPaper(lngCounter + 1) rs.AddNew rs![ID] = aintNubytPaper(lngCounter + 1) rs![用紙名] = Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) rs.Update Next lngCounter End Sub

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

  • ベストアンサー
  • OKwebb
  • ベストアンサー率44% (92/208)
回答No.1

Application.PrintersからPrinterオブジェクトを取得してくるくるまわす。 例: Dim prt As Printer For Each prt In Application.Printers Debug.Print "デバイス名 : " & prt.DeviceName & vbCrLf _ & "ドライバ名 : " & prt.DriverName & vbCrLf _ & "ポート : " & prt.Port Next prt

michaelme
質問者

お礼

OKwebb様 ご返事ありがとうございました。 無事取得することができました。 本当にありがとうございました。

関連するQ&A

  • Excelで用紙番号取得

    Excel2000 VBAで用紙番号を取得しようと考えています。 調べてみたのですが、APIのDeviceCapabilities()が使用できそうな感じというのは解ったのですが、 バッファというのがいまいち解らず使えません。 出力バッファやデバイスデータのバッファとは何を指してるのでしょうか? また、以下コードをExcel2000で実行するとエラーになります。 やはりバッファの使い方がおかしいのでしょうか? アドバイスよろしくお願いいたします。 Sub Numbertest() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long GetPrinterNameAndPort sDeviceName, sDevicePort ' バッファに必要なサイズを取得 lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString) ' バッファ確保 ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) '用紙名を取得 DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString 'paper numbers を取得 lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) '用紙名を列挙 For lngCounter = 0 To lngPaperCount - 1 ' 用紙名コピー MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 ' 用紙名追加 MsgBox aintNubytPaper(lngCounter + 1) MsgBox Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) Next lngCounter End Sub

  • ExcelでDeviceCapabilitie

    ExcelでAPIを使用して、用紙番号を取得したいと考えています。 Excel2007(OS Win7)上では取得できるのですがExcel2000(OS WinXP)上ではエラー。 GetPrinterNameAndPortで、『 on 』と『 の 』がバージョンによって変えてもダメでした。アドバイスよろしくお願い致します。 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal pDevice As String, ByVal pPort As String, ByVal fwCapability As Long, pOutput As Any, pDevMode As Any) As Long Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 Sub Numbertest() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long GetPrinterNameAndPort strDeviceName, strDevicePort lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString) ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) For lngCounter = 0 To lngPaperCount - 1 MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 MsgBox aintNubytPaper(lngCounter + 1) & " & " & Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) Next lngCounter End Sub Private Sub GetPrinterNameAndPort(printerName As String, printerPort As String) Dim sString As String Const searchText As String = " on " ←使い分け ' Const searchText As String = " の " sString = ActivePrinter printerName = Left(sString, InStr(1, sString, searchText) - 1) printerPort = Right(sString, Len(sString) - Len(printerName) - Len(searchText)) End Sub

  • アクティブなプリンターでサポートされている用紙名

    http://support.microsoft.com/kb/229718/ja で「アクティブなプリンターでサポートされている用紙名の一覧を取得するマクロ」を見つけたので自分の環境で実行してみました。 OS:Windows XP SP3 アプリケーション: エクセル2002(SP3) 結果はメッセージボックスが表示されるのですが、用紙名のリストが数文字ずつ少なり、リストの最後は「 ) 」の一文字だけになります。またプリンタードライバーがリストする用紙の種類よりも少なくなっています。文字数がなくなったのだと思いますが・・・・・ active printerを取得→そのプリンタードライバを開く→ドライバーが持っている用紙の数を取得→For~Nextでテキストに追加→メッセージボックスで表示しているだろうことはわかるのですが、得られる結果(用紙名の文字数が減少する)がわかりません。 どこをどのように直せば用紙名(できれば「サイズ」「用紙名の番号」も)取得できるでしょうか? さらに言えば、メッセージボックスでなくワークシートのセルに書き出したいです。 お知恵をお貸しください。 該当のコードは以下のとおりです。 Option Explicit Private Declare Function OpenPrinter Lib "winspool.drv" Alias _ "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _ ByVal pDefault As Long) As Long Private Declare Function ClosePrinter Lib "winspool.drv" ( _ ByVal hPrinter As Long) As Long Private Declare Function DeviceCapabilities Lib "winspool.drv" _ Alias "DeviceCapabilitiesA" (ByVal lpsDeviceName As String, _ ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _ ByVal dev As Long) As Long Private Const DC_PAPERNAMES = 16 ' Value obtained from wingdi.h Sub GetPaperList() ' Display a message box with the name of the active printer and a list ' of papers it supports. Dim lPaperCount As Long Dim lCounter As Long Dim hPrinter As Long Dim sDeviceName As String Dim sDevicePort As String Dim sPaperNamesList As String Dim sNextString As String Dim sTextString As String Dim iNumPaper() As Integer GetPrinterNameAndPort sDeviceName, sDevicePort If OpenPrinter(sDeviceName, hPrinter, 0) <> 0 Then ' Get count of paper names supported by active printer. lPaperCount = DeviceCapabilities(sDeviceName, _ sDevicePort, _ DC_PAPERNAMES, _ ByVal vbNullString, 0) ReDim iNumPaper(1 To lPaperCount) sPaperNamesList = String(64 * lPaperCount, 0) ' Get paper names supported by active printer. lPaperCount = DeviceCapabilities(sDeviceName, _ sDevicePort, _ DC_PAPERNAMES, _ ByVal sPaperNamesList, 0) ' List available paper names. sTextString = "Paper available for " & ActivePrinter For lCounter = 1 To lPaperCount ' Get a paper name. sNextString = Mid(sPaperNamesList, _ 64 * (lCounter - 1) + 1, 64) sNextString = Left(sNextString, _ InStr(1, sNextString, Chr(0)) - 1) ' Have one paper name. sNextString = String(6 - Len(CStr(iNumPaper(lCounter))), _ " ") & sNextString ' Add paper name to text string for message box. sTextString = sTextString & Chr(13) & sNextString Next lCounter ClosePrinter (hPrinter) ' Show paper names in message box. MsgBox sTextString Else MsgBox ActivePrinter & " <Unavailable>" End If End Sub Private Sub GetPrinterNameAndPort(printerName As String, _ printerPort As String) ' ActivePrinter yields a name of the form "Printer XYZ on LPT1" while the ' DeviceCapabilities function requires a printer name and port. ' ' Out: ' printerName Printer name derived from ActivePrinter property ' printerPort Printer port derived from ActivePrinter property Dim sString As String Const searchText As String = " on " sString = ActivePrinter printerName = Left(sString, InStr(1, sString, searchText) - 1) printerPort = Right(sString, _ Len(sString) - Len(printerName) - Len(searchText)) End Sub ※support.microsoft.comのサンプルコードなのに・・・・

  • Excelで検索、その後

     過去に、Excelファイルから外部ファイルを検索するダイアログの呼出方法をこのサイトで教わった者です。 以下にそのソースを書きます。 Option Explicit Private Declare Function ShellExecute Lib _ "Shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal lpOperation As String, _ ByVal lpFile As String, ByVal lpParameters As String, _ ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Const SW_SHOWNORMAL = 1 Private Const SW_SHOWMINIMIZED = 2 Private Const SW_SHOWMAXIMIZED = 3 Private Const SW_SHOW = 5 Private Const SW_MINIMIZE = 6 Private Const SW_SHOWMINNOACTIVE = 7 Private Const SW_SHOWNA = 8 Private Const SW_RESTORE = 9 Private Const SW_SHOWDEFAULT = 10 Sub 検索ダイアログを出す() ShellExecute 0, "find", "C:\", vbNullString, vbNullString, SW_SHOWNORMAL End Sub    このダイアログを呼び出すと同時に、検索結果を表示する事は可能でしょうか?  なんとか自分で解釈してこれを行いたかったのですが、 時間ばかりが進んで上手く行きません。  vbNullStringの部分にstring型のデータを代入すれば動くと信じていたのですが、ダイアログ出現寺に表示もされないので、更に突っ込んだ検索結果表示なんて夢のまた夢(^^;;;)。  宜しくお願いしますm(_ _)m。

  • windows7のエクスプローラをVBAで操作-1

    アドバイスをお願いします。 Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。 WindowsXPのときはできていたのですが、Windows7になったら正しく動作しなくなりました。 下のコードはエクスプローラの現在のフォルダパスが表示されるところに(添付ファイル参照)文字を入れるものです。 最後のSendMessageAnyで1が返ってしまいます。何が考えられますでしょうか。どう対策したらいいでしょうか。 なおハンドルの値はSDKのInspect Objectsで確認していますので、正しく取得できていると思っています。 よろしくお願いします。 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Declare Function SendMessageAny Lib "user32.dll" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal MSG As Long, _ ByVal wParam As Long, _ ByVal lParam As Any) As Long Const WM_SETTEXT = &HC Private hwnd As Long Private FOLDER As String Sub Put_folder_name1() hwnd = FindWindow("CabinetWClass", vbNullString) hwnd = FindWindowEx(hwnd, 0, "WorkerW", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Address Band Root", vbNullString) hwnd = FindWindowEx(hwnd, 0, "msctls_progress32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBoxEx32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBox", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString) FOLDER = "\\xx.xx.xx.xx\test" RC = SendMessageAny(hwnd, WM_SETTEXT, 0, ByVal FOLDER) end sub

  • WinAPIで電卓をクリック

    現在、WinAPIを勉強しており、練習としてVBAを用いて、電卓アプリのボタンをクリックしようとしています。 キーを送るのではなく、クリックで行いたいたいと 考えています。 ボタンのハンドルを取得するところまではできましたが、sendMessageでクリックできず、EditBoxに数字が 入りません。 どのようにすればよいのかご教授ください。 よろしくお願い致します。 環境: WinXP home、 Excel2002、Win付属アプリの電卓v5.1 ---作成したプログラム---- '標準モジュールの中身 Option Explicit Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long Private Const WM_LBUTTONDOWN = &H201 Private Const WM_LBUTTONUP = &H202 Sub Main() Dim lngWindWnd As Long 'ウィンドウハンドル Dim ret As Long Dim hCalc As Long 'アプリケーションタイトルより、ウィンドウハンドルを得ます lngWindWnd = FindWindow(vbNullString, "電卓") '8ボタンのハンドル(確実に取れていることを確認 hCalc = FindWindowEx(lngWindWnd, 0, "Button", "8") ret = SetForegroundWindow(lngWindWnd) ret = SendMessage(hCalc, WM_LBUTTONDOWN, 0, 0) End Sub

  • 他のアプリケーションの hDC を取得したい

     APIの初歩的なことですみません 他のアプリケーションの hDC を取得して GetPixel() API等 を使用したいのですが どうもうまくいきません hDC や hWnd あたりがよくわからないのが 原因だと思いますが、分かる方教えてください  ソースは以下の様な感じです Private Declare Function FindWindowA Lib "user32" (ByVal cnm As String, ByVal cap As String) As Long Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long lhWnd = FindWindowA(vbNullString, "ExpApp") lColor = GetPixel(lhWnd, ix, iy)

  • SendMessageによるチェックボックスの状態取得

    はじめまして、VB.NET2005でチェックボックスの状態の取得、設定をうまく設定できません。OSはxpです。 Public Class Form1 Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"  (ByVal lpClassName As String, _ ByVal lpWindowName As String) As Integer Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, _ ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, _ ByVal wMsg As Integer, ByVal wParam As Integer, ByVal iParam As String) As Integer Private Declare Function SendMessageint Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, _ ByVal wMsg As Integer, ByVal wParam As Integer, ByVal iParam As Integer) As Integer Const BM_GETCHECK = &HF0 Const BM_GETSTATE = &HF2 Const BM_SETCHECK = &HF1 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim hWindows As Integer Dim ipEDIT As Integer Dim i As Integer hWindows = FindWindow(vbNullString, "Form1") '198458 ipEDIT = FindWindowEx(hWindows, 0, vbNullString, "CheckBox1") MessageBox.Show(ipEDIT) i = SendMessageint(ipEDIT, BM_GETCHECK, 0, 0) 'SendMessageint(ipEDIT, BM_SETCHECK, 1, 0) MessageBox.Show(i) End Sub End Class のようなコードなのですが、 ハンドルは取得できているのですが、 SendMessageの戻り値は0になります。 勿論、コメントのチェックをセットも出来ません。 ご教授のほど宜しくお願いします。

  • vba引数の渡し方について

    win32APIで作成したシステムを64bit環境でも動くよう修正をしています。 win7、access2010 以下のとおり宣言変更したところ、lpDevMode型が32bitの場合Long型、64bitはDEVMODE(構造体)となりました。 この時、Private Const DEFAULT_VALUES = 0のところは64bit用にどのように修正したらよいのでしょうか? このままコンパイルすると「ByRef 引数の型が一致しません。」となります。 <<宣言>> #If VBA7 And Win64 Then     Private Declare PtrSafe Function DeviceCapabilities Lib "winspool.drv" _         Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, _         ByVal lpPort As String, ByVal iIndex As Long, ByVal lpOutput As String, _         lpDevMode As DEVMODE) As Long #Else     Private Declare Function DeviceCapabilities Lib "winspool.drv" _        Alias "DeviceCapabilitiesA" (ByVal lpsDeviceName As String, _         ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _         ByVal lpDevMode As Long) As Long #End If Private Const DEFAULT_VALUES = 0 <<呼び出し元>> lngBinCount = DeviceCapabilities(lpsDeviceName:=strDeviceName, _ lpPort:=strDevicePort, _ iIndex:=DC_BINNAMES, _ lpOutput:=ByVal vbNullString, _ lpDevMode:=DEFAULT_VALUES)           ↑「ByRef 引数の型が一致しません。」

  • アクセスでテキストを開く

    アクセスでパスを指定して、特定のテキストファイルを開く方法を教えていただけますか? いかのモジュールを見つけたのですが、どこに、動かないか… フルパスを入れればよいか分かりません。 どうぞ宜しくお願いします。 *********************************************************************************************** Private Declare Function ShellExecute Lib "SHELL32.DLL" Alias "ShellExecuteA" (ByVal hwnd As Long, _ ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub コマンド0_Click() Dim strFilePath As String Dim lngRet As Long Const SW_SHOWNORMAL = 1 strFilePath = Me.txt_Path 'WinAPIを使って関連付けられたアプリケーションを起動 lngRet = ShellExecute(Application.hWndAccessApp, "OPEN", _ strFilePath, vbNullString, CurDir(), SW_SHOWNORMAL) If lngRet <= 32 Then '返り値が 32 以下の場合はエラー MsgBox "ファイルを開けません!", vbOKOnly + vbExclamation End If End Sub ***********************************************************************************************

専門家に質問してみよう