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 / Long | 100 | “100” | 先頭スペースなし |
| Integer / Long | -50 | “-50” | マイナス符号あり |
| Double | 3.14 | “3.14” | 非常に小さい値は指数表記になる |
| Date | #2026/02/19# | “2026/02/19” | 地域設定に依存する |
| Boolean | True | “True” | 英語表記固定 |
| Boolean | False | “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関数を使う方が安全です。
| 比較項目 | CStr | Str |
|---|---|---|
| 正の数値 | “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
| 比較項目 | CStr | Format |
|---|---|---|
| 書式指定 | ❌ できない | ✅ できる |
| カンマ区切り | ❌ なし | ✅ 指定可能 |
| ゼロ埋め | ❌ できない | ✅ 指定可能 |
| 日付書式の固定 | ❌ 環境依存 | ✅ 固定できる |
| コードのシンプルさ | ⭐⭐⭐ シンプル | ⭐⭐ 書式記述が必要 |
| 用途 | 単純な型変換 | 見た目を整えたい場合 |
💡 使い分けの基準:「とにかく文字列に変換したいだけ」なら 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の型変換関数ファミリーの一員です。他の関数と合わせて覚えておきましょう。
| 関数名 | 変換先の型 | 使用例 | 結果 |
|---|---|---|---|
| CStr | String(文字列型) | CStr(123) | “123” |
| CInt | Integer(整数型) | CInt(“42”) | 42 |
| CLng | Long(長整数型) | CLng(“99999”) | 99999 |
| CDbl | Double(倍精度浮動小数点) | CDbl(“3.14”) | 3.14 |
| CBool | Boolean(ブール型) | CBool(1) | True |
| CDate | Date(日付型) | CDate(“2026/02/19”) | #2026/02/19# |
| CLng | Long(長整数型) | CLng(3.7) | 4(四捨五入) |
| CVar | Variant(バリアント型) | 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"
エラー対処まとめ
| エラー | 原因 | 対処法 |
|---|---|---|
| 実行時エラー94 | Null値を渡した | 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. 数値として有効な文字列であれば、CInt・CLng・CDbl などの型変換関数で戻せます。
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関数との違いを正しく理解することで、型変換に関するバグを大幅に減らすことができます。ぜひ実務のコードに積極的に活用してみてください。

コメント