Excel VBAの「CLng 関数」について解説します。
CLng 関数とは
Excel VBA の CLng 関数は、引数を Long型(長整数型)に変換します。データ型変換関数のひとつです。
Long型(長整数型)は、範囲が -2,147,483,648 ~ 2,147,483,647 の 4 バイトの整数として格納されるデータ型です。
では、CLng 関数の構文や引数の設定と実際の使い方について具体的に解説していきたいと思います。
CLng 関数(Visual Basic for Applications リファレンス)
構文(引数と戻り値)
Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。
構文
CLng(expression)
引数
引数 | 説明 |
---|---|
expression | 【必須】任意の数値(式)または文字列(式)を指定します |
戻り値
戻り値 | 説明 |
---|---|
長整数値 (Long型) | 引数を評価して Long型(長整数型)に変換して返します ・Long型の範囲は -2,147,483,648 ~ 2,147,483,647 です ・範囲外の値を指定すると「エラー 6 オーバーフロー」が発生します ・変換できない値を指定すると「エラー 13 型不一致」が発生します ・小数がある場合は丸められます ※小数部丸めの基本は四捨五入ですが 0.5 の場合だけ次の動作です 繰り上がりが偶数になる場合だけ繰り上がり、奇数なら切り捨てます 例)CLng(0.5)=0 , CLng(1.5)=2 , CLng(2.5)=2 , CLng(2.51)=3 |
Long型 と Integer型 どちらを使うべきか
VBAにおいて整数の変数を宣言する際、Integer型とLong型のどちらを選ぶべきかについてよく問われます。
Integer型は、16ビットの符号付き整数を格納するデータ型で、範囲は「-32,768~32,767」です。
メモリ使用量は少ないですが、整数の範囲が狭いため、大きな整数を扱う場合は注意が必要です。
Long型は、32ビットの符号付き整数を格納するデータ型で範囲は「-2,147,483,648~2,147,483,647」です。
メモリ使用量は多くなりますが、より大きな整数値を扱えるデータ型です。扱う整数値の範囲が変動する場合などの場合には、整数の範囲が広いLong型を使用することをおすすめします。
Integerは古いバージョン(16ビット)のVBAで使用されていたデータ型です。最近のバージョン(32ビット)では自動的にLong型に変換されることが多いようです。
メモリ使用量についても現代のPCではあまり気にする必要はないと思います。
以上のことから、整数値の変数を宣言する際は、Long型を使用することが一般的のようです。
解説(使用例)
CLng 関数は、引数に任意の文字列(式)または数値(式)を指定すると、それを整数に丸めてLong型(長整数型)に変換します。小数部は切り捨てられます。この動作自体は CInt 関数と同じです。引数のサイズが大きくなる場合にCLng 関数を使います。以下のサンプルコードは CInt 関数のものを流用しています。
CLng 関数の引数と戻り値を確認するサンプル
いろいろな引数を設定して結果をイミディエイトに表示させます。
'■CLng関数サンプル
Sub CLng_Sample()
Dim v As Variant
On Error GoTo ErrH
'▼文字列を整数値に変換する例
v = "1,234" '半角文字(,)あり
Debug.Print CLng(v) '(,)があってもOK
v = "¥1,234" '全角文字
Debug.Print CLng(v) '¥記号は認識する
v = "1234円"
Debug.Print CLng(v) '円は認識できずエラー
v = "1989/9/17"
Debug.Print CLng(v) '文字列の日付はエラー
'▼数値を整数値に変換する例
v = 100 / 3 '33.3333333333333
Debug.Print CLng(v) 'Double値を整数値に変換
v = 1234.5 '0.5が切り捨てられるケース
Debug.Print CLng(v) '1234 繰り上がりが奇数
v = 1234.56 '0.5が繰り上がるケース(1)
Debug.Print CLng(v) '1235 0.5のうしろがある
v = 123.5 '0.5が繰り上がるケース(2)
Debug.Print CLng(v) '124 繰り上がりが偶数
'▼ブール値を整数値に変換する例
v = "True"
Debug.Print CLng(v) '文字列ではエラー
v = True
Debug.Print CLng(v) 'True は -1 に変換されます
v = False
Debug.Print CLng(v) 'False は 0 に変換されます
'▼日付型を整数値に変換する例
v = Date '当日の日付の場合
Debug.Print CLng(v) '45533
v = Now '現在の日付時刻の場合
Debug.Print CLng(v) '45533←時刻部分がカットされた
'▼オーバーフローになる例
v = "2,147,483,648" '範囲より大きい値が引数の場合
Debug.Print CLng(v) 'オバーフローエラー
v = "-2,147,483,648.51" '範囲より小さい値が引数の場合
Debug.Print CLng(v) 'オバーフローエラー
Exit Sub
'エラーハンドラー
ErrH:
Debug.Print "エラー" & Err.Number & Err.Description
Resume Next
End Sub
このコードを実行したイミディエイト画像がこちらです。
コード内にコメントを入れていますが、補足が必要な部分だけ解説を追加します。
4行目に On Error GoTo ErrH を置いて、エラーが発生した場合でも継続できるようにしています。
5~13行目は、引数が文字列の数値の場合、全角半角問わず数値として認識します。ただし、金額記号やコンマ(,)は認識しますがその他の文字列(空白を含む)が入るとエラーになります。また、日付文字列も同様にエラーです。
15~23行目は、引数が小数のある数値の場合の丸めについての事例です。小数が1桁だけで 0.5 の場合だけ注意が必要です。通常は四捨五入で桁上がりしますが 0.5 の場合だけは、繰る上がった整数が偶数になる場合だけ繰り上がります。奇数になる場合は切り捨てになります。
25~31行目は、ブール値(True/False)が引数の例です。文字列 “True” の場合はエラーになります。
True の戻り値は -1(VBAの場合)、False は 0 が返ります。
33~37行目まで、Date関数で取得した日付型を変換する例です。CInt関数ではオーバーフローエラーになった例ですが、CLng関数ではエラーにならずシリアル値に変換できます。Now関数では時刻付きのシリアル値を取得しますが、時刻の小数部は丸められて日付部分のシリアル値が返っています。
39~43行目まで、オーバーフローエラーになる例です。オーバーフローエラーは Long型の範囲を外れた場合に発生します。正数および負数ともに範囲を超えた引数の場合にはオーバーフローエラーになります。
おわりに
VBAの関数一覧はこちらからご参照ください。
VBAサンプルファイルダウンロードページのご案内
このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。
ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!
Excel VBA CLng 関数は、引数に指定した任意の文字列(式)または数値(式)を長整数型(Long型)に変換するデータ型変換関数です。
VBAで小数のある数値を整数に変換したい場合に使います。Long型の範囲は -2,147,483,648 ~ 2,147,483,647 です。Integer型の範囲 -32,768 ~ 32,767 に対してかなり大きな範囲をカバーできます。小さい範囲に限定されている場合以外は、CLng 関数を使って Long型に変換したほうがオーバーフローエラーの発生を防ぐことができます。
このサイトで紹介しているVBAコードの多くは、整数型を宣言する際は Long型を使用しています。
以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;