MX Compnent Excel VBA 文字列処理 & バージョン違い (2017/12/09)

■バージョン違い
 Excel VBA での開発ですが、
 ターゲット(客先のPC)は、MX Component Ver.3。開発環境(こちらのPC)は、Ver.4。
 バージョンが違う時に遭遇した現象です。

 ・コマンドボタンをクリックしても何の反応もない
 ・コマンドボタンCommandButton22 等の番号が変わってしまう。
 ・番号を合わせても、期待通りに動かない。

 対処方法

 ・参照設定で、MITSUBISHI ActUtlControls Ver1.0 が実行不可になっているので、これを外す
 ・参照設定に、MITSUBISHI ActMulti Controls Ver3.0 を追加
 ・フォーム上の ActUtlType1 を削除し、ActEasyIf1 を追加
 ・コード上の、ActUtlType1 を ActEasyIf1 にすべて置換

 正常に動くようになります。

 MX Sheet Ver.1 <> Ver.2 バージョン違いも、同様の現象になります。
 参照設定が、実行不可になっていると、いろいろとあるようです。


■文字列処理
 一応、2バイト文字対応 ... と思います。(^^;



Option Explicit

'' MX Component Ver.4
'' 文字列送信
Sub ボタン1_Click()
    
    Dim deviceNo As String
    deviceNo = "D5000"
    
    Dim dataString As String
    dataString = "TEST12345"
    '' Unicode から Shift_JIS に変換
    '' バイト配列に代入
    Dim bary() As Byte
    bary = StrConv(dataString, vbFromUnicode)
    
    '' 書き込みデバイス数
    Dim dlen As Integer
    dlen = (UBound(bary) + 1) \ 2 + 1 '' 文字列が偶数の場合でも、終端として &H00 を格納するため + 1
    Dim dataAry() As Long
    ReDim dataAry(dlen - 1)
    
    Dim i As Integer
    Dim c1 As Byte, c2 As Byte
    For i = 0 To dlen - 1
        c1 = 0: c2 = 0
        If i * 2 <= UBound(bary) Then: c1 = bary(i * 2)
        If i * 2 + 1 <= UBound(bary) Then: c2 = bary(i * 2 + 1)
        '' 三菱は、先頭からの文字列を L, H の順で格納(ex "AB" : "A" -> L, "B" -> H)
        dataAry(i) = c2 * (2 ^ 8) + c1
    Next
    
    Dim ret As Long
    With ActiveSheet.ActUtlType1
        .Open
        ret = .WriteDeviceBlock(deviceNo, dlen, dataAry(0))
        .Close
        If ret = 0 Then
            MsgBox "デバイス : " + deviceNo + vbCrLf + "値 : " + dataString + vbCrLf + "書き込みました."
        Else
            MsgBox "書き込み失敗."
        End If
    End With
End Sub

'' 文字列受信
Sub ボタン2_Click()

    Dim deviceNo As String
    deviceNo = "D5000"

    '' 読みだし数(デバイス数)
    Dim dlen As Long
    dlen = 6
    
    Dim dataAry() As Long
    ReDim dataAry(dlen - 1)
    
    Dim ret As Long
    With ActiveSheet.ActUtlType1
        .Open
        ret = .ReadDeviceBlock(deviceNo, dlen, dataAry(0))
        .Close
    End With
    
    If ret = 0 Then
        
        '' Byte配列
        Dim bary() As Byte
        ReDim bary(dlen * 2 - 1)
        
        Dim i As Integer
        For i = 0 To UBound(dataAry)
            bary(i * 2) = dataAry(i) And &HFF
            bary(i * 2 + 1) = dataAry(i) \ (2 ^ 8)
            ''Debug.Print Hex(dataAry(i)) + " ";
        Next
        
        Dim dataString As String
        '' バイト配列を文字列に代入
        dataString = bary
        '' Unicode に変換
        dataString = StrConv(dataString, vbUnicode)
        '' NullChar 以降を削除
        dataString = Left(dataString, InStr(dataString, vbNullChar) - 1)
        MsgBox "デバイス : " + deviceNo + vbCrLf + "値 : " + dataString + vbCrLf + "読み込みました."
    Else
        MsgBox "読み込み失敗."
    End If
End Sub