これは私の備忘録です。
エクセルに入力したデータをAS400にアップロードする仕組みを作ったのですが、AS400はシフト文字の関係上、文字数の計算がややこしいです。
例えば「ありがとう」は10バイトピッタリのはずですが、実際は両端にシフト分半角が1づつ入るので、10+2の12バイトになります。
なので、エクセルのデータの入力規則でLenb(A1) < 10などとしてもダメ。
UPDATE時に文字数がおかしいよと怒られてしまいます。
これを回避するには、セルの文字を1つ1つ見ていくしかないみたい。
サンプルプログラムはこんな感じ。変数はdimで定義しているものと思ってください。
'変数初期化
cnt = 0
prv = 0
now = 0
'セルの文字数を取得
Length = Len(Cells(1,1).Value)
'文字数が0でなければ
If Length <> 0 Then
'-----------------
'セルに対して処理
'-----------------
For i = 1 To Length
'現在のセルのバイト数を取得
now = LenB(StrConv(Mid(Cells(1,1), i, 1), vbFromUnicode))
'最初の文字で2バイト文字ならシフト分を足す
If i = 1 And now = 2 Then
cnt = cnt + 1
End If
'最後の文字で2バイト文字ならシフト分を足す
If i = Length And now = 2 Then
cnt = cnt + 1
End If
'前回と今回のバイト数が違うならシフト分を足す
If i <> 1 And prv <> now Then
cnt = cnt + 1
End If
'合計カウントに足しこむ
cnt = cnt + now
'1つ前の数値に代入
prv = now
Next i
'---------
'文字数検証
'---------
'例えば10バイトより大きければエラー
If cnt > 10 Then
MsgBox Cells(1, 1).Value & "の値が不正です"
Cells(1, 1).Font.ColorIndex = 3
Else
Cells(1, 1).Font.ColorIndex = 1
End If


コメント