和風スパゲティのレシピ

日本語でコーディングするExcelVBA

値を整数値(Long型)に変換する - CLng関数

文字列型になっている数値をLong型(長整数型)に変換する、
CLng関数の使い方を解説します

基本形

CLng(変換したい値)

実行例

CLng("123") ' = 123
CLng("\1,000") ' = 1000
CLng("あいう") ' 「型が一致しません」エラー
CLng(123.45) ' = 123
CLng(True) ' = -1
CLng(#2025/5/18#) ' = 45473

解説

CLng関数は、数値や文字列などをLong型(長整数型)に変換する関数で、
実行例の通り、文字列の "123" を渡すと数値の123として返されます。

数値に変換できない文字列を渡した場合は「型が一致しません」エラーとなります。


セルの表示形式に設定できる文字列であれば数値に変換することができますので、
「\1,000」でも1000に変換することが可能です。


小数を渡した場合はいわゆる銀行丸め(偶数丸め)が行われ、
0.5なら0、1.5なら2と、最も近い偶数に変換されます。


四捨五入ではない点に注意と言いたいところですが、
そもそもこの関数は「型変換を行うための関数」です。

これを「小数の整数化」に使用するのはコードを読みづらくするだけですので、

  • 切り捨て:Int関数 または WorksheetFunction.RoundDown
  • 切り上げ:WorksheetFunction.RoundUp
  • 四捨五入:WorksheetFunction.Round
  • 銀行丸め:Round関数

をそれぞれ用いることにして、目的と手段があったコードにしてください。


また、日付を渡した場合はシリアル値(1900/1/1を1とした連番)に変換されます。

時刻がなければこの関数をシリアル値変換に用いてOKです。


他にはTrue や False といったBoolean型も数値に変換されます。

使いどころ

VBAは暗黙の型変換を行ってくれる言語のため、
C(キャスト)関数シリーズはそこまで出番がありません。

例えば、

Dim Long変数 As Long
Long変数 = "\1,000"

この代入も問題なく実行でき、変数にはしっかり1000が入ります。

よって、変数に代入する上ではこの関数を使用する必要ありません。


ということであまり出番がないキャスト関数シリーズですが、
シリーズの中でCLng関数だけはそこそこ必要な場面に遭遇します。


まずひとつがInteger型のオーバーフロー問題です。

VBAでは「32,768以下の数値はInteger型に暗黙の型変換されてしまう」ため、
何でもない以下のコードが「オーバーフローしました」エラーを起こします。

MsgBox 1000 * 1000 ' ← こんな簡単なコードがオーバーフローエラー

 
こういった値同士の掛け算や足し算でオーバーフローしてしまう場合は、
片方をLong型変数に入れるか、CLng関数をかませて対応してください。


続いてもうひとつが数値文字列の足し算問題です。

VBAの「+」演算子は文字列に使用すると「&」と同じ処理になってしまうため、
以下のコードの結果は「11」になってしまいます。

MsgBox "1" + "1" ' ← まさかの11が表示される

VBAには加算演算子と結合演算子が同じというとんでもない罠がある
ということは覚えておきましょう。


これにはまりやすいのが「Left/Mid/Right」をはじめとした、
文字列を取得する関数で作った値を計算するときです。


例えば1000個+2000個を計算したいとき、

MsgBox Left("1000個", 4) + Left("2000個", 4)
MsgBox Replace("1000個", "個", "") + Replace("2000個", "個", "")

このように「左4文字」や「個を置換で消した文字」で作った数値を「+」でつなぐと、
結果は「10002000」が返ってしまいます。

返り値がString型の関数で数値を作って計算を行う場合は、
CLng関数やCDbl関数をかませて実行してください。


この「オーバーフロー」「数値文字列の足し算」問題に対応するため、
CLng関数が必要になりますので覚えておきましょう。