
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 …
・このページの「エラー情報の取得」の説明で、VBAからWindowsAPIを呼出した際のエラーコードの取得
方法が書かれています。
・VBAからWindowsAPIのDLLを呼び出した際のエラー情報は、「GetLastError関数」では取得できない
可能性があるので、VBAの場合は「Errオブジェクト」の「LastDLLErrorプロパティ」でエラーコードを取得
すれば良いようです。
・今回の場合は、COMポートオープン時のエラーコード取得に、この方法が利用できると思います。
No.1
- 回答日時:
Win32_SerialPort 等々
http://www.anchorsystems.jp/anchor/ashp/netmon/s …
VBSですがVBAで使うのに参考にならないかな?と思い提示しました。
が詳しくはないので的はずれならスル~して下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
EXCEL VBAで、PnPでCOMポート番号取得
Visual Basic(VBA)
-
VBAを使用して、USBでつないだ機器の制御が出来るでしょうか?
Access(アクセス)
-
COM接続デバイスのポート番号特定方法について
Visual Basic(VBA)
-
-
4
シリアル通信と文字列送信
その他(コンピューター・テクノロジー)
-
5
VBA & easycomm で長時間測定の問題
その他(Microsoft Office)
-
6
シリアル通信時のデータ受信方法
Visual Basic(VBA)
-
7
VBA EasyCommでの送信
Visual Basic(VBA)
-
8
プログラムでUSB機器が接続された事を認識するにはどうしたら良いのでしょうか?
Visual Basic(VBA)
-
9
byte型をstring型として扱うには
Visual Basic(VBA)
-
10
エクセルVBAでのネットワークプリンタのポー名の取得方法は?
Visual Basic(VBA)
-
11
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
12
シリアル通信の方法(VB)
Visual Basic(VBA)
-
13
WriteFile()でのデータ送信ができなくなる
C言語・C++・C#
-
14
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
15
PLCとPCの通信
Visual Basic(VBA)
-
16
VBA バイナリ―から文字列にする方法
Visual Basic(VBA)
-
17
一つのTeratermのマクロで複数のTeratermのウィンドウを立ち上げることはできますか?
サーバー
-
18
UserForm1.Showでエラーになります。
工学
-
19
CreateFile関数でCOMポートが開けない
C言語・C++・C#
-
20
RS232CとTCP/IP通信違いについて
工学
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
Winsockで接続待ちタイムアウト...
-
VB6のwinsockでconnectできない
-
ソケットのrecvの戻り値が0
-
UDPのソケットプログラミング
-
UdpClient 送信元のIPアドレ...
-
ソケットのクローズについて
-
WinSockでの通信プログラムがう...
-
Macターミナルで実行中のプログ...
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
-
家電製品の電力周波数を変える機械
-
パソコンの演算速度について
-
C言語で途中までしか、プログラ...
-
C# シリアル通信でデータ受信...
-
C#でのpngからbmpへの変換について
-
ACCESS側からEXCELの書式を設定...
-
Windows上で、シグナル(SIGTERM...
-
Mac 乗数の入力方法
-
win10で、正確な待ち時間の作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信する時に、相手にどうや...
-
UDP通信におけるbind関数について
-
エクセル VBA でのCOMポート...
-
ソケットのクローズについて
-
ソケットのrecvの戻り値が0
-
VB6のwinsockでconnectできない
-
Socket通信の0バイト受信について
-
recv関数でフリーズしてしまう
-
Winsockで接続待ちタイムアウト...
-
Connectエラーが出てしまう・・...
-
送信したデータの一部が文字化...
-
【ajax】 XMLHttpRequestオブジ...
-
ソケット通信
-
closeされたsocketへの動作につ...
-
wsdlからのサービス化を行い。
-
Cにおける通信プログラミングの...
-
UdpClient 送信元のIPアドレ...
-
非ブロッキングソケットのrecv...
-
ソケットを用いた1対多通信につ...
おすすめ情報