- 締切済み
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
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- SherlockHolmes2
- ベストアンサー率40% (175/429)
使用出来るCOMポートが発生するまで、GetUseComNoをグルグル回すしか無いと思いますが・・。 それか、COMポートを監視するWindowsの常駐アプリを作って、それをトリガーにそのVBAを起動させるとかですかね・・。 どちらも似たようなものですが。 ※ちなみに「プラグアンドプレイ」って、デバイスが接続されたらそれ用のデバイスを自動で組み込んで使えるようにしますよ。って意味なのはご存知でしょうか。(アプリケーションをキックする為の仕組みではない)
お礼
ありがとうございます。 「デバイスが接続されたらアプリケーションをキックする」という仕組みはないということなのでしょうか。。。 まだ諦めがつかないので、もう少し調べてみます。