Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

Excel VBA Winsock TCP Sample

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によるサーバー・クライアントソケットの解放
  • PtrSafeLongPtrを使った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クライアント、動作確認用マクロを含む標準モジュール

使い方

1. 標準モジュールを取り込む

  1. マクロ有効ブックを作成し、一度保存します。
  2. Alt + F11でVisual Basic Editorを開きます。
  3. メニューの「ファイル」→「ファイルのインポート」を選びます。
  4. VBA_WinsockAPI_TCP_Sample.basを選択します。
  5. 「デバッグ」→「VBAProjectのコンパイル」を実行します。

2. サーバーを起動する

MainForMultiProcessを実行します。

同じブックが読み取り専用で別のExcelプロセスに開かれ、1秒後にTCPRecvが開始します。既定では127.0.0.1:60051で接続を待ちます。

3. クライアントから送信する

最初の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範囲での利用を想定
  • acceptrecvは同期・ブロッキング処理
  • 同時に複数クライアントを処理する機能はなし
  • 通信の認証・暗号化・完全性検証はなし

DoEventsはブロッキング中のacceptrecvを非同期化するものではありません。このサンプルでは、Excelの操作用プロセスと受信用プロセスを分けて影響を限定しています。

トラブルシューティング

Address already in useに相当するエラーになる

同じポートを使うサーバーが既に起動している可能性があります。別プロセスのExcelを閉じるか、DEFAULT_SERVER_PORTを未使用のポートへ変更してください。

Windows Defender Firewallの確認が表示される

初回実行時に表示されることがあります。このサンプルをローカルPC内だけで試す場合は、接続先を127.0.0.1から変更しないでください。

64ビットOfficeでAPI宣言エラーになる

最新版の.basを取り込み直し、「デバッグ」→「VBAProjectのコンパイル」を実行してください。ソケットはWindowsのハンドルであるため、変数とAPIの戻り値にLongPtrを使用しています。

参考資料

Repository scope

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.

About

VBA_WinsockAPI_TCP_Sample

Resources

Stars

4 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages