Excel VBAからWindowsのWinsock APIを直接呼び出し、ローカルPC内でUDP通信を試すための学習用サンプルです。
追加のActiveXコントロールや外部ライブラリは使用しません。VBA標準モジュール1ファイルで、UDPの受信側と送信側の基本的な処理順序を確認できます。
Important
UDPは接続確認や再送を行わないため、送信成功が相手の受信成功を保証しません。このリポジトリは学習用です。認証や暗号化はなく、インターネットへ公開する用途には適していません。
WSAStartup/WSACleanupによるWinsockの初期化と終了socket/bind/recvfromによるUDP受信socket/sendtoによるUDP送信closesocketによるソケットの解放PtrSafeとLongPtrを使った32ビット/64ビットOffice対応- 別のExcelプロセスを受信側として起動する方法
- Windows
- Excel 2010以降(VBA 7)
- 32ビット版または64ビット版Office
- マクロを保存できるExcelブック(
.xlsmまたは.xlsb)
macOS版ExcelではWindows DLLを呼び出せないため動作しません。
| ファイル | 内容 |
|---|---|
VBA_WinsockAPI_UDP_Sample.bas |
UDP受信、UDP送信、動作確認用マクロを含む標準モジュール |
SECURITY.md |
脆弱性情報を非公開で連絡する場合の案内 |
- マクロ有効ブックを作成し、一度保存します。
Alt+F11でVisual Basic Editorを開きます。- メニューの「ファイル」→「ファイルのインポート」を選びます。
VBA_WinsockAPI_UDP_Sample.basを選択します。- 「デバッグ」→「VBAProjectのコンパイル」を実行します。
MainForMultiProcessを実行します。
同じブックが読み取り専用で別のExcelプロセスに開かれ、1秒後にUDPRecvFromが開始します。既定では127.0.0.1:60051でデータグラムを待ちます。
最初のExcelへ戻り、次のいずれかを実行します。
| マクロ | 送信内容 | 受信側の動作 |
|---|---|---|
testHELLO |
HELLO |
送信元のIPアドレスとポート番号を表示 |
testElse |
else message |
受信文字列を表示 |
testQUIT |
QUIT |
受信ループを終了 |
testQUITは受信ループだけを終了します。別プロセスのExcel自体は自動終了しないため、内容を確認してから手動で閉じてください。
WSAStartup → socket → bind → recvfrom → closesocket → WSACleanup
WSAStartup → socket → sendto → closesocket → WSACleanup
モジュール先頭付近の次の定数を変更します。
Private Const DEFAULT_SERVER_IP As String = "127.0.0.1"
Private Const DEFAULT_SERVER_PORT As Long = 60051初めて試す場合は、外部から接続できないループバックアドレス127.0.0.1のまま使用してください。
| 項目 | UDP | TCP |
|---|---|---|
| 接続処理 | なし | connect / acceptあり |
| 到達・順序の保証 | なし | あり |
| メッセージの境界 | データグラム単位 | バイトストリーム |
| このサンプルの送受信API | sendto / recvfrom |
send / recv |
TCP版はVBA_WinsockAPI_TCP_Sampleにあります。
- IPv4のみ対応
- 受信バッファは2,048文字の固定長
- 文字列はASCII範囲での利用を想定
recvfromは同期・ブロッキング処理- 通信の認証・暗号化・再送制御はなし
DoEventsはブロッキング中のrecvfromを非同期化するものではありません。このサンプルでは、Excelの操作用プロセスと受信用プロセスを分けて影響を限定しています。
受信側のExcelプロセスが起動していること、送信側と受信側でIPアドレスとポート番号が一致していることを確認してください。UDPでは受信側が起動する前に送ったデータは保持されません。
同じポートを使う受信処理が既に起動している可能性があります。別プロセスのExcelを閉じるか、DEFAULT_SERVER_PORTを未使用のポートへ変更してください。
最新版の.basを取り込み直し、「デバッグ」→「VBAProjectのコンパイル」を実行してください。ソケットはWindowsのハンドルであるため、変数とAPIの戻り値にLongPtrを使用しています。
- 64-bit Visual Basic for Applications overview
- socket function
- sendto function
- recvfrom function
- closesocket function
This is an educational Excel VBA sample for direct UDP communication through the Windows Winsock API.