PR

【Access】文字列操作関数(LenB, LeftB, RightB, MidB関数)でバイト数を考慮したい場合

Access
記事内に広告が含まれています。

Accessで、文字列のバイト数を数える方法についてご説明いたします。
関数に慣れている方であれば、「バイト数」と言えばタイトルに挙げた「LenB関数」が頭に浮かぶと思いますが、ややこしいことに、ExcelとAcccessの「LenB関数」は、挙動が違います
例えば、半角文字列”ABCDE”のバイト数を数えたい場合、Excelで「LENB(“ABCDE”)」とすれば「5」が返ってきますが、Accessでは「10」が返ってきてしまいます。
この解決方法をご説明いたします。

また、文字列を切り出す関数(LeftB, RightB, MidB関数)の扱い方についても、ご説明いたします。

Accessを書籍でコツコツ学習したい方はこちら

前提知識

まず、Accessで「LenB(“ABCDE”)」が「10」になる理由ですが、Accessでは、データをすべてUnicode形式で保存しているためです。
Unicodeでは、半角・全角を問わず、すべて2バイトで表現します。
そのため、半角文字列“ABCDE”についても全て2バイト文字として数えられて、LenB関数が「10」を返します。

Unicodeについての詳しい説明は、以下の記事をご参照下さい。

解決方法(LenB関数)

StrConv関数」というのを使って、文字列をUnicodeからシステムの既定のコードページ(日本語版Windowsでは通常はShift-JIS)に変換してから、LenB関数を使います。(StrConv関数の詳細については後述します。)
具体的には、以下の通りです。

LenB(StrConv("ABCDE", 128))

これで、無事「5」が返ってきます。

以下、クエリを使って色々な文字列のバイト数を求めた結果を載せておきます。

クエリに組み込んだ関数は、以下の通りです。

フィールド関数結果
Len関数Len([文字列])バイト数を考慮せず、文字数「5」が返される
LenB関数LenB([文字列])全て1文字を2バイト数として扱って、
「10」が返される
LenB関数(改)LenB(StrConv([文字列],128))全角と半角を区別してバイト数を数えた結果
が返される

補足:StrConv関数について

構文

StrConv(文字列, 定数)

ここで扱ったStrConv関数ですが、第1引数に指定した文字列を、第2引数に指定した形式に変換するための関数です。
第2引数に指定できる定数は、下表の通りです。

定数内容
vbUpperCase1文字列を大文字に変換
vbLowerCase2文字列を小文字に変換
vbProperCase3文字列の先頭の文字を大文字に変換
vbWide4文字列内の半角文字を全角文字に変換
vbNarrow8文字列内の全角文字を半角文字に変換
vbKatakana16文字列内のひらがなをカタカナに変換
vbHiragana32文字列内のカタカナをひらがなに変換
vbUnicode64システム既定のコードページ(※)を使って文字列をUnicodeに変換
vbFromUnicode128文字列をUnicodeからシステム既定のコードページ(※)に変換

(※)システム既定のコードページは、日本語版Windowsでは通常はShift-JIS

使用例

文字列“ABCDE”を小文字に変換したい場合

StrConv("ABCDE", 2)

➡”abcde” が返されます。

なお、VBAでは上記の表に記載した「定数」も使用できますので、以下のようにも記述できます。

StrConv("ABCDE", vbLowerCase)

そのため、先ほどクエリで「LenB(StrConv(“ABCDE”,128))」とした式は、VBAでは以下のようにも記述できます。

LenB(StrConv("ABCDE", vbFromUnicode))

文字列を切り出す関数(LeftB, RightB, MidB関数)の扱い方について

これらの関数を使うには、更にもうひと手間必要です。
LeftB関数を例にご説明しますが、RightB関数・MidB関数についても同様です。

結論としては、かなりややこしいですが以下のような式になります。
例:半角文字列“ABCDE”の左から4バイトを取り出す場合

StrConv(LeftB(StrConv("ABCDE", 128), 4), 64)

まず、StrConv関数を使ってShift-JISに変換した文字列に対して、LeftB関数を使うところまでは、先ほどのLenB関数と同様です。
しかし、Accessで扱うデータは全てUnicode形式であるため、このままだとAccessで扱えず、文字化けしてしまいます。
そこで、再びStrConv関数を使ってUnicodeに変換する必要があります。

なお、VBAでは定数を使って以下のように記述することも出来ます。

StrConv(LeftB(StrConv("ABCDE", vbFromUnicode), 4), vbUnicode)

以下、クエリを使って色々な文字列の左から4バイトを取り出した結果を載せておきます。

クエリに組み込んだ関数は、以下の通りです。

フィールド関数結果
Left関数Left([文字列],4)バイト数を考慮せず、左から4文字が
返される
LeftB関数LeftB([文字列],4)全て1文字を2バイト数として扱う
ため、左から2文字(=4バイト)が
返される
LeftB関数(改)StrConv(LeftB(StrConv([文字列],128),4),64)全角と半角を区別して左から4バイト
として数えた結果が返される
Accessを書籍でコツコツ学習したい方はこちら
VBAをガッツリ学べるスクールはこちら

コメント

タイトルとURLをコピーしました