VB6・VBAメモ:LenB関数

LenB関数についてメモしておきます。
LenB関数は変数のバイト数をカウントする関数になります。
知らない人も多いようですが、文字列以外のバイト数もカウントできます

ただし、構造体のバイト数は取得できるが、オブジェクトのバイト数は取得できない等、
幾つか制限があるようなので注意です。

あと、文字列のバイト数を取得するときの注意点ですが
VB6やVBAは内部の文字コードがUnicodeなので、半角アルファベット等でも2バイトとして扱われてしまいます。
半角アルファベット等を1バイトとしてカウントする場合はStrConv関数でShiftJISに変換する必要があります。

下記では、ヘルプにない例もいろいろと動作検証してみました。


概要

LenB(Expression)
機能 変数のバイト数を返す
戻り値 変数のバイト数
指定値がNULLの場合はNULL


引数

引数名説明
Expression 対象となる変数


使用例

説明記述例出力
文字列の文字数を取得
(※VB6・VBAは内部コードがUnicodeの為、
半角でも2バイトとしてカウントされる)
LenB("あiうeお") 10
変数のバイト数を取得
Dim val As Integer
Debug.Print LenB(val)
2
文字列型にサイズを指定した場合は、指定した文字数のバイト数を返す
Dim val As String * 10
val = "abc"
Debug.Print LenB(val)
20
構造体の変数のバイト数を取得
(各要素のバイト数の合計を返す)
Type tySumple
    abc As Integer
    def As Integer
    ghi As Integer
End Type

Sub Sumple()
    Dim val As tySumple
    Debug.Print LenB(val)
End Sub
6
Null指定の場合はNullを返す LenB(Null) Null


応用例

説明記述例出力
半角文字を1バイトとしてカウント
※VB6・VBAの内部文字コードがUnicodeの為、
ShiftJISに変換する必要がある
LenB(StrConv("abc", vbFromUnicode)) 3


動作検証(ヘルプにない例)

説明記述例出力
列挙体の変数のバイト数を取得
(おそらくLong型のバイト数を返す)
Enum enSumple
    abc
    def
    ghi
End Enum

Sub Sumple()
    Dim val As enSumple
    Debug.Print LenB(val)
End Sub
4
Variant型の場合、
数値や日付でも文字列として扱われる
Dim val As Variant
val = 12345
Debug.Print LenB(val)
10
オブジェクトや配列のバイト数は取得できない
Dim val As Object
Debug.Print LenB(val)
エラー
構造体内にオブジェクトや配列があっても
エラーにはならない
(※内容に関係なく4バイトとして扱われる?)
Type tySumple
    abc   As Object
    def   As clsSumple '独自クラス
    ghi() As Integer
End Type

Sub Sumple()
    Dim val As tySumple
    Debug.Print LenB(val)
End Sub
12
構造体内の配列は要素数を固定すれば
バイト数を取得できる
Type tySumple
    abc(1 To 3) As Integer
End Type

Sub Sumple()
    Dim val As tySumple
    Debug.Print LenB(val)
End Sub
6
構造体内の文字列型は場合、
4バイトとして扱われる(?)
Type tySumple
    abc As String
End Type

Sub Sumple()
    Dim val As tySumple
    val.abc = "123"
    Debug.Print LenB(val)
End Sub
4
構造体内の文字列型は、
文字列型のサイズを固定すればバイト数を取得できる
Type tySumple
    abc As String * 10
End Type

Sub Sumple()
    Dim val As tySumple
    Debug.Print LenB(val)
End Sub
20
まとめ ・列挙体はLong型として扱われる(たぶん)
・Variant型は文字列として扱われる
・オブジェクトのバイト数は取得できない
・配列のバイト数は構造体内に定義し
 サイズを固定にすれば取得できる
・構造体内の文字列型のバイト数は宣言時に
 サイズを固定にすれば取得できる
 


コメント
コメントする








    
この記事のトラックバックURL
トラックバック