NonSoft

VBAでRS232C(シリアルCOMポート)の送信/受信


 ち〜な〜み〜に〜

VBA(EXCELやACCESS)でRS232C(シリアルCOMポート)の送受信をするサンプルをご紹介します。

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

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

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

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


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

' MSCOMM32.OCXを参照設定しています
Private WithEvents MSComm1 As MSCommLib.MSComm

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

' COMポートオープン
Private Sub Btn_Open_Click()
    ' COMポートオープンチェック
    If MSComm1 Is Nothing = False Then
        If MSComm1.PortOpen = True Then
            MsgBox "既にCOMポートがオープンされています"
            Exit Sub
        End If
    End If
    
    ' 受信データ表示カラムをクリア
    Sheet1.Range("B15:B999") = ""

    ' 受信データ表示行番号初期化
    InputRow = 15
    
    ' COMポートオープン情報取得
    Dim prt As String: prt = Sheet1.Cells(5, 4)
    Dim spd As String: spd = Sheet1.Cells(7, 4)
    Dim pri As String: pri = Sheet1.Cells(9, 4)
    Dim bit As String: bit = Sheet1.Cells(11, 4)
    Dim stp As String: stp = Sheet1.Cells(13, 4)
    
    ' COMポートのオープン
    Set MSComm1 = New MSCommLib.MSComm
    MSComm1.Settings = spd & "," & pri & "," & bit & "," & stp
    MSComm1.CommPort = prt
    MSComm1.PortOpen = True
    
    ' DTR、RTSの初期設定
    MSComm1.DTREnable = Chk_DTR.Value
    MSComm1.RTSEnable = Chk_RTS.Value

    ' CTS、DSRの初期確認
    Chk_CTS.Value = MSComm1.CTSHolding
    Chk_DSR.Value = MSComm1.DSRHolding

    ' COMポート受信イベント作成
    MSComm1.RThreshold = 1
End Sub

' COMポートクローズ
Private Sub Btn_Close_Click()
    ' COMポートオープンチェック
    If MSComm1 Is Nothing Then
        MsgBox "COMポートがオープンされていません"
        Exit Sub
    ElseIf MSComm1.PortOpen = False Then
        MsgBox "COMポートがオープンされていません"
        Exit Sub
    End If
    
    ' COMポートのクローズ
    MSComm1.PortOpen = False
    Set MSComm1 = Nothing
End Sub

' COMポートへデータ送信
Private Sub Btn_Send_Click()
    ' COMポートオープンチェック
    If MSComm1 Is Nothing Then
        MsgBox "COMポートがオープンされていません"
        Exit Sub
    ElseIf MSComm1.PortOpen = False Then
        MsgBox "COMポートがオープンされていません"
        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コードから文字列に変換--ここまで--
            
            ' COMポートにデータ送信
            MSComm1.Output = shex
        Else
            ' COMポートにデータ送信
            MSComm1.Output = sdat
        End If
    Else
        MsgBox "送信データ(セル)を選択してください。"
    End If
End Sub

' COMポートからデータ受信
Private Sub MSComm1_OnComm()
    ' COMポートオープンチェック
    If MSComm1 Is Nothing Then
        'MsgBox "COMポートがオープンされていません"
        Exit Sub
    ElseIf MSComm1.PortOpen = False Then
        'MsgBox "COMポートがオープンされていません"
        Exit Sub
    End If
    
    ' COMポートからデータ受信
    If MSComm1.CommEvent = comEvReceive Then
        Dim rdat As String: rdat = ""
        If Sheet1.Chk_RHex.Value = True Then
            ' COMポートからデータ受信
            Dim rhex() As Byte
            MSComm1.InputMode = comInputModeBinary
            rhex = MSComm1.Input
            
            ' 受信データを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
            ' COMポートからデータ受信
            MSComm1.InputMode = comInputModeText
            rdat = MSComm1.Input
        End If
        
        ' 受信データ表示セルに受信データを表示
        rdat = Replace$(rdat, Chr(0), "")
        Sheet1.Cells(InputRow, 2) = "" & rdat
        InputRow = InputRow + 1
    End If
    Chk_CTS.Value = MSComm1.CTSHolding
    Chk_DSR.Value = MSComm1.DSRHolding
End Sub

' COMポートへDTR設定
Private Sub Chk_DTR_Click()
    ' COMポートオープンチェック
    If MSComm1 Is Nothing Then
        Exit Sub
    ElseIf MSComm1.PortOpen = False Then
        Exit Sub
    End If
    MSComm1.DTREnable = Chk_DTR.Value
End Sub

' COMポートへRTS設定
Private Sub Chk_RTS_Click()
    ' COMポートオープンチェック
    If MSComm1 Is Nothing Then
        Exit Sub
    ElseIf MSComm1.PortOpen = False Then
        Exit Sub
    End If
    MSComm1.RTSEnable = Chk_RTS.Value
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