【2026年7月最新】VBAのVal関数完全ガイド|文字列→数値変換・型変換関数全種類・Claude Code活用法
この記事の内容
VBAでExcelを操作していると、「セルに数字が入っているのに計算できない」「文字列として認識されている数値を計算したい」という場面に頻繁に出会います。このような場合に使うのが型変換関数です。
VBAの型変換関数の中でよく使われるVal関数は文字列を数値(Double型)に変換する関数ですが、実はVBAにはCInt・CLng・CDbl・CStr等の型変換関数が多数あり、それぞれ用途が異なります。
この記事ではVBAのVal関数の使い方から、CInt・CLng・CDbl等の型変換関数の全種類、さらにIsNumericでエラーを防ぐ方法、Claude Codeを使った型変換コードの自動生成まで完全解説します。
01 VBA VAL BASICS VBAのVal関数とは?文字列を数値に変換する基本 Val(文字列)で文字列を数値(Double型)に変換する組み込み関数
VBAのVal関数は文字列を数値に変換する組み込み関数です。構文は「Val(文字列)」で、引数に数値を表す文字列を渡すと、数値(Double型)として返します。
📚 用語解説
Val関数:VBAの組み込み関数。「Val(文字列)」の形で使い、文字列を数値(Double型)に変換して返す。文字列の先頭から数値として解釈できる部分を読み取り、数値に変換できない文字が出た時点で変換を止める。例:Val("123abc") → 123、Val("abc123") → 0。対になるのはStr関数(数値を文字列に変換)。
' Val関数の基本的な使い方
Dim strNum As String
Dim result As Double
strNum = "1234"
result = Val(strNum)
MsgBox result ' 1234と表示(Double型)
MsgBox TypeName(result) ' Doubleと表示
' 小数も変換できる
MsgBox Val("3.14") ' 3.14と表示
' 先頭が数値なら途中の文字は無視
MsgBox Val("123abc") ' 123と表示(abcは無視)
' 先頭が文字なら0を返す
MsgBox Val("abc123") ' 0と表示
| 入力(文字列) | Val関数の結果 | 変換ルール |
|---|---|---|
| "1234" | 1234 | 整数文字列 → 整数として変換 |
| "3.14" | 3.14 | 小数文字列 → 小数として変換 |
| "123.45abc" | 123.45 | 数値部分まで変換・文字で停止 |
| "abc123" | 0 | 先頭が文字のため0を返す |
| " 456" | 456 | 先頭の空白は無視される |
| "1,234" | 1 | カンマは数値でないため1まで変換 |
| "" | 0 | 空文字列は0を返す |
02 VAL BEHAVIOR Val関数の動作:変換できるもの・できないもの 特殊なケース(カンマ・スペース・先頭ゼロ・16進数・8進数)の動作
2-1. カンマ(桁区切り)がある数値の変換
「1,234」のようなカンマ区切り数値はVal関数で正しく変換できません。Replaceでカンマを除去してから変換します。
' カンマ区切り数値を変換する正しい方法 Dim strNum As String strNum = "1,234,567" ' Replaceでカンマを除去してからValで変換 Dim num As Double num = Val(Replace(strNum, ",", "")) MsgBox num ' 1234567と表示
2-2. 先頭ゼロのある数値
「0123」のような先頭ゼロがある文字列をVal関数に渡すと、そのまま数値の「123」として変換されます(先頭のゼロが落ちます)。郵便番号など先頭ゼロが重要な場合はVal関数ではなく、文字列のまま扱うか、セルに文字列書式を設定してください。
' 先頭ゼロの扱い
MsgBox Val("0123") ' 123(先頭ゼロが消える)
MsgBox Val("00456") ' 456(同様)
' 郵便番号を数値変換すると先頭ゼロが消えるため注意
Dim postcode As String
postcode = "0123456" ' 〒012-3456
MsgBox Val(postcode) ' 123456(先頭の0が消える)
2-3. 16進数・8進数の変換
Val関数は文字列の先頭が「&H」の場合は16進数として、「&O」(大文字O)の場合は8進数として変換します。これはVBAで16進数を扱う場面で使えます。
' 16進数・8進数の変換
MsgBox Val("&HFF") ' 255(16進のFFを10進に変換)
MsgBox Val("&HFF01") ' 65281(16進のFF01を10進に変換)
Val関数は常にDouble型(倍精度浮動小数点数)を返します。整数が欲しい場合は「CInt(Val(文字列))」や「CLng(Val(文字列))」と組み合わせて使えますが、後述のCInt・CLng関数を直接使う方がシンプルです。
03 TYPE CONVERT ALL VBAの型変換関数全種類(CInt・CLng・CDbl等) 変換先の型に合った関数を選ぶ——型変換関数の完全比較表
VBAには変換先の型に応じた複数の型変換関数があります。Val関数はDouble型への変換専用ですが、整数が欲しい場合はCInt、長い整数ならCLng、通貨ならCCurのように使い分けます。
📚 用語解説
型変換関数(CInt・CLng・CDbl等):VBAで変数の型を特定の型に変換するための組み込み関数群。「C」はConvert(変換)の頭文字。例:CInt(Integer型に変換)、CLng(Long型に変換)、CDbl(Double型に変換)、CStr(String型に変換)、CBool(Boolean型に変換)、CDate(Date型に変換)。Val関数との違いは、Val関数が文字列→数値専用で常にDouble型を返すのに対し、C系関数は引数が変換可能な値なら数値・文字列・ブール値など任意の型から目的の型に変換できる点。
| 関数名 | 変換先の型 | 範囲・特徴 | 使用例 | 使いどころ |
|---|---|---|---|---|
| Val(str) | Double | 文字列→数値専用・先頭から変換 | Val("123") | 文字混じりの文字列を変換する場合 |
| CInt(val) | Integer | -32,768〜32,767の整数 | CInt("123") | セル行数・ループカウンタ等の小さい整数 |
| CLng(val) | Long | -2,147,483,648〜2,147,483,647 | CLng("1000000") | 大きい整数(行数・金額等) |
| CDbl(val) | Double | 倍精度浮動小数点数 | CDbl("3.14") | 高精度の小数計算 |
| CSng(val) | Single | 単精度浮動小数点数 | CSng("3.14") | 精度が低くてよい小数 |
| CCur(val) | Currency | 通貨型(15桁+4桁小数) | CCur("1234.56") | 金額・財務計算 |
| CStr(val) | String | 数値・日付等を文字列に変換 | CStr(1234) | 数値をセルに文字列として入力 |
| CBool(val) | Boolean | 0→False、0以外→True | CBool(1) | True/Falseへの変換 |
| CDate(val) | Date | 文字列・数値を日付型に変換 | CDate("2026/01/01") | 文字列の日付をDate型に |
| CByte(val) | Byte | 0〜255の整数 | CByte(200) | 非常に小さい整数の場合 |
3-1. CIntとCLngの使い分け
CIntとCLngはどちらも整数への変換ですが、扱える範囲が異なります。Excelの行番号(最大1,048,576)はIntegerの最大値(32,767)を超えるため、必ずCLng(Long型)を使う必要があります。
' CInt vs CLng の使い分け
' CIntはIntegerの範囲(-32768〜32767)
Dim intVal As Integer
intVal = CInt("1000") ' OK
' intVal = CInt("100000") ' エラー:範囲オーバー
' CLngはLongの範囲(-21億〜21億)
Dim lngVal As Long
lngVal = CLng("100000") ' OK
lngVal = CLng("1000000") ' OK(100万もOK)
' Excelの行番号を扱う場合は必ずLong
Dim lastRow As Long
lastRow = CLng(Cells(Rows.Count, 1).End(xlUp).Row)
3-2. CDblとCSng・CCurの使い分け
小数を扱う場合、CDbl(倍精度)はCSng(単精度)より高精度です。金融計算・会計処理など桁数の精度が重要な場合はCCur(Currency型)を使うことが推奨されます。通常の科学計算・統計処理ではCDblが適しています。
' 財務計算はCCurを使う
Dim amount As Currency
amount = CCur("12345.6789")
MsgBox amount ' 12345.6789(4桁小数まで保持)
' CDblの精度注意点
Dim dbl As Double
dbl = CDbl("0.1") + CDbl("0.2")
MsgBox dbl ' 0.30000000000000004 など浮動小数の誤差が出ることがある
04 ISNUMERIC IsNumeric関数でエラーを防ぐ方法 型変換エラーが起きる前にIsNumericで数値かどうかを確認する
型変換関数を使う際、変換できない値(例:「abc」を数値に変換しようとする)を渡すと実行時エラー「型が一致しません」が発生します。このエラーを防ぐには、変換前にIsNumeric関数で数値に変換可能かどうかをチェックします。
📚 用語解説
IsNumeric関数:VBAの組み込み関数。「IsNumeric(値)」の形で使い、引数が数値として評価できる場合はTrue、できない場合はFalseを返す。数値への型変換(CInt・CLng・CDbl等)の前に事前チェックとして使い、型変換エラーを防ぐのが一般的な使い方。Val関数は変換できない場合に0を返すが、IsNumericはTrueまたはFalseで判定できる。
' IsNumericで変換前にチェックする安全なパターン
Dim strVal As String
strVal = Cells(2, 1).Value
If IsNumeric(strVal) Then
' 数値に変換できる場合のみ変換
Dim numVal As Long
numVal = CLng(strVal)
Cells(2, 2).Value = numVal * 2 ' 計算処理
Else
' 数値でない場合の処理
Cells(2, 2).Value = "数値ではありません"
End If
IsNumericが「数値として評価できる」と判定する値の範囲を確認しておきましょう。
| 値 | IsNumericの結果 | 備考 |
|---|---|---|
| "123" | True | 整数文字列 |
| "3.14" | True | 小数文字列 |
| "1,234" | True(注意) | カンマ区切りもTrue判定。Val関数ではなくCLng等を使うと変換失敗する場合がある |
| "123円" | False | 文字が含まれる |
| "abc" | False | 文字列 |
| ""(空文字列) | False | 空文字列 |
| True / False | True | Boolean値も数値として評価できる(True=-1, False=0) |
Cells(i,j).Value
文字列か数値か不明
If IsNumeric(val) Then
エラー防止の前処理
CLng(val) or CDbl(val)
安全に変換できる
計算・比較・書き出し
正確な数値で処理
IsNumericは"1,234"(カンマ区切り)をTrueと返しますが、CInt("1,234")やCLng("1,234")を実行すると型変換エラーになります。カンマ区切りの数値を変換する場合は、IsNumericのTrue判定後にReplaceでカンマを除去してからCLng等を使ってください。
05 CELL TYPE CONVERT Excelセルの値の型変換:文字列数字をSUM対象にする セルが「文字列」として保存された数値をVBAで数値型に変換する実践テクニック
Excelで外部システムからエクスポートしたデータや、CSVを開いたときに「数値のはずのセルが左揃えになっている(文字列と認識されている)」ことがあります。こういった場合、SUM関数やVBAの計算が正しく動かないため、数値型に変換する必要があります。
5-1. 一列全体を数値型に変換するVBAコード
' A列の文字列数値を数値型に変換する
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Dim i As Long
For i = 1 To lastRow
Dim cellVal As String
cellVal = CStr(Cells(i, 1).Value)
If IsNumeric(cellVal) Then
' カンマを除去してから数値変換して上書き
Cells(i, 1).Value = CDbl(Replace(cellVal, ",", ""))
End If
Next i
MsgBox "数値変換完了: " & lastRow & "行"
' 変換後はSUM・AVERAGEが正常に動作する
5-2. テキスト形式の数値を一括変換(エラー無視パターン)
大量データの一括変換では、エラーが起きても処理を継続したい場合があります。On Error Resume Nextを使ってエラーを無視しながら変換する方法です。
'On Error Resume Nextでエラーを無視しながら変換 Dim lastRow As Long lastRow = Cells(Rows.Count, 1).End(xlUp).Row Dim i As Long Dim errorCount As Long errorCount = 0 For i = 1 To lastRow On Error Resume Next Dim oldVal As Variant oldVal = Cells(i, 1).Value If IsNumeric(oldVal) Then Cells(i, 1).Value = CDbl(Replace(CStr(oldVal), ",", "")) End If If Err.Number <> 0 Then errorCount = errorCount + 1 Err.Clear End If On Error GoTo 0 Next i MsgBox "変換完了(エラー: " & errorCount & "件)"📚 用語解説
On Error Resume Next:VBAのエラー処理文。このステートメントの後にエラーが発生しても処理を中断せず次の行に進む(エラーを無視する)。Err.Numberを確認してエラーの有無を判定し、Err.Clearでエラー情報をリセットする。「On Error GoTo 0」で通常のエラー処理(エラー発生で停止)に戻す。エラーを無視しすぎると問題の特定が難しくなるため、限定的な範囲でのみ使うのがベストプラクティス。
06 NUM TO STR 数値を文字列に変換:CStr・Format関数の使い方 CStrで単純変換・Formatで書式指定した文字列変換を使い分ける
数値を文字列に変換する場面もよくあります。
📚 用語解説
Format関数:VBAの組み込み関数。「Format(値, 書式文字列)」の形で使い、数値・日付・時刻を指定した書式の文字列に変換する。「#,##0」で桁区切り数値、「0.00」で小数2桁固定、「YYYY年MM月DD日」で日付書式のように多様な書式に対応。ExcelのTEXT関数に相当するVBAの関数。帳票・レポート出力・表示用文字列の生成に頻繁に使われる。
6-1. CStr関数:数値を文字列に変換
' CStrで数値を文字列に変換 Dim num As Long num = 12345 Dim str As String str = CStr(num) MsgBox str ' "12345"と表示 MsgBox TypeName(str) ' Stringと表示 ' 小数 MsgBox CStr(3.14) ' "3.14"と表示 ' 日付 MsgBox CStr(Date()) ' 今日の日付の文字列
6-2. Format関数:書式指定付きで文字列に変換
Format関数は数値・日付を指定した書式の文字列に変換します。CStrより詳細な書式指定が可能で、帳票出力・レポート作成に多く使われます。
' Format関数の使い方
Dim num As Long
num = 1234567
' 桁区切りカンマ付きの数値
MsgBox Format(num, "#,##0") ' "1,234,567"
' 小数点以下2桁(端数は四捨五入)
MsgBox Format(3.14159, "0.00") ' "3.14"
' 0埋めした数値(3桁)
MsgBox Format(42, "000") ' "042"
' 円記号付きの通貨表示
MsgBox Format(9800, "\\#,##0円") ' "9,800円"
' 日付の書式変換
Dim d As Date
d = CDate("2026/07/18")
MsgBox Format(d, "YYYY年MM月DD日") ' "2026年07月18日"
| 書式文字列 | 変換結果(例:num=1234) | 用途 |
|---|---|---|
| "#,##0" | "1,234" | 桁区切りカンマ付き数値 |
| "0.00" | "1234.00" | 小数点以下2桁固定 |
| "000000" | "001234" | 6桁のゼロ埋め |
| "0%" | "%"(割合を指定) | パーセント表示 |
| "YYYY/MM/DD" | "2026/07/18" | 日付の書式 |
Excelのセルに「書式設定」を適用しても、VBAで読み取るセルの値の型は変わりません。セルが「数値書式:#,##0円」に設定されていても、Cells(1,1).Valueは数値のまま返します。Format関数はVBA内で数値を特定の書式の「文字列」に変換するものです。セルへの出力にはFormat関数を使い、セルからの読み込みは型変換関数(CInt等)を使うというように使い分けてください。
07 TYPE ERROR FIX 型変換エラーの原因と対処法 「型が一致しません」エラーの主な原因と防止パターンを解説
VBAの型変換で最もよく出るエラーは「実行時エラー 13: 型が一致しません(Type mismatch)」です。このエラーの主な原因と対処法を整理します。
| エラーの原因 | 具体例 | 対処法 |
|---|---|---|
| 数値に変換できない文字列を型変換関数に渡した | CInt("abc") → エラー | IsNumericで事前チェック後に変換 |
| Emptyの変数を変換しようとした | CInt(emptyVar) → エラー | IsEmpty(var)でEmptyチェック後に変換 |
| Nothingオブジェクトにアクセスした | CInt(Nothing) → エラー | Is Nothingでチェック後にアクセス |
| セルがNull(空白のRangeセル)の場合 | CLng(Cells(1,1)) → エラー(空白セル) | IsEmpty(Cells(1,1))でチェック |
| 文字列に非数値(全角スペース・改行)が含まれる | CLng("1 2 3") → エラー | Trimで空白除去・Replaceで改行除去してから変換 |
' 安全な型変換の完全パターン
Function SafeToLong(ByVal val As Variant) As Long
' NullやEmpty・Nothing等の異常値を全てガード
If IsNull(val) Or IsEmpty(val) Then
SafeToLong = 0
Exit Function
End If
' 文字列に変換してトリム
Dim strVal As String
strVal = Trim(CStr(val))
' カンマ除去(桁区切り対策)
strVal = Replace(strVal, ",", "")
' 数値チェック後に変換
If IsNumeric(strVal) Then
SafeToLong = CLng(strVal)
Else
SafeToLong = 0
End If
End Function
' 使い方
Dim result As Long
result = SafeToLong(Cells(2, 1).Value)
MsgBox result
08 CLAUDE CODE TYPE Claude CodeでVBAの型変換コードを自動生成する 型変換の要件を日本語で説明するだけでVBAコードが生成できる
VBAの型変換コードは「どの型に変換するか」「エラーをどう処理するか」「書式はどうするか」など組み合わせが多く、正確に書くには経験が必要です。2026年現在、Claude Codeを使えば型変換の要件を日本語で説明するだけでVBAコードが生成できます。
| あなたの指示 | Claude Codeが生成するもの |
|---|---|
| 「A列の文字列数値を数値型に変換して上書きするVBAマクロ。カンマ区切りにも対応して」 | IsNumeric + Replace + CDblを使った安全な変換コード |
| 「B列の数値を1,234円の書式でC列に文字列として出力するVBAコード」 | Format関数を使った書式変換コード |
| 「セルの値が数値かどうかを確認して、数値ならLong型に変換する安全な関数を書いて」 | IsNumeric + IsEmpty + エラーハンドリングを含む関数 |
| 「このVBAコードで"型が一致しません"エラーが出ます。原因と修正方法を教えて(コードを貼り付け)」 | エラー原因の解説と修正済みコード |
VBAの型変換エラーもClaude Codeで解決できます
「型が一致しません」エラーが出て解決できない、「文字列の数値をSUM対象にしたい」——こうしたExcel VBAの型変換の課題はClaude Codeで解決できます。エラーのコードを貼り付けて「原因と修正方法を教えて」と依頼するだけです。
まずは無料相談で、Excel業務の自動化の課題をヒアリングさせてください。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
AI活用を自社で回せるようになりたい方へ
AI鬼管理
Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。
よくある質問
Q. VBAのVal関数の使い方を教えてください。
A. VBAのVal関数は「Val(文字列)」の形で使い、引数の文字列を数値(Double型)に変換して返します。文字列の先頭から数値として読める部分を変換し、数値でない文字が出た時点で変換を止めます。例えばVal("123abc")は123を返し、Val("abc123")は0を返します。カンマ(1,234)や全角数字は正しく変換されないため注意が必要です。
Q. VBAのCIntとCLngの違いは何ですか?
A. CIntはInteger型(-32,768〜32,767)に変換します。CLngはLong型(約-21億〜21億)に変換します。Excelの行番号は最大1,048,576なのでCIntの範囲を超えます。Excelマクロでは行数や金額を扱うことが多いため、基本的にCLngを使う方が安全です。小さな整数でCIntを使う場合でも、将来的に値が大きくなるリスクを考えるとCLngで統一するのがおすすめです。
Q. IsNumeric関数の使い方と注意点を教えてください。
A. IsNumeric(値)で引数が数値として評価できる場合にTrueを返します。型変換関数(CInt・CLng・CDbl等)を使う前の事前チェックとして使います。注意点は"1,234"のようなカンマ区切り数値もTrueを返しますが、CInt("1,234")はエラーになる点です。カンマ区切りの数値を変換する場合はIsNumericのTrue判定後にReplaceでカンマを除去してから変換してください。
Q. VBAでセルの「文字列として保存された数値」を数値型に変換するには?
A. ループで全行を処理し、IsNumericでチェック後にCDbl(またはCLng)で変換してCells(i,j).Valueに上書きします。カンマ区切りがある場合はReplace(cellVal, ",", "")でカンマを除去してから変換します。一度に全行を変換するにはApplication.ConvertFormula等の方法もありますが、VBAのループが最も柔軟です。
Q. VBAのFormat関数の使い方を教えてください。
A. Format(値, 書式文字列)で数値や日付を指定した書式の文字列に変換します。代表的な書式文字列:桁区切り数値は"#,##0"、小数2桁固定は"0.00"、日付は"YYYY年MM月DD日"、6桁ゼロ埋めは"000000"などです。桁区切りカンマ付きの金額表示には「Format(金額, "#,##0") & "円"」のように使えます。
Q. VBAの型変換で「型が一致しません」エラーが出た場合の対処法は?
A. 主な原因は「数値に変換できない文字列を型変換関数に渡している」ことです。対処法は3つあります。①IsNumericで事前チェックし、Trueの場合のみ変換する。②On Error Resume Nextでエラーを無視する(ただし問題の特定が難しくなる)。③Val関数を使う(変換できない場合に0を返すため一部の状況でエラーが出ない)。根本的な解決は①のIsNumericによる事前チェックが推奨されます。
Q. Claude CodeでVBAの型変換コードを生成できますか?
A. できます。「A列の文字列数値を数値型に一括変換するVBAマクロ」「型が一致しませんエラーが出るVBAコードを修正して(コードを貼り付け)」「数値を1,234円の書式で文字列に変換するVBAコード」のように日本語で依頼するだけで、エラーハンドリング付きの安全なVBAコードが生成されます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
Claude Code を業務に落とし込む
専門研修コース一覧
受講者本人の業務を題材に、「使いこなせる」状態になるまで伴走する研修プログラム。1対1特化型・ハンズオン・法人講座の3コースを展開中。業務特化・実装まで踏み込むタイプのClaude Code研修です。
研修コース一覧を見る →AI鬼管理へのお問い合わせ
この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。





