• ベストアンサー

エクセル VBA でのCOMポート認識

エクセルのVBAを使用してあるアプリを作成しています。そのアプリはシリアルポートを使用してある機器と接続する事で実現できます。 そこで質問ですが、当該PCが認識しているCOMポートをVBAのSELECT BOXに表示したいのですがどうやれば(どのような関数?)を使用して実装COMポートを認識するのでしょうか? もちろん、USB<--->シリアルケーブルを使用した場合もCOMポートだと認識しなければなりません。 よろしくお願いいたします。

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

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

こんにちは。 Windowsのプログラム(VBA含む)から、COMポートを扱う場合は、WindowsAPI を使用すれば可能 だと思います。 COMポートの実装チェックには、WindowsAPI の「CreateFile」関数でCOMポートのオープンを実行 して、その関数の戻り値がエラーかどうかを見れば判断できると思います。 ただし、COMポートが実装されていてもエラーになるケース(既に使用中、使用不可に設定されて いるなど)がありますので、その場合はエラーコードを取得してその値で「実装/非実装」を判断しな いといけないと思います。 以下に、VBA から WindowsAPI (COMポート制御関連を含む)を利用するに当たって、参考になり そうなサイトを上げてみました。宜しければ覗いてみて下さい。 ■参考サイト 注)リンク切れの際は御容赦下さい。 1)VBAでWindowsAPIを使用してシリアル通信を行う方法 ◎WindowsAPI講座 http://www.serpress.co.jp/winapi/ ・このページよりリンクされている下記項目「シリアル通信(1)~(4)」のページでVBAから通信関連の  APIを使用する方法が書かれています。  NO.12 シリアル通信(1) ←必要なWindowAPI定義の説明  NO.13 シリアル通信(2) ←シリアルポートのオープンとクローズを説明  NO.14 シリアル通信(3) ←シリアルポートの通信プロトコル、送受信バッファ、タイムアウトの設定  NO.15 シリアル通信(4) ←シリアルポートの送受信方法を説明 ・今回の場合は、    シリアルポートのオープン → 存在有無チェック → シリアルポートのクローズ  までを行えば良いようなので、シリアル通信(1)~(2) までを参照すれば良いと思います。 2)CreateFile関数でCOM10以上のCOMポートを使用する際の注意点 ◎CreateFile関数(Win32API)でCOM10以上を使う場合の注意点 http://www.aofactory.net/log/eid328.html ・ここで、API関数「CreateFile」で指定するCOMポート名(COM1、COM2など)に「COM10」以上を使用  する場合の問題点および対策が書かれています。 ・指定するCOMポートのデバイス名の頭に "\\.\" を付ければ良いようです。    VBAでの指定例: "COM10" の場合は、 "\\.\COM10" とする。 3)WindowsAPI利用でCOMポートの存在有無をチェックする方法 ◎COMポートが存在するかどうかを調べるには? - OKWaveの過去ログより http://okwave.jp/qa4033242.html ・ここで、API関数「CreateFile」が失敗した際に、同じくAPI関数「GetLastError」でエラーコードを見て  COMポートの存在有無を調べる旨が書かれています。 注)ただし、VBAでは「GetLastError」を呼んでもエラーコードが得られない可能性があるので、下記4)  の方法を採った方が良いようです。 4)VBA から Windows API を利用する方法など ◎Office VBA と Windows API - Microsoft MSDN より http://msdn.microsoft.com/ja-jp/library/cc326057.aspx ・このページの「エラー情報の取得」の説明で、VBAからWindowsAPIを呼出した際のエラーコードの取得  方法が書かれています。 ・VBAからWindowsAPIのDLLを呼び出した際のエラー情報は、「GetLastError関数」では取得できない  可能性があるので、VBAの場合は「Errオブジェクト」の「LastDLLErrorプロパティ」でエラーコードを取得  すれば良いようです。 ・今回の場合は、COMポートオープン時のエラーコード取得に、この方法が利用できると思います。

maxaxxx
質問者

お礼

返事が遅れて申し訳ありませんでした。 無事に解決しました。 ありがとう御座いました。

その他の回答 (1)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

Win32_SerialPort 等々 http://www.anchorsystems.jp/anchor/ashp/netmon/samples/wmi_hard.html#Win32_SerialPort.htm VBSですがVBAで使うのに参考にならないかな?と思い提示しました。 が詳しくはないので的はずれならスル~して下さい。

maxaxxx
質問者

お礼

返事が遅れて申し訳ありませんでした。 無事に解決しました。 ありがとう御座いました。

関連するQ&A