【ExcelVBA・マクロ】CStr関数の使い方【数値・日付・ブール値を文字列に変換する方法を実例で完全解説】

CStr関数の使い方 ExcelVBA

VBAで数値や日付を文字列として扱いたいとき、こんな経験はありませんか?

  • 数値をセルに文字列として入力したいのに、数値のまま入ってしまう
  • 日付をファイル名や文字列連結に使いたい
  • MsgBoxで数値と文字列を一緒に表示したい
  • 型が一致しないエラー(実行時エラー13)が頻発する

そんなときに役立つのが CStr関数 です。

この記事では、CStr関数の基本構文から、数値・日付・ブール値それぞれの変換挙動、Str関数Format関数との違い、そして実務でよく使うコードパターンまでを丁寧に解説します。

スポンサーリンク
スポンサーリンク

CStr関数とは?

CStr関数は、さまざまなデータ型の値を文字列型(String型)に変換するVBAの組み込み型変換関数です。

「C」は Convert(変換)、「Str」は String(文字列) の略です。

基本構文

CStr(expression)
引数説明
expression変換したい値・変数・式(必須)

戻り値は常に String型 です。

シンプルな使用例

Sub CStrBasic()
    Dim num As Long
    num = 12345
    Dim result As String
    result = CStr(num)
    Debug.Print result           ' → "12345"
    Debug.Print TypeName(result) ' → "String"
End Sub

TypeName関数を使うと、変換後の型が String になっていることを確認できます。

データ型ごとの変換挙動

CStr関数はデータ型ごとに変換結果が異なります。それぞれ詳しく確認しましょう。

整数・小数(Long・Integer・Double)

Sub CStrNumbers()
    ' Integer型
    Debug.Print CStr(100)       ' → "100"
    Debug.Print CStr(-50)       ' → "-50"
    Debug.Print CStr(0)         ' → "0"
    ' Long型
    Dim lng As Long
    lng = 1234567890
    Debug.Print CStr(lng)       ' → "1234567890"
    ' Double型(小数)
    Debug.Print CStr(3.14)      ' → "3.14"
    Debug.Print CStr(-0.001)    ' → "-0.001"
    ' 注意: 非常に小さい値は指数表記になることがある
    Debug.Print CStr(0.0000001) ' → "1E-07"
End Sub

💡 ポイント:整数変換は最もシンプルです。正の値でも先頭に空白スペースが付かないのがCStr関数の特徴です(後述のStr関数との違い参照)。

日付型(Date)

日付型をCStrで変換すると、Windowsの地域設定に従った形式の文字列になります。

Sub CStrDate()
    Dim d As Date
    d = #2/19/2026#
    Debug.Print CStr(d)      ' → "2026/02/19"(地域設定による)
    Debug.Print CStr(Now)    ' → "2026/02/19 13:45:30"(実行時刻による)
    Debug.Print CStr(Date)   ' → "2026/02/19"
    Debug.Print CStr(Time)   ' → "13:45:30"
End Sub

⚠️ 注意:日付の表示形式はWindowsの「地域と言語」設定に依存します。異なるPC環境では表示が変わる可能性があるため、書式を固定したい場合はFormat関数を使用してください。

' 書式を固定する場合はFormat関数を使う
Dim d As Date
d = #2/19/2026#
Debug.Print Format(d, "yyyy-mm-dd")  ' → "2026-02-19"(固定書式)
Debug.Print Format(d, "yyyymmdd")    ' → "20260219"(ファイル名用)

ブール型(Boolean)

Sub CStrBoolean()
    Debug.Print CStr(True)    ' → "True"
    Debug.Print CStr(False)   ' → "False"
    Dim flag As Boolean
    flag = (10 > 5)
    Debug.Print CStr(flag)    ' → "True"
End Sub

ブール値は英語の “True” / “False” という文字列に変換されます。日本語の「真/偽」にはなりませんので注意してください。

Variant型・Empty・Null

Sub CStrSpecialValues()
    Dim v As Variant
    ' Empty の場合 → 空文字列("")
    Debug.Print CStr(v)       ' → ""(Empty → 空文字列)
    Debug.Print Len(CStr(v))  ' → 0
    ' 空文字列はそのまま
    v = ""
    Debug.Print CStr(v)       ' → ""
    ' Null の場合 → エラー!
    v = Null
    ' Debug.Print CStr(v)     ' → 実行時エラー94「Null の使い方が不正です」
    ' Null を安全に変換する
    If IsNull(v) Then
        Debug.Print "Null値です"
    Else
        Debug.Print CStr(v)
    End If
End Sub
CStr変換結果備考
Empty“”(空文字列)未初期化Variantの初期値。エラーなし
“”(空文字列)“”(空文字列)そのまま変換される
Nullエラー(実行時エラー94)IsNullで事前チェック必須
Nothingエラー(実行時エラー91)オブジェクト型には使えない

⚠️ Nullを渡すとエラーになる点は実務で特に注意が必要です。データベースからデータを取得する際にNullが混在することがあるため、必ず IsNull() でチェックしてから変換しましょう。

データ型別変換結果まとめ

データ型変換前の値CStr変換後注意点
Integer / Long100“100”先頭スペースなし
Integer / Long-50“-50”マイナス符号あり
Double3.14“3.14”非常に小さい値は指数表記になる
Date#2026/02/19#“2026/02/19”地域設定に依存する
BooleanTrue“True”英語表記固定
BooleanFalse“False”英語表記固定
Variant(Empty)Empty“”エラーなし
Variant(Null)Nullエラー(94)IsNullで事前チェック
String“abc”“abc”そのまま返る

CStr・Str・Formatの違いと使い分け

VBAで値を文字列に変換する方法は主に3種類あります。それぞれの違いを正確に理解しておきましょう。

Str関数との違い

最も混同されやすい Str関数 との違いは 「先頭スペースの有無」 です。

Sub CompareStrAndCStr()
    ' 正の数値の場合
    Debug.Print CStr(100)    ' → "100"    先頭スペースなし
    Debug.Print Str(100)     ' → " 100"   先頭に半角スペースあり!
    ' 負の数値の場合
    Debug.Print CStr(-100)   ' → "-100"   マイナス符号あり
    Debug.Print Str(-100)    ' → "-100"   同じ
    ' ゼロの場合
    Debug.Print CStr(0)      ' → "0"      先頭スペースなし
    Debug.Print Str(0)       ' → " 0"     先頭スペースあり!
    ' 文字列連結での差
    Debug.Print "金額:" & CStr(100) & "円"  ' → "金額:100円"
    Debug.Print "金額:" & Str(100) & "円"   ' → "金額: 100円"(スペースが入る!)
End Sub

Str関数は正の数値・ゼロの場合に符号用の半角スペースを先頭に追加します。文字列連結や表示に使う場合、意図しない空白が入ってしまうため、通常はCStr関数を使う方が安全です。

比較項目CStrStr
正の数値“100”” 100″(先頭スペースあり)
ゼロ“0”” 0″(先頭スペースあり)
負の数値“-100”“-100″(同じ)
日付型✅ 変換できる❌ エラーになる
ブール型✅ “True” / “False”❌ エラーになる
推奨度⭐⭐⭐ 実務推奨⭐ 特殊用途のみ

Format関数との違い

Format関数は書式(フォーマット)を指定して文字列に変換できる点がCStrとの最大の違いです。

Sub CompareFormatAndCStr()
    Dim num As Long
    num = 1234567
    ' CStr: そのまま文字列化
    Debug.Print CStr(num)                   ' → "1234567"
    ' Format: 書式を指定して文字列化
    Debug.Print Format(num, "#,##0")        ' → "1,234,567"    カンマ区切り
    Debug.Print Format(num, "000000000")    ' → "001234567"    ゼロ埋め9桁
    Debug.Print Format(num, "¥#,##0")       ' → "¥1,234,567"   通貨記号付き
    ' 日付の場合
    Dim d As Date
    d = #2/19/2026#
    Debug.Print CStr(d)                         ' → "2026/02/19"  地域設定依存
    Debug.Print Format(d, "yyyy年mm月dd日")     ' → "2026年02月19日"  書式固定
    Debug.Print Format(d, "yyyymmdd")           ' → "20260219"    ファイル名用
    Debug.Print Format(d, "yyyy-mm-dd")         ' → "2026-02-19"  ISO形式
End Sub
比較項目CStrFormat
書式指定❌ できない✅ できる
カンマ区切り❌ なし✅ 指定可能
ゼロ埋め❌ できない✅ 指定可能
日付書式の固定❌ 環境依存✅ 固定できる
コードのシンプルさ⭐⭐⭐ シンプル⭐⭐ 書式記述が必要
用途単純な型変換見た目を整えたい場合

💡 使い分けの基準:「とにかく文字列に変換したいだけ」なら CStr、「カンマ区切りや日付の書式を整えたい」なら Format を使いましょう。

実務でよく使うコードパターン

数値をセルに文字列として入力する

Sub WriteStringToCell()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    ' 数値をそのまま入れると先頭ゼロが消える
    ws.Cells(1, 1).Value = "00123"   ' → セルの書式が数値なら 123 になる
    ' セルの書式を文字列にしてから入力する(確実な方法)
    ws.Cells(2, 1).NumberFormat = "@"
    ws.Cells(2, 1).Value = "00123"   ' → "00123"(文字列として保持)
    ' CStrで明示的に変換しながら代入
    Dim code As Long
    code = 123
    ws.Cells(3, 1).NumberFormat = "@"
    ws.Cells(3, 1).Value = CStr(code) ' → "123"(String型として代入)
    Set ws = Nothing
End Sub

ファイル名に日付を付ける

Sub CreateFileNameWithDate()
    ' CStrで日付変換(スラッシュが入るのでファイル名にはNG)
    Dim fileName1 As String
    fileName1 = "売上データ_" & CStr(Date) & ".xlsx"
    ' → "売上データ_2026/02/19.xlsx" ← スラッシュはファイル名に使えない!
    ' Format関数で書式を固定する(推奨)
    Dim fileName2 As String
    fileName2 = "売上データ_" & Format(Date, "yyyymmdd") & ".xlsx"
    ' → "売上データ_20260219.xlsx" ← ファイル名として安全!
    Debug.Print fileName1
    Debug.Print fileName2
End Sub

⚠️ ファイル名に日付を使うときは CStr(Date) ではスラッシュが含まれてしまいます。ファイル名には必ず Format関数でスラッシュなし形式に変換しましょう。

MsgBoxで数値と文字列を連結して表示する

Sub ShowMessageWithNumber()
    Dim count As Long
    count = 150
    Dim totalAmount As Long
    totalAmount = 1234567
    ' & 演算子は自動的に型変換してくれるが…
    MsgBox "件数: " & count & " 件"   ' 動作はするが暗黙変換
    ' CStrで明示的に変換(コードの意図が明確になる)
    MsgBox "件数: " & CStr(count) & " 件" & vbCrLf & _
           "合計: " & Format(totalAmount, "#,##0") & " 円"
    ' 表示結果:
    ' 件数: 150 件
    ' 合計: 1,234,567 円
End Sub

💡 & 演算子は自動で型変換してくれますが、CStrを明示することでコードの意図が読み手に伝わりやすくなります

DBのNull値を安全に文字列変換する

Sub SafeConvertFromDB()
    Dim cn As Object, rs As Object
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.Recordset")
    On Error GoTo ErrHandler
    cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DB\sales.accdb;"
    cn.Open
    rs.Open "SELECT 顧客名, 電話番号 FROM 顧客マスタ", cn
    Do Until rs.EOF
        ' ❌ Nullが入っているとエラー
        ' Dim name As String
        ' name = CStr(rs.Fields("顧客名").Value)  ← Nullならエラー!
        ' ✅ IsNullで事前チェックしてから変換(安全)
        Dim customerName As String
        If IsNull(rs.Fields("顧客名").Value) Then
            customerName = "(未登録)"
        Else
            customerName = CStr(rs.Fields("顧客名").Value)
        End If
        Debug.Print customerName
        rs.MoveNext
    Loop
    rs.Close
    cn.Close
    Set rs = Nothing
    Set cn = Nothing
    Exit Sub
ErrHandler:
    MsgBox "エラー: " & Err.Description
    If Not rs Is Nothing Then If rs.State = 1 Then rs.Close
    If Not cn Is Nothing Then If cn.State = 1 Then cn.Close
End Sub

VBAの型変換関数まとめ

CStrはVBAの型変換関数ファミリーの一員です。他の関数と合わせて覚えておきましょう。

関数名変換先の型使用例結果
CStrString(文字列型)CStr(123)“123”
CIntInteger(整数型)CInt(“42”)42
CLngLong(長整数型)CLng(“99999”)99999
CDblDouble(倍精度浮動小数点)CDbl(“3.14”)3.14
CBoolBoolean(ブール型)CBool(1)True
CDateDate(日付型)CDate(“2026/02/19”)#2026/02/19#
CLngLong(長整数型)CLng(3.7)4(四捨五入)
CVarVariant(バリアント型)CVar(100)100(Variant)

よくあるエラーと対処法

実行時エラー94「Null の使い方が不正です」

原因:CStrにNull値を渡した場合に発生します。データベースから取得した値にNullが含まれているケースで起こりやすいです。

' ❌ エラーが発生するコード
Dim v As Variant
v = Null
Debug.Print CStr(v)  ' → 実行時エラー94!
' ✅ 対処法:IsNullで事前チェック
If Not IsNull(v) Then
    Debug.Print CStr(v)
Else
    Debug.Print "(Null値)"
End If

実行時エラー13「型が一致しません」

原因:オブジェクト型(Range・Worksheetなど)をそのままCStrに渡した場合に発生します。

' ❌ エラーが発生するコード
Dim rng As Range
Set rng = Range("A1")
Debug.Print CStr(rng)          ' → 実行時エラー13!
' ✅ 対処法:.Valueプロパティを指定する
Debug.Print CStr(rng.Value)    ' → セルA1の値を文字列に変換(OK)

非常に小さな数値が指数表記になってしまう

' CStrでは指数表記になる場合がある
Debug.Print CStr(0.0000001)      ' → "1E-07"
Debug.Print CStr(123456789012#)  ' → "1.23456789012E+11"
' ✅ 対処法:Format関数で書式を明示する
Debug.Print Format(0.0000001, "0.0000000")    ' → "0.0000001"
Debug.Print Format(123456789012#, "0")        ' → "123456789012"

エラー対処まとめ

エラー原因対処法
実行時エラー94Null値を渡したIsNullで事前チェック
実行時エラー13オブジェクトを直接渡した.Valueプロパティを指定する
指数表記になる非常に大きい/小さい数値Format関数で書式指定
日付が環境依存になるCStrの日付変換が地域設定依存Format関数で書式を固定する
ファイル名にスラッシュが入るCStr(Date)がスラッシュを含むFormat(Date, “yyyymmdd”)を使用

よくある質問(FAQ)

Q. &演算子で自動変換されるのにCStrは必要ですか?

A. 動作上は必須ではありませんが、明示的にCStrを使うことを推奨します。& 演算子は暗黙的に型変換しますが、CStrを書くことで「ここで文字列に変換する意図がある」とコードが読みやすくなります。チームで開発している場合や、Option Explicitを使って厳格にコードを書いている場合は特に有効です。

Q. CStrとFormat、どちらを使うべきですか?

A. 目的によって使い分けます。

  • CStr:単純に型変換するだけでよい場合(数値 → 文字列への変換など)
  • Format:見た目を整えたい場合(カンマ区切り・ゼロ埋め・日付書式固定など)

Q. セルの値をCStrで変換するときの注意点は?

A. セルが空のとき(Empty)エラー値のときに注意が必要です。

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 空セルはEmptyなので空文字列になる(エラーなし)
Debug.Print CStr(ws.Cells(1, 1).Value)  ' セルが空 → ""
' セルがエラー値(#N/Aなど)の場合はエラーになる → 事前チェックが必要
If Not IsError(ws.Cells(1, 1).Value) Then
    Debug.Print CStr(ws.Cells(1, 1).Value)
Else
    Debug.Print "(エラー値)"
End If

Q. CStrで変換した値を再度数値に戻せますか?

A. 数値として有効な文字列であれば、CIntCLngCDbl などの型変換関数で戻せます。

Dim num As Long
num = 12345
' 文字列に変換
Dim str As String
str = CStr(num)        ' → "12345"
' 数値に戻す
Dim backToNum As Long
backToNum = CLng(str)  ' → 12345
Debug.Print backToNum           ' → 12345
Debug.Print TypeName(backToNum) ' → "Long"

Q. Option Explicitを使っている場合でもCStrは必要ですか?

A. Option Explicit は変数の宣言を強制するものであり、型変換とは別の話です。明示的に型を宣言していても、異なる型の値を代入するときはCStrなどの変換を明示的に書く方が安全です。

Option Explicit
Sub TestWithExplicit()
    Dim num As Long
    num = 100
    Dim str As String
    ' str = num       ' 暗黙変換(動作はするが非推奨)
    str = CStr(num)   ' 明示変換(推奨)
    Debug.Print str   ' → "100"
End Sub

まとめ

CStr関数のポイントをまとめます。

  • CStr(expression) でさまざまなデータ型をString型に変換できる
  • 整数・小数・ブール値・日付・Variantに対応している
  • Null値はエラーになるため、IsNullで事前チェックが必須
  • Str関数と違い先頭に空白スペースが付かないため文字列連結に安全
  • 書式を整えたい場合は Format関数 を使う
  • ファイル名に日付を使う場合は Format(Date, "yyyymmdd") が推奨
  • オブジェクト(Rangeなど)は直接渡せない。.Value プロパティを指定する

CStr関数は一見シンプルですが、Null・日付書式・Str関数との違いを正しく理解することで、型変換に関するバグを大幅に減らすことができます。ぜひ実務のコードに積極的に活用してみてください。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

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