こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

EXCEL VBAで、PnPでCOMポート番号取得

EXCELで、USB-RS232C変換アダプタをPCに繋げたとき、使用しているCOMポート番号を取得するマクロを作ろうとしています。
下記のコードのGetUseComNameプロシージャを実行してポート番号を取得できるようになりました。
わざわざGetUseComNameプロシージャを実行しなくても、USB-RS232C変換アダプタをPCに接続されたのをプラグアンドプレイで検知して、
COMポート番号を取得する仕様に改良したいのですが、どうすれば良いでしょうか。

私のパソコンの環境は(windows XP 2002 SP3 office excel2003 sp3)です。

'--------------------
Option Explicit

'--------------------
Sub GetUseComName()

Dim a, b, port_no As String
  
  Range("a1").Select
  Selection.Clear
  
  '通信ポート名を取得
  a = GetUseComNo()
 
  '通信ポート名の文字列からCOMポート番号(書式「1,2,・・・」の形で)を取り出す。
  Do While InStr(a, "(COM") <> 0
    a = Mid(a, InStr(a, "(COM") + 4)
    port_no = port_no + Left(a, 1)
    If InStr(a, "(COM") <> 0 Then
      port_no = port_no & ","
    End If
  Loop
  
  'USB-232C変換アダプタが接続されていれば、セルa1に通信ポート番号を表示する。
  If port_no = "" Then
    MsgBox ("使用できるCOM Portがありません。")
    Exit Sub
  ElseIf InStr(port_no, ",") <> 0 Then
    Selection = port_no
  End If
  
End Sub

'---------------------
Function GetUseComNo() As String

  Dim Serial    As Object
  Dim SerialSet   As Object
  Dim objWMIService As Object
  Dim strComputer  As String
  Dim intCnt    As Integer  '要素数
  Dim strComName  As String   '取得したデバイス名

  strComputer = "."
  'WMIを呼び出す
  Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")

  'PnPで登録されているもの(デバイスマネージャで見えるもの)から
  'シリアルポートのクラスでかつ名前に「(COMxx)」と付いているものを抽出
  Set SerialSet = objWMIService.ExecQuery("Select * from Win32_PNPEntity Where " & _
          "(ClassGuid = '{4D36E978-E325-11CE-BFC1-08002BE10318}') and " & _
          "(Name like '%(COM%)')")

  '全ポートの数(取得できた項目数)
  intCnt = SerialSet.Count

  '情報の取得
  strComName = ""
  For Each Serial In SerialSet
    'デバイス名を取得 「"通信ポート (COM1)"」
    If strComName <> "" Then
      strComName = strComName & vbCrLf
    End If
    strComName = strComName & Serial.Name
  Next

  '戻り値セット
  GetUseComNo = strComName

End Function

投稿日時 - 2012-10-25 18:17:23

QNo.7765847

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

使用出来るCOMポートが発生するまで、GetUseComNoをグルグル回すしか無いと思いますが・・。

それか、COMポートを監視するWindowsの常駐アプリを作って、それをトリガーにそのVBAを起動させるとかですかね・・。

どちらも似たようなものですが。

※ちなみに「プラグアンドプレイ」って、デバイスが接続されたらそれ用のデバイスを自動で組み込んで使えるようにしますよ。って意味なのはご存知でしょうか。(アプリケーションをキックする為の仕組みではない)

参考URL:http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A2%E3%83%B3%E3%83%89%E3%83%97%E3%83%AC%E3%82%A4

投稿日時 - 2012-10-25 19:17:53

お礼

ありがとうございます。

「デバイスが接続されたらアプリケーションをキックする」という仕組みはないということなのでしょうか。。。

まだ諦めがつかないので、もう少し調べてみます。

投稿日時 - 2012-10-29 13:29:54

あなたにオススメの質問