VBAの「型変換」は、実行時エラー(型が一致しません/オーバーフロー等)を防ぎ、コードの意図を読み手に伝えるための超重要スキルです。
この記事では、VBAの代表的な型変換関数(CStr, CInt, CLng, CDbl, CDate, CBool など)を早見表+実例+失敗パターン+安全な変換テンプレでまとめます。
型変換関数(CXxx)の全体像
VBAには、式を特定のデータ型へ強制的に変換する「型変換関数(Type Conversion Functions)」が用意されています(CBool / CByte / CCur / CDate / CDbl / CDec / CInt / CLng / CSng / CStr / CVar など)。
まず結論:実務で頻出の型変換はこの6つ
- CStr:文字列にしたい(ログ、ファイル名、キー、メッセージ表示)
- CLng:整数(行番号、ID、件数、金額の整数部)
- CDbl:小数を扱う(割合、平均、計算)
- CDate:日付として扱う(比較、加算、並べ替え)
- CBool:True/Falseに揃える(フラグ制御)
- CDec / CCur:誤差や通貨計算が絡む(会計・金額)
型変換関数 早見表(用途・注意点つき)
| 関数 | 変換先 | よくある用途 | 注意点(実務) |
|---|---|---|---|
| CStr | String | 連結、ログ、キー、ファイル名 | Nullはエラー(94)になり得る。日付は地域設定依存になり得る |
| CInt | Integer | 小さい整数 | 範囲が狭い。0.5は「最も近い偶数」へ丸め(いわゆる銀行丸め) |
| CLng | Long | 行番号、ID、件数、金額(整数) | 0.5は「最も近い偶数」へ丸め(銀行丸め) |
| CDbl | Double | 割合、平均、計算、小数 | 2進浮動小数の誤差が出ることがある(表示はFormatで整える) |
| CDate | Date | 日付比較、日付計算 | 文字列→日付はPCの地域設定に影響されやすい。入力の形に注意 |
| CBool | Boolean | フラグ制御、条件分岐 | 文字列 “True”/”False” や数値から変換されるが、入力に癖がある |
| CCur | Currency | 通貨計算(小数誤差を抑えたい) | 通貨向け。小数誤差対策として有効な場面がある |
| CDec | Decimal(Variantのサブタイプ) | 桁・精度を厳密に扱いたい | CDecはDecimalを返すのではなく「DecimalサブタイプのVariant」を返す |
0.5の丸め(CInt/CLngが「最も近い偶数」へ丸める)などの挙動はMicrosoft公式に明記されています。
暗黙の型変換 vs 明示的な型変換(おすすめの考え方)
VBAは「暗黙の型変換(勝手に変換してくれる)」が多い言語ですが、実務では明示的に変換する(CStr/CLng/CDbl…を書く)方が安全です。型が合わないと「実行時エラー13(型が一致しません)」になります。
Option Explicit
Sub ExplicitIsBetter()
Dim count As Long
count = 150
' 暗黙変換(動作はしがちだが、意図が曖昧になりやすい)
Debug.Print "件数=" & count
' 明示変換(おすすめ:ここで文字列化する意図が明確)
Debug.Print "件数=" & CStr(count)
End Sub
CStr:文字列に変換(表示・連結・キー)
CStrは、数値・日付などをStringに変換します。日付の文字列化は「現在のロケール(地域設定)」の影響を受け得るため、書式を固定したい場合はFormatが安全です。
Sub CStrExamples()
Debug.Print CStr(123) ' "123"
Debug.Print CStr(3.14) ' "3.14"
Debug.Print CStr(True) ' "True"
Debug.Print CStr(Date) ' "2026/02/25" のように環境依存
' 日付を固定書式にしたいならFormat
Debug.Print Format(Date, "yyyymmdd") ' "20260225"(ファイル名向け)
Debug.Print Format(Date, "yyyy-mm-dd") ' "2026-02-25"(ISO風)
End Sub
Str関数との違い(CStr推奨)
Str関数は「正の数・0」を文字列化すると先頭に半角スペースが入るため、表示や連結用途ではCStrの方が事故りにくいです。
Sub StrVsCStr()
Debug.Print "[" & CStr(100) & "]" ' [100]
Debug.Print "[" & Str(100) & "]" ' [ 100] ←先頭スペース
Debug.Print "金額:" & CStr(100) & "円" ' 金額:100円
Debug.Print "金額:" & Str(100) & "円" ' 金額: 100円(空白が混ざる)
End Sub
CInt / CLng:整数へ変換(丸めのクセに注意)
CIntとCLngは「小数→整数」変換で丸めが発生します。特に小数部がちょうど0.5のときは、常に最も近い偶数へ丸める挙動です(例:0.5→0、1.5→2)。
Sub CIntCLngRounding()
Debug.Print CInt(0.4) ' 0
Debug.Print CInt(0.5) ' 0 ←最も近い偶数へ
Debug.Print CInt(1.5) ' 2 ←最も近い偶数へ
Debug.Print CLng(2.5) ' 2 ←最も近い偶数へ
Debug.Print CLng(3.5) ' 4 ←最も近い偶数へ
End Sub
「切り捨て」したいなら Int / Fix を使う
「丸め」ではなく「切り捨て」をしたい場合、CInt/CLngではなく Fix / Int の検討が必要です(負数で挙動が変わる点も含めて要注意)。なお、VBAのRound関数は銀行丸め(偶数丸め)である点も公式に注意喚起があります。
Sub IntFixExample()
Debug.Print Fix(1.9) ' 1(ゼロ方向へ切り捨て)
Debug.Print Int(1.9) ' 1(下方向へ切り捨て)
Debug.Print Fix(-1.9) ' -1(ゼロ方向)
Debug.Print Int(-1.9) ' -2(下方向)
End Sub
CDbl:Doubleへ変換(小数計算の基本)
CDblは倍精度浮動小数点(Double)に変換します。割合や平均など「小数が必要な計算」の基本ですが、2進浮動小数の性質上、ぴったりの値にならないことがあります(表示用はFormatで整えるのが実務的)。
Sub CDblExamples()
Dim rate As Double
rate = CDbl("0.1") / 3
Debug.Print rate
Debug.Print Format(rate, "0.0000000000") ' 表示を整える
End Sub
CDate:Dateへ変換(日付計算・比較の基本)
CDateは日付型へ変換します。ただし「文字列→日付」は入力文字列の形式やPCの地域設定の影響を受けやすいので、実務ではDateSerial/TimeSerialなどで安全に組み立てるのがおすすめです。
Sub CDateExamples()
Dim d1 As Date
d1 = CDate("2026/02/25") ' 環境によっては形式問題が起きうる
' 安全:数値で組み立てる
Dim d2 As Date
d2 = DateSerial(2026, 2, 25)
Debug.Print d1
Debug.Print d2
Debug.Print DateDiff("d", d2, DateSerial(2026, 3, 1)) ' 差分日数
End Sub
CBool:Booleanへ変換(フラグを揃える)
CBoolはTrue/Falseへ強制変換します。条件分岐の結果を「明示的にBoolean化したい」場面で便利です(例:関数の戻り値を必ずBooleanにしたい等)。
Sub CBoolExamples()
Debug.Print CBool(1) ' True
Debug.Print CBool(0) ' False
Dim x As Long
x = 10
Debug.Print CBool(x > 5) ' True(比較結果を明示的にBoolean化)
End Sub
CDec / CCur:金額・精度が重要なとき
CDecは「DecimalサブタイプのVariant」を返す点が特徴です(独立したDecimal型を返すわけではない)。CCurはCurrency型(通貨向け)へ変換します。
Sub CDecCCurExamples()
Dim v As Variant
v = CDec("0.1") + CDec("0.2")
Debug.Print v
Debug.Print TypeName(v) ' Variant(中身がDecimalサブタイプ)
Dim money As Currency
money = CCur("1234.56")
Debug.Print money
End Sub
失敗しやすいエラーと対処(実務の地雷)
実行時エラー13:型が一致しません(Type mismatch)
型が互換でない代入・演算をすると「型が一致しません(エラー13)」が発生します。代表例は「オブジェクトを文字列として扱う」「配列をTrimする」などです。対処は「型を揃える」「明示的に変換する」「TypeName/VarTypeで調査する」です。
Sub TypeMismatchSample()
Dim rng As Range
Set rng = Range("A1")
' Debug.Print CStr(rng) ' ←オブジェクトはそのままCStrできずエラーになりやすい
Debug.Print CStr(rng.Value) ' OK:値を取り出してから変換
End


コメント