ひとつのセルに入力された文字を、適当な長さで分割して2つのセルに分ける処理が、思いの外苦労したので、メモ。
セル内容が、半角のみか全角のみで統一されていればもっと簡単なのだが、住所のようなケースで両者が混じっていると、分割位置によっては文字化けしてしまうので困る。
以下が、それを回避してうまくいったコード。
変数の宣言が適当なだけど、そのままにしている。
ポイントは、2バイト文字は2文字としてカウントされるように文字コードを変換することと、切れ目の文字種別をチェックしてそれによりもう一回切ること。
あと、最後の方は最初と同じ処理をさせないように条件分岐させるべきだが、コードの見通しを優先させた。
Public Sub AddressSep(I As Integer) '住所2分割処理 Iは列数の位置 '品名1に入る文字が半角32文字を超えると品名2に入れる。半角カナ混在のため分割位置が不適の場合は31文字目で分割し直す Dim c As Object For Each c In Selection a = StrConv(c, vbFromUnicode) '文字コードをSJISに変換(全角を2文字としてカウントできるように) b = MidB(a, 1, 32) '指定文字数を取り出し cx = StrConv(b, vbUnicode) '文字コードをUNICODEに変換 d = Asc(Right(cx, 1)) '切れ目の文字を取り出し Select Case d Case Is < &H8890 '文字化けなど x = 31 y = 32 Case Is < &H9890, Is < &HEFFF 'JIS第一水準、第二水準 x = 32 y = 33 Case Else 'それ以外(カタカナなど) x = 31 y = 32 End Select e = MidB(a, 1, x) f = StrConv(e, vbUnicode) g = MidB(a, y, 32) h = StrConv(g, vbUnicode) c.Offset(, I) = f c.Offset(, I + 1) = "'" & h '先頭ゼロで数字のみの場合にゼロが消えることの無いように 'Debug.Print f & h Next c End Sub