NonSoft

VBAでTCP/IP(サーバ)の送信/受信


 ち〜な〜み〜に〜

VBA(EXCELやACCESS)でTCP/IP(サーバ)の送受信をするサンプルをご紹介します。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
(注意)このサンプルはVB6の開発環境が無いと実行出来ません。

EXCEL通信テスト(RS232C/TCPIP/UDPIP)でエクセルVBAのサンプルをダウンロード頂けます。
EXCEL通信テスト(RS232C/TCPIP/UDPIP)は自作OCX経由でMSWINSCK.OCXを使用するため
VB6の開発環境は必要ありません。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

とりあえず、下の電文送受信サンプルソースを見てください。

通信(RS232C TCP/IP UDP/IP)関係のその他のツールやサンプルソースはこちらです。
通信ツール&サンプル(RS232C TCP/IP UDP/IP)


★VBAで電文の送受信をするサンプルソース
Option Explicit
'****************************************************************************
' 機能名    : EXCEL通信テスト(TCP/IPサーバ)
' 機能説明  : EXCELを使用したTCP/IPの通信テストツール
' 著作権    : Copyright(C) 2010 のん All rights reserved
' 動作環境  : VB6の開発環境(特にMSWINSCK.OCX)
'****************************************************************************

' MSWINSCK.OCXを参照設定しています
Private WithEvents Winsock1 As MSWinsockLib.Winsock

' 受信データ表示行番号
Private InputRow As Long

' ソケット(TCPIP)接続およびクライアントからの接続待ち
Private Sub Btn_Open_Click()
    ' ソケット(TCPIP)接続チェック
    If Winsock1 Is Nothing = False Then
        MsgBox "既にソケット(TCPIP)が接続されています"
        Exit Sub
    End If
    
    ' 受信データ表示カラムをクリア
    Sheet1.Range("B15:B999") = ""

    ' 受信データ表示行番号初期化
    InputRow = 15
    
    ' ソケット(TCPIP)接続情報取得
    Dim lo As String: lo = Sheet1.Cells(5, 4)
    
    ' ソケット(TCPIP)接続およびクライアントからの接続待ち
    Set Winsock1 = New MSWinsockLib.Winsock
    Winsock1.Close
    Winsock1.LocalPort = lo
    Winsock1.Listen
End Sub

' ソケット(TCPIP)切断
Private Sub Btn_Close_Click()
    ' ソケット(TCPIP)接続チェック
    If Winsock1 Is Nothing Then
        MsgBox "ソケット(TCPIP)が接続されていません"
        Exit Sub
    End If
    
    ' ソケット(TCPIP)切断
    Winsock1.Close
    Set Winsock1 = Nothing
End Sub

' クライアントからの接続
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    ' 複数クライアントとの接続を行なわない仕様
    Winsock1.Close
    ' クライアントからの接続を許可
    Winsock1.Accept requestID
End Sub

' クライアントからの切断
Private Sub Winsock1_Close()
    ' ソケット(TCPIP)接続情報取得
    Dim lo As String: lo = Sheet1.Cells(5, 4)
    
    ' ソケット(TCPIP)接続およびクライアントからの接続待ち
    Winsock1.Close
    Winsock1.LocalPort = lo
    Winsock1.Listen
End Sub

' ソケット(TCPIP)へデータ送信
Private Sub Btn_Send_Click()
    ' ソケット(TCPIP)接続チェック
    If Winsock1 Is Nothing Then
        MsgBox "ソケット(TCPIP)が接続されていません"
        Exit Sub
    End If
    If Winsock1.State <> sckConnected Then
        MsgBox "ソケット(TCPIP)が接続されていません"
        Exit Sub
    End If
    
    ' 選択したセルのデータを送信データとする
    Dim sdat As String
    If ActiveCell.Row >= 4 And ActiveCell.Column >= 2 And _
       ActiveCell.Row <= 13 And ActiveCell.Column <= 4 Then
        sdat = Sheet1.Cells(ActiveCell.Row, ActiveCell.Column)
    End If
    
    If sdat <> "" Then
        If Sheet1.Chk_SHex.Value = True Then
            ' 送信データをHEXコードから文字列に変換--ここから--
            On Error Resume Next
            Dim i As Long
            ReDim shex(Int((Len(sdat) + 1) / 2) - 1) As Byte
            For i = 0 To Len(sdat) - 1 Step 2
                shex(i / 2) = "&H" & Mid$(sdat, i + 1, 2)
            Next i
            On Error GoTo 0
            ' 送信データをHEXコードから文字列に変換--ここまで--
            
            ' ソケット(TCPIP)にデータ送信
            Winsock1.SendData shex
        Else
            ' ソケット(TCPIP)にデータ送信
            Winsock1.SendData sdat
        End If
    Else
        MsgBox "送信データ(セル)を選択してください。"
    End If
End Sub

' ソケット(TCPIP)からデータ受信
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    ' ソケット(TCPIP)接続チェック
    If Winsock1 Is Nothing Then
        'MsgBox "ソケット(TCPIP)が接続されていません"
        Exit Sub
    End If
    
    Dim rdat As String: rdat = ""
    If Sheet1.Chk_RHex.Value = True Then
        ' ソケット(TCPIP)からデータ受信
        Dim rhex() As Byte
        Winsock1.GetData rhex
        
        ' 受信データをHEXコードに変換--ここから----------------
        Dim i As Long
        For i = 0 To UBound(rhex)
            Dim str As String
            str = "00" & Hex(rhex(i))
            rdat = rdat & Right$(str, 2)
        Next i
        ' 受信データをHEXコードに変換--ここまで----------------
    Else
        ' ソケット(TCPIP)からデータ受信
        Winsock1.GetData rdat
    End If

    ' 受信データ表示セルに受信データを表示
    rdat = Replace$(rdat, Chr(0), "")
    Sheet1.Cells(InputRow, 2) = "" & rdat
    InputRow = InputRow + 1
End Sub

' 送信データ選択カラム変更
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Sheet1.Unprotect
    Sheet1.Range("B4:C13").Font.ColorIndex = 0
    If Target.Cells.Row >= 4 And Target.Cells.Row <= 13 And _
       Target.Cells.Column >= 2 And Target.Cells.Column <= 3 Then
        Target.Font.ColorIndex = 3
    End If
    Sheet1.Protect
End Sub