全てのプリンター名を取得する方法

このQ&Aのポイント
  • エクセルで全てのプリンターのプリンター名・ドライバー名・ポート名を取得する方法について教えてください。
  • エクセルのVBAコードを使用して、全てのプリンターのプリンター名・ドライバー名・ポート名を取得する方法を教えてください。
  • VBAを使用して、エクセルで全てのプリンターのプリンター名・ドライバー名・ポート名を取得する方法を教えてください。
回答を見る
  • ベストアンサー

全てのプリンター名を取得したい

エクセルで全てのプリンターのプリンター名・ドライバー名・ポート名を取得する コードを実行したいのですが Sub Sample() Dim prtLoop As Printer For Each prtLoop In Application.Printers With prtLoop Debug.Print "Device name: " & .DeviceName Debug.Print "Driver name: " & .DriverName Debug.Print "Port: " & .Port End With Next prtLoop End Sub これをそのまま貼り付けて実行しようとすると、 「prtLoop As Printer」が、ユーザー定義型は定義されていません。 になります。 何に参照設定すればいいのかわからないので、 とりあえず Dim prtLoop As Object にしたのですが、 今度は For Each prtLoop In Application.Printers で 実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 になります。 どうすればいいか教えてください。

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

  • ベストアンサー
回答No.2

AccessならPrinterオブジェクトが使えますが、Excelにはありません。 参考にされたVBAはAccessのでは? Accessがインストールされているなら Sub Accで Dim Acc As Object Set Acc= Createobject("Access.application") Debug.print Acc.Printers.count,Acc.printers(1).devicename set Acc=nothing end sub のような感じで出来るかと思いますが、Accessが無い場合にはWMIで Sub WMIで() Dim strComputer As String Dim objWMIService As Object Dim colPrinters As Object Dim objPrinter As Object Dim objProperty As Object Dim j As Integer On Error Resume Next strComputer = "." '自身のPC Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colPrinters = objWMIService.ExecQuery _ ("Select drivername,portname from Win32_Printer") '質問用 'Set colPrinters = objWMIService.ExecQuery _ ("Select * from Win32_Printer") '参考用、上と切り替えてみて For Each objPrinter In colPrinters Debug.Print objPrinter.deviceid j = j + 1 For Each objProperty In objPrinter.properties_ Debug.Print , objProperty.Name, objProperty.Value j = j + 1 Cells(j, 1) = objProperty.Name Cells(j, 2) = objProperty.Value Next Next Set colPrinters = Nothing: Set objWMIService = Nothing End Sub ※ "Select drivername,portname from Win32_Printer" で drivername と portname だけをSelect してるのですが シートにはDeviceNameも乗っかってきます。 WMIの仕様なのかは不明です。 「主キー」に相当するのが、DeviceName かも? 環境(OS/Excelのバージョン)によっては動かないかもです。

その他の回答 (1)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

これはVBAではなく、VBのコードでは? VBAにはPrinterオブジェクトはないので無理だと思います。 下記に、レジストリから取得する方法があります。 http://blogs.yahoo.co.jp/bardiel_of_may/40864687.html For i = 0 To ctr - 1 sTemp1 = RegRead_API(HKEY_CURRENT_USER, SUB_ROOT, sPrinterList(i)) sTemp1 = Replace(sTemp1, "winspool,", "") Debug.Print sPrinterList(i) & " on " & sTemp1 ' sTemp2 = sTemp2 & sPrinterList(i) & " on " & sTemp1 & "," Next と改造すると、イミディウェイトウィンドウに、 Microsoft XPS Document Writer on Ne00: といった形で取得出来ます。 Windwow7Home-64bit/xl2010-32bitで動作しました。 ご参考まで。

関連するQ&A

  • ブック内のシート名を右から取得したい

    Sub Sample() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub このコードを実行すると、左からシート名をひとつずつ取得しますが 右から取得して書き出すにはどうすればいいでしょうか?

  • 全てのサブフォーム名を取得したい

    オフィス2007です。 Sub test() Dim obj As AccessObject For Each obj In CurrentProject.AllForms Debug.Print obj.Name Next End Sub --------------------------------- 上記のコードでデータベースのすべてのフォーム名は取得できますが フォーム1に乗っかっている複数のサブフォームを取得するにはどうすればいいのでしょうか? サブフォームに独自の名前を付けて、IFステートメントを使うしかないですか?

  • ブックのすべてのシート名を取得するコード

    何が間違いなんでしょうか? エクセル2003です。 ブックのすべてのシート名を取得するコードを考えてるのですが なぜか一番左のシート名しか取得できません。 コードは↓です。 ----------------------------------- Sub test01() Dim x As Workbook For Each x In Workbooks Debug.Print ActiveSheet.Name Next End Sub ----------------------------------- できないので「Workbooks」の部分を「ThisWorkbook」に変えてみたところ 実行時エラーになってしまいました。 ご教授よろしくお願いします。

  • 一回のループで次のオブジェクトの値も同時に取得する

    一回のループで次のオブジェクトの値も同時に取得するにはどのようなコードを書けばよいですか? 例えば、 ブックにシートが Sheet1 Sheet2 Sheet3 あり、 Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name Next End Sub のように、全てのシート名を取得する場合、 Sheet1とSheet2を1回のループで同時に取得する方法はありますか? Sub Sample1() Dim s As Worksheet For Each s In Worksheets Debug.Print s.Name   Debug.Print s+1.Name Next End Sub みたいな方法があるのか知りたいです。 よろしくお願いします。

  • フォーム上の全てのコントロールを取得したい

    フォーム上の全てのコントロールを取得したいです。 (サブフォームも含め) 自分なりにVBAで考えてみたのがこれです。 Sub test() Dim 数 As Long For Each 数 In Form_フォーム1.Controls.Count ’Debug.Print ? End If Next End Sub でもこれだけでもデバックしてみると 「コンハ゜イルエラー for Eachは、コレクション オブジェクトまたは配列でのみ繰り返しを実行します。」 となります。 答えを教えてください! よろしくお願いします。 (アクセス2003です)

  • どちらを使った方がいいでしょうか?

    Sub test1() Dim ws As Worksheet For Each ws In Worksheets Debug.Print ws.Name Next End Sub Sub test2() Dim ws As Variant For Each ws In Worksheets Debug.Print ws.Name Next End Sub どちらも問題なく実行されますが、 VBA的にどちらを使った方がいいでしょうか?

  • VBA 一つのフォルダの中のフォルダ名とファイル名

    一つのフォルダの中のフォルダ名とファイル名を取得したい場合は ************************************** Sub test() Dim MyFileName As String Dim MyFolderName As String Dim myFSO As Object Dim MyFolder As Scripting.Folder MyFolderName = "C:\" 'フォルダを取得 MyFileName = Dir(MyFolderName & "*.*") Do While MyFileName <> "" Debug.Print MyFileName MyFileName = Dir() Loop 'ファイルを取得 Set myFSO = CreateObject("Scripting.FileSystemObject") With myFSO With .GetFolder(MyFolderName) For Each MyFolder In .SubFolders Debug.Print MyFolder.Name Next End With End With Set myFSO = Nothing End Sub ************************************** の様に ファイル名・フォルダ名をそれぞれループして取得しないとダメでしょうか? もうちょっとスマートなコードはありますか?

  • Referencesの参照設定

    http://www.tsware.jp/tips/tips_565.htm を参考に、 VBAで参照設定されているライブラリの一覧を取得したいのですが、 Sub t() Dim Ref As Reference For Each Ref In References With Ref Debug.Print .Name Debug.Print .FullPath Debug.Print .GUID Debug.Print .Major Debug.Print .Minor Debug.Print .IsBroken End With Next Ref End Sub を実行すると、 Ref As Reference の部分で、コンパイルエラー(ユーザー定義型は定義されていません) になります。 多分、Referencesの参照設定をしないと、このコードは使えないからだと思うのですが、 参照設定にどこにチェックをすればいいでしょうか?

  • 現在開いてるIEのタイトルを取得するには?

    Sub test() Dim shl As Object Dim wnd As Object Set shl = CreateObject("Shell.Application") For Each wnd In shl.Windows() Debug.Print wnd.LocationURL Next Set shl = Nothing End Sub ----------------------------------------- これを実行するとIEのURLは取得できますが 画像のようにタイトル部分の文字列を取得したいです。 LocationURLをLocationnameに変えたらエラーになりました。 ご教授よろしくお願いします。

  • LocationNameを取得するとアウトルックが

    エクセルvba2010です。よろしくお願いします。 Sub Sample() Dim ie As Object For Each ie In CreateObject("Shell.Application").Windows() Debug.Print ie.LocationName Next End Sub このコードで、現在開いているURL名を取得すると、 アウトルックを立ち上げてると outlook:%26%2321463・・・ と言うのが取得されるのですが、これは何のパスでしょうか? メールは立ち上げていません。

専門家に質問してみよう