2011年11月14日月曜日

VBA プリンタ接続があったら? なかったら?

会社で資産管理台帳をAccessで簡単に作ったのですが、この程本運用にするとのお達しがあり、運用する前の最終機能の改善を別の方が行っています。

 

WEBデザインをメインになさっていた方なので、自分の作ったフォームビューがデザイン一新されており、びっくりしたのと同時に、「餅は餅屋」なんだなぁと感じつつ、自分のデザインセンスのなさに悲しくなりました。

 

それはさておき、資産管理ということで、資産管理シールなるものを張りたいと庶務の方からリクエストがあったので、テプラのPCリンク機能を使って流し込み印刷機能を強化していたときの話。

 

「テプラ印刷ボタンを作ったはいいが、テプラが接続されていないときに印刷ボタンが非表示か、グレーアウトさせたい。VBAでプリンタがオンラインかオフラインかを知る方法はないか?」

 

暇だったので調べてみたところ、ちょっと苦労しましたが、以下の記事を見つけました。

http://hanatyan.sakura.ne.jp/patio/read.cgi?no=258

http://hanatyan.sakura.ne.jp/dotnet/Prt13.htm

   On Error Resume Next
   Dim objWMIService As Object
   Dim colItems      As Object
   Dim objItem       As Object
   Dim strComputer   As String
   Dim strOSType     As String
   Text1.Text = ""
   strComputer = "."
   Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
   Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer", , 48)
   For Each objItem In colItems
      Text1.Text = Text1.Text & "Name: " & objItem.Name & vbCrLf
      If objItem.Default = True Then
         Text1.Text = Text1.Text & "通常使うプリンターです" & vbCrLf
      Else
         Text1.Text = Text1.Text & "通常使うプリンターではありません" & vbCrLf
      End If
      If objItem.WorkOffline = True Then
         Text1.Text = Text1.Text & "オフライン" & vbCrLf
      Else
         Text1.Text = Text1.Text & "準備完了" & vbCrLf
      End If
      Text1.Text = Text1.Text & "場 所 : " & objItem.PortName & vbCrLf
      Text1.Text = Text1.Text & "PrinterStatus: " & objItem.PrinterStatus & vbCrLf
      Text1.Text = Text1.Text & String$(60, "-") & vbCrLf
   Next

非常にエクセレントなプログラムだと思ってしまいましたが、肝は、

objWMIService.ExecQuery("Select * from Win32_Printer", , 48)

としているところで、プリンター情報を引っこ抜いてきているところでしょう。

ここさえ押さえれば、あとは如何様にも料理できますね。

 

私が確認した環境は、XP on Access 2003ですが、きっと他バージョンでも普通に動いてくれるでしょう。



0 件のコメント:

コメントを投稿