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