Excel VBAからWindowsのWinsock APIを直接呼び出し、ローカルPC内でTCP通信を試すための学習用サンプルです。
追加のActiveXコントロールや外部ライブラリは使用しません。VBA標準モジュール1ファイルで、TCPサーバーとTCPクライアントの基本的な処理順序を確認できます。
Important
このリポジトリは、Winsock APIの呼び出し方を学ぶための最小サンプルです。認証、暗号化、タイムアウト、再送制御、複数クライアントの並行処理は実装していません。インターネットへ公開するサーバーには使用しないでください。
WSAStartup/WSACleanupによるWinsockの初期化と終了socket/bind/listen/accept/recvによるTCP受信socket/connect/sendによるTCP送信closesocketによるサーバー・クライアントソケットの解放PtrSafeとLongPtrを使った32ビット/64ビットOffice対応- 別のExcelプロセスをサーバーとして起動する方法
- Windows
- Excel 2010以降(VBA 7)
- 32ビット版または64ビット版Office
- マクロを保存できるExcelブック(
.xlsmまたは.xlsb)
macOS版ExcelではWindows DLLを呼び出せないため動作しません。
| ファイル | 内容 |
|---|---|
VBA_WinsockAPI_TCP_Sample.bas |
TCPサーバー、TCPクライアント、動作確認用マクロを含む標準モジュール |
- マクロ有効ブックを作成し、一度保存します。
Alt+F11でVisual Basic Editorを開きます。- メニューの「ファイル」→「ファイルのインポート」を選びます。
VBA_WinsockAPI_TCP_Sample.basを選択します。- 「デバッグ」→「VBAProjectのコンパイル」を実行します。
MainForMultiProcessを実行します。
同じブックが読み取り専用で別のExcelプロセスに開かれ、1秒後にTCPRecvが開始します。既定では127.0.0.1:60051で接続を待ちます。
最初のExcelへ戻り、次のいずれかを実行します。
| マクロ | 送信内容 | サーバー側の動作 |
|---|---|---|
testHELLO |
HELLO |
接続元のIPアドレスとポート番号を表示 |
testElse |
else message |
受信文字列を表示 |
testQUIT |
QUIT |
受信ループを終了 |
testQUITは受信ループだけを終了します。別プロセスのExcel自体は自動終了しないため、内容を確認してから手動で閉じてください。
WSAStartup → socket → bind → listen → accept → recv → closesocket → WSACleanup
WSAStartup → socket → connect → send → 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のまま使用してください。
- IPv4のみ対応
- 1回の
recvで受け取った内容を1つのメッセージとして扱う簡易実装 - 文字列はASCII範囲での利用を想定
acceptとrecvは同期・ブロッキング処理- 同時に複数クライアントを処理する機能はなし
- 通信の認証・暗号化・完全性検証はなし
DoEventsはブロッキング中のacceptやrecvを非同期化するものではありません。このサンプルでは、Excelの操作用プロセスと受信用プロセスを分けて影響を限定しています。
同じポートを使うサーバーが既に起動している可能性があります。別プロセスのExcelを閉じるか、DEFAULT_SERVER_PORTを未使用のポートへ変更してください。
初回実行時に表示されることがあります。このサンプルをローカルPC内だけで試す場合は、接続先を127.0.0.1から変更しないでください。
最新版の.basを取り込み直し、「デバッグ」→「VBAProjectのコンパイル」を実行してください。ソケットはWindowsのハンドルであるため、変数とAPIの戻り値にLongPtrを使用しています。
- 64-bit Visual Basic for Applications overview
- socket function
- accept function
- send function
- recv function
- closesocket function
This is an educational Excel VBA sample for direct TCP communication through the Windows Winsock API. It is intentionally kept separate from HTTP, WebSocket, and LLM API examples.