見習いエンジニアがゆく

見習いエンジニアの勉強帳 VBA・NWなどなどITの勉強用ブログです。のんびり、のんびり。

Excel VBA 『関数』 Len・LenBの使い方 ~StrConv関数と組み合わせてバイト数を求める~

こんばんは。ハイルナーです。

本日は文字数に関するLen関数、LenB関数を紹介します。

 

 

f:id:melancholy198x:20180715182433j:plain

Len関数

引数に指定した文字列の文字数を返す関数です。

 

構文

Len(文字列)

 

例)

Sub lenlen()
    MsgBox Len("HelloSayGoodbye")
End Sub

Len関数の引数に指定した「HelloSayGoodbye」の文字数「11」を表示します。

 

注意

Len関数の引数に直接「数値」の指定はできません。数値が入力されているセルや数値を格納した変数を引数と指定した場合は、数値の桁数を返します。VBAが自動的に引数の数値を文字列変換してくれるため、桁数を返します。

 

例)

Sub len2()
    MsgBox Len(2019)
End Sub

実行すると「コンパイルエラー 変数が必要です」と表示されます。

 

例)変数に数値を格納

Sub len2()
    Dim a As String
    a = 2019
    MsgBox Len(a)
End Sub

実行結果は「4」を返します。2019の数字を変数に格納しているので、桁数「4」を返します。

 

プログラムを作るときにLen関数の引数に直接数字を記述することは、まずないと思います。数字を記述する時点で桁数は分かっているので。。

セルの値、変数の値にLen関数を用いること、その値が数値であることは多々ありますが、その場合は問題なく利用できるので、上述の注意は頭の片隅にでもおいておいていただければと思います。

 

LenB関数

引数に指定した文字列のバイト数を返す関数です。

ただし、Excel VBAでは文字列をUnicodeで処理するので、半角文字・全角文字も1文字2バイトとして処理してしまいます。

これだと、バイト数ではなくて、ただの「文字数×2」を返しているだけになります。。バイト数を返すには「StrConv」関数と組み合わせる必要があります。

 

構文

LenB(文字数)

 

Sub LenB_1()
    MsgBox LenB("abc")
    MsgBox LenB("あいうabc")
End Sub

「abc」の文字数の2倍の「6」を返して、その後に「あいうabc」の文字数の2倍の「12」を返します。

 

引数に指定した文字数の2倍ってあまり意味ないですよね。。

 

LenB関数で引数に指定した文字列のバイト数を表示する方法

まず、Excel VBAでは文字列をUnicode で処理するため、半角・全角文字ともに1文字2バイトで処理されるとお伝えしました。

半角1文字を1バイト、全角1文字を2バイトとして処理するためには、UnicodeからANSIへ変換処理が必要になります。

 

StrConv関数を利用することで、文字列をUnicodeからANSIに変換することが可能です。

 

構文

StrConv(文字列, 定数)

 

StrConv関数は、引数でしていた文字列を定数で指定した文字の種類に変更する関数です。定数に「vbUpperCase」を指定すると、文字列を大文字に変換、定数に「vbLowerCase」を指定すると、文字列を小文字に変換します。

※StrConv関数については、後日紹介します!

 

今回は、UnicodeからANSIに変換をするので「vbFromUnicode」という定数を使って、LenBで引数の文字列のバイト数を返したいと思います。

 

例)

Sub Unicode_ANSI()
    Dim a As String
    a = "abcあいう"
   
    MsgBox Len(a)
    MsgBox LenB(a)
    MsgBox LenB(StrConv(a, vbFromUnicode))
End Sub

 

 

MsgBox Len(a)⇒文字数の「6」を返します。

MsgBox LenB(a)Unicode文字列なので、「12」を返します。

MsgBox LenB(StrConv(a, vbFromUnicode))ANSI文字列のため、「9」を返します。

 

注意点:ワークシート関数のLenB

Excelのワークシートで使う関数にもLenB関数があります。ワークシート関数のLenBはShift-Jis体系のため、半角文字を1バイト、全角文字を2バイトで処理します。

VBA関数とワークシート関数の違いも注意してください。

 

LenBは意外とややこしいです。以下を整理して覚えておいてください。

  • VBAでバイト数を返したい場合は、LenBとStrConv関数、定数vbFromUnicodeを組み合わせるて使う。(VBAUnicode)
  • VBAでLenBのみだと、文字列の文字数の2倍の値を返す。
  • ワークシート関数のLenBはShift-Jis体系のため、バイト数で返す。

 

最後までお読みいただき、ありがとうございました。