Thanks NON!

 

  謝辞:VBAソース・コードの公開を許可していただいたのんさん
   
に感謝いたします
 
 


Access2010にTCP/IPサーバー機能を実装する

2012/11/2/1
【Access2010にTCP/IPサーバー機能を実装する】
 Accessをデータ回収サーバーとして用いる場合など、シリアルポート等(RS232C)の代わりにTCP/IPを通信回路として使いたいことがあります。このような場合の実装方法の一つを例示します(但し、あくまでもTCP/IPテスト用と考えてください)。

 ほぼのんさんのVBAソースを利用させていただきました。TCP/IP以外 にも有用な通信用VBAソースがのんさんのサイトに公開されています。

http://homepage2.nifty.com/nonnon/index.html

 使用したのんさんのオリジナルVBAソース(EXCEL)は以下から(TcpIpSTest2.xlsのソースを改変)。

http://homepage2.nifty.com/nonnon/Download/ExcelComTest/index.html

複数クライアント対応TCP/IPサーバー(TcpIpSTest2.xls)

【環境】
 私が実装した環境は以下の通りです。

 ・Windows7 Pro.(x64)
 ・Accsess2010(x32)

 また、テストに利用したクライアント側のTCP/IP端末ものんさんのテストツールを使いました。

http://www.vector.co.jp/soft/dl/winnt/net/se411272.html

 

【準備】
 のんさんのWindows用クラス・ライブラリ(NONCOMSCK.OCX)とWindowsソケット・ライブラリ(MSWINSCK.OCX)を用います。以下の場所からダウンロードします。

NONCOMSCK.OCX(ExcelComTest.zipに含まれている)

http://www.vector.co.jp/soft/dl/winnt/net/se482252.html

 

MSWINSCK.OCX(SP6)は、VB6ランタイム等に含まれます。下記ベクター等からダウンロードしてください。

http://www.vector.co.jp/soft/win95/util/se063979.html


 Win7(x64)でActiveX(32bit)を実行するためには、「C:\Windows\SysWOW64」にファイルを置かなければなりません。NONCOMSCK.OCXMSWINSCK.OCXをC:\Windows\SysWOW64にコピーします。その後、コマンドラインで以下(T)(U)を実行します。  
※Win7(x32)の場合は保存場所が異なります(お調べください)

(T)OLEコントロールの登録
regsvr32 C:\Windows\SysWOW64\NONCOMSCK.OCX
regsvr32 C:\Windows\SysWOW64\MSWINSCK.OCX

(U)Accessの参照設定
 Access2010にNONCOMSCK.OCXとMSWINSCK.OCXを参照設定します。VBE(VBエディタ)を表示した後、【ツール】⇒【参照設定】⇒【参照】(ファイルの種類*.OCX)で上記二つを参照設定します 。
 

【フォーム・イメージ】
 フォームはこんな感じです。サーバー、クライアント間のやり取りをテキストボックスに記録します。あくまでテスト用です。


           (フォーム参考図)
 

【上図の動作説明】
1.[送受信]フォームの[ソケット接続]ボタンを押してクライアントからの接続を待ちます(ポート番号4000)。
2.クライアント192.168.1.23と192.168.1.88から接続要求が入ります。
3.[データ送信]ボタンを押すと上記2クライアントに[送信データ]「Who are you?」を送信します。
4.クライアント192.168.1.23は「This is terminal1.Hellow!」をサーバーに送信します。
5.クライアント192.168.1.88は「This is terminal2.Wow!」をサーバーに送信します。
6.クライアント192.168.1.23からサーバーに切断要求を出します。
7.[ソケット解放]ボタンを押して、全てのクライアント(この場合192.168.1.88のみ)との通信を切断します。
 

【ソース・ファイル】
 
ソース・ファイルは「フォーム・モジュール」、「標準モジュール」、「クラス・モジュール」から成ります。 フォーム・モジュールは(フォーム参考図)のラベル名を参考にしてください。

---------------- フォーム(送受信)・モジュール ------------------
Option Compare Database

'****************************************************************************
' 機能名    : EXCEL通信テスト(TCP/IPサーバ)-(複数クライアント対応)-(Sheet1)
' 機能説明  : EXCELを使用したTCP/IPの通信テストツール
' 著作権    : Copyright(C) 2012 のん All rights reserved
' URL    : http://homepage2.nifty.com/nonnon/
'           : このソースを使用(流用/改変/転載/等全て)した成果物を不特定
'           : 多数に公開/配布する場合は、このソースを参考にした旨を記述
'           : してください。(例)WEBページやReadMeにURLのリンクを貼る等
' 動作環境  : MSWINSCK.OCXが入っているVB6ランタイムが必要です。
'           : 事前に"regsvr32 NONCOMSCK.OCX"を実行してください。
'****************************************************************************
' 2012/12/01 Modified by MEDiAQ
'****************************************************************************


' NONCOMSCK.OCXを参照設定しています
    Private WithEvents Winsock1 As NonComSck.Winsock
    Private Winsock2(9) As Class1


Private Sub Form_Open(Cancel As Integer)
    
    PrmInit
    Me.TxBx1 = ""
        

End Sub

Private Sub SocketOpen_Click()
    Dim i2 As Integer
    
    PrmInit
    
    ' サーバ(TCPIP)接続チェック
    If Winsock1 Is Nothing = False Then
        msgout "既にソケット(TCPIP)が接続されています"
        Exit Sub
    End If
    
    
    ' クライアント(TCPIP)からの接続待ち(サーバ)
    Set Winsock1 = CreateObject("NonComSck.Winsock")
    Winsock1.Close2
    Winsock1.LocalPort = loPort
    Winsock1.Listen

    ' クライアント用オブジェクト生成
    For i2 = 0 To UBound(Winsock2)
        Set Winsock2(i2) = New Class1
    Next i2
    msgout "全ソケットをオープンしました"

End Sub

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

    ' クライアント(TCPIP)切断
    Dim i2 As Integer
    For i2 = 0 To UBound(Winsock2)
        If Winsock2(i2).Client Is Nothing = False Then
            Winsock2(i2).Client.Close2
            Set Winsock2(i2).Client = Nothing
        End If
    Next i2
    
    msgout ("全ソケット切断しました")

End Sub


Private Sub dataTX_Click()
    ' ソケット送信
    Dim sdat, ss As String
    
    Me.TxBx2.SetFocus
    sdat = Me.TxBx2.Text

    ' ソケット(TCPIP)接続チェック
    If Winsock1 Is Nothing Then
        MsgBox "ソケット(TCPIP)が接続されていません"
        Exit Sub
    End If

    ' クライアントへデータ送信
    For i2 = 0 To UBound(Winsock2)
        If Winsock2(i2).Client Is Nothing = False Then
            Winsock2(i2).Client.SendData sdat
            ss = "(TxD)" & Winsock2(i2).Client.RemoteHostIP & "<" & sdat
            msgout ss
            DoEvents
            
        End If
    Next i2

End Sub


' クライアント(TCPIP)からの接続
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)

    ' クライアント(TCPIP)からの接続許可設定
    Dim idx As Integer: idx = -1
    Dim i2 As Integer
    Dim ss As String
    
    For i2 = 0 To UBound(Winsock2)
        If Winsock2(i2).Client Is Nothing Then
            idx = i2
        End If
        If idx >= 0 And idx <= UBound(Winsock2) Then
            Set Winsock2(idx).Client = Winsock1
            Winsock2(idx).Client.Close2
            Winsock2(idx).Client.Accept requestID
            ss = "接続:" & Winsock2(idx).Client.RemoteHostIP
            msgout ss
            Exit For
        End If
    Next i2
    
    ' クライアント(TCPIP)からの接続待ち(サーバ)
    Dim lo As String: loPort = 4000
    Set Winsock1 = CreateObject("NonComSck.Winsock")
    Winsock1.Close2
    Winsock1.LocalPort = loPort
    Winsock1.Listen
End Sub

---------------- 標準モジュール(Module1) ------------------
Option Compare Database

Public loPort, InputRow As Long

Public Sub PrmInit()
    'パラメータの初期化ルーチン
    InputRow = 0
    loPort = 4000
End Sub

Public Sub msgout(st As String)

Dim ss As String

    'メッセージ出力ルーチン
    ss = Format(str(InputRow), "0000:") & st & vbCrLf
    Forms![送受信]!TxBx1 = Forms![送受信]!TxBx1.Value + ss
    InputRow = InputRow + 1

End Sub



---------------- クラス・モジュール(Class1) ------------------
Option Compare Database

'****************************************************************************
' 機能名    : EXCEL通信テスト(TCP/IPサーバ)-(複数クライアント対応)-(Class1)
' 機能説明  : EXCELを使用したTCP/IPの通信テストツール
' 著作権    : Copyright(C) 2012 のん All rights reserved
' URL    : http://homepage2.nifty.com/nonnon/
'           : このソースを使用(流用/改変/転載/等全て)した成果物を不特定
'           : 多数に公開/配布する場合は、このソースを参考にした旨を記述
'           : してください。(例)WEBページやReadMeにURLのリンクを貼る等
' 動作環境  : MSWINSCK.OCXが入っているVB6ランタイムが必要です。
'           : 事前に"regsvr32 NONCOMSCK.OCX"を実行してください。
'****************************************************************************
' 2012/12/01 Modified by MEDiAQ
'****************************************************************************

' NONCOMSCK.OCXを参照設定しています
Public WithEvents Client As NonComSck.Winsock


' クライアント(TCPIP)からの切断
Private Sub Client_Close2()
    Dim ss As String
    
    ' クライアント(TCPIP)切断
    Client.Close2
    ss = "切断:" & Client.RemoteHostIP
    msgout ss
    Set Client = Nothing
End Sub

' クライアント(TCPIP)からのデータ受信
Private Sub Client_DataArrival(ByVal bytesTotal As Long)
    Dim rdat, ss As String: rdat = ""
    
    ' クライアント(TCPIP)からデータ受信
    Client.GetData rdat

    ' 受信データ表示セルに受信データを表示
    rdat = Replace$(rdat, Chr(0), "")
    ss = "(RxD)" & Client.RemoteHostIP & ">" & rdat
    msgout ss
End Sub

----------------------------------------------