【ExcelVBA・マクロ】型変換関数まとめ(CStr/CInt/CLng/CDbl/CDate/CBool)使い分けと注意点を実例で解説

型変換関数まとめ ExcelVBA

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:誤差や通貨計算が絡む(会計・金額)

型変換関数 早見表(用途・注意点つき)

関数変換先よくある用途注意点(実務)
CStrString連結、ログ、キー、ファイル名Nullはエラー(94)になり得る。日付は地域設定依存になり得る
CIntInteger小さい整数範囲が狭い。0.5は「最も近い偶数」へ丸め(いわゆる銀行丸め)
CLngLong行番号、ID、件数、金額(整数)0.5は「最も近い偶数」へ丸め(銀行丸め)
CDblDouble割合、平均、計算、小数2進浮動小数の誤差が出ることがある(表示はFormatで整える)
CDateDate日付比較、日付計算文字列→日付はPCの地域設定に影響されやすい。入力の形に注意
CBoolBooleanフラグ制御、条件分岐文字列 “True”/”False” や数値から変換されるが、入力に癖がある
CCurCurrency通貨計算(小数誤差を抑えたい)通貨向け。小数誤差対策として有効な場面がある
CDecDecimal(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
      
スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました