これは私の備忘録です。
エクセルに入力したデータを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
コメント