#638 全角半角混在文字列からLeftBで切り出したときの文字化けを取り除く VBA

「Left関数」は、引数の文字列の先頭から指定文字数を取り出すVBAの組み込み関数です。この関数では全角も半角も関係なくそれぞれが1文字としてカウントされます。

一方、「LeftB関数」は同様の機能ではありますが、バイト単位で取り出すという違いがあります。Accessでは基本的には全角も半角も同様に扱いますのでこれを使う機会は少ないかもしれませんが、より厳密な文字列処理を必要とするような場合には必要となる関数です。

しかし、この関数を使う場合、全角と半角が混在している文字列から切り出したときに余計な制御コードが残ってしまい、一部が文字化けしてしまうことがあります。そのようなときの回避策として、LeftB関数の代わりに使えるサンプルプロシージャです。

Public Function ConvLeftBStr(varData As Variant, intLenB As Integer) As String
'概要 文字列の先頭から指定バイト数だけ取り出す
'引数 varData : 元の長い文字列
'     intLen  : 取り出すバイト数
'返値 取り出し後の文字列

  Dim strBin As String
  Dim strRet As String

  'Unicodeからいったん変換
  strBin = StrConv(Nz(varData), vbFromUnicode)

  '末尾の文字の有効性をチェック
  If LenB(strBin) <= intLenB Then
    '取り出すバイト以内なら引数をそのまま返す
    strRet = Nz(varData)
  Else
    '取り出すバイト以上なら
    If LenB(StrConv(LeftB(strBin, intLenB), vbUnicode)) = _
        LenB(StrConv(LeftB(strBin, intLenB + 1), vbUnicode)) Then
      '指定バイトと指定バイト+1の文字数が同じなら
      strRet = StrConv(LeftB(strBin, intLenB - 1), vbUnicode)
    Else
      strRet = StrConv(LeftB(strBin, intLenB), vbUnicode)
    End If
  End If

  '返り値を設定
  ConvLeftBStr = strRet

End Function

| Index | Prev | Next |

この情報は参考になりましたか?、問題は解決しましたか?、もしまだなら......
T'sWareのワンポイトテクニカルアドバイスをご利用ください。3000円/件〜でご支援します。
スタンドアロンからSQL Server対応まで、オーダーメイドのシステムを短納期・安価でお届けします
 

Copyright © T'sWare All rights reserved