Excel VBAでマクロを作成・修正していると、
ある日突然、
実行時エラー 13
型が一致しません。
というエラーに遭遇することがあります。
特にエラーメッセージの中に
Value
という単語が含まれている場合、
- 値を代入しただけなのにエラーになる
- 昨日まで動いていたコードが急に止まる
- どの変数が悪いのか分からない
といった状況に陥りやすく、
VBA初心者〜中級者が最も混乱するエラーの1つ です。
このエラーの厄介な点は、
- 原因が1つではない
- エラー行だけ見ても判断できない
- 「Value」という名前が誤解を生みやすい
という点にあります。
この記事では、
「value 型が一致しません」エラー(実行時エラー13) について、
- エラーの正体
- なぜValueが関係するのか
- 原因パターン別の具体例
- 実務での安全な対処方法
- 再発させないための設計ポイント
を、コード例を交えながら体系的に解説します。
目次
- ✅ 「value 型が一致しません」とは何のエラーか
- ・これは「実行時エラー 13(Type mismatch)」
- ・VBAが何を怒っているのか
- ✅ なぜ「Value」という言葉が出てくるのか
- ・Valueは「セルの値」を表す代表的なプロパティ
- ・Valueは「何でも入る」ように見えて、実は厳しい
- ✅ 最も多い原因①:数値として扱えない値を計算している
- ・文字列を含んだセルを数値として扱う
- ・対処法:数値チェックを行う
- ✅ 原因②:Variant以外の変数に直接Valueを代入している
- ・Variant以外は型に厳しい
- ・対処法:Variantで受ける or 型変換する
- ✅ 原因③:Valueが「配列」になっている
- ・複数セルをまとめて取得している
- ・配列を単一値として扱うとエラーになる
- ・対処法:要素を指定する
- ✅ 原因④:Nothing のオブジェクトから Value を取得している
- ・オブジェクトが Nothing のまま
- ・対処法:存在確認を徹底する
- ✅ 原因⑤:日付・時刻の型不一致
- ・日付を文字列として扱っている
- ・対処法:CDateで明示的に変換
- ✅ 原因⑥:計算式の途中で型が崩れている
- ・途中で文字列が混ざる
- ・対処法:型を揃えてから計算する
- ✅ 原因⑦:ValueとValue2の違いを理解していない
- ・Valueは「表示形式」の影響を受ける
- ・Value2を使うと安定するケース
- ✅ 実務で安全なValueの扱い方(設計編)
- ・基本方針
- ・安全なテンプレート例
- ✅ デバッグ時の確認ポイント
- ・Immediateウィンドウで確認
- ✅ RPA(UiPath)連携時の注意点
- ✅ よくある勘違い
- ・「Valueは何でも入る」
- ・「セルが数値に見えるから大丈夫」
- ✅ まとめ:"value 型が一致しません"エラーの本質
✅ 「value 型が一致しません」とは何のエラーか
※ここを誤解すると、永遠に直せません。
・これは「実行時エラー 13(Type mismatch)」
まず大前提として、
「value 型が一致しません」エラーは、
実行時エラー 13(Type mismatch) に該当します。
つまり、
- コードの構文は正しい
- 実行して初めて問題が分かる
というタイプのエラーです。
・VBAが何を怒っているのか
VBAは、処理の途中で次のように判断します。
「この値は、その変数やプロパティには入れられない」
このときに発生するのが、
型が一致しません(Type mismatch) エラーです。
✅ なぜ「Value」という言葉が出てくるのか
※名前に引っ張られると混乱します。
・Valueは「セルの値」を表す代表的なプロパティ
Excel VBAでは、セルの中身を扱うときに
Value プロパティを頻繁に使います。
Cells(1, 1).Value = 100
この Value は、
- 数値
- 文字列
- 日付
- 配列
など、さまざまな型を取り得る 特殊なプロパティです。
・Valueは「何でも入る」ように見えて、実は厳しい
Value は柔軟そうに見えますが、
実際には、
- 代入先の変数型
- 計算式の前後関係
- Option Explicit の有無
によって、
非常にシビアに型チェック が行われます。
✅ 最も多い原因①:数値として扱えない値を計算している
※発生率が最も高い原因です。
・文字列を含んだセルを数値として扱う
Dim x As Long
x = Cells(1, 1).Value
セル A1 に
- "ABC"
- 空白
- エラー値
が入っている場合、
このコードは 型が一致しません エラーになります。
・対処法:数値チェックを行う
If IsNumeric(Cells(1, 1).Value) Then
x = CLng(Cells(1, 1).Value)
End If
Valueをそのまま信用しない
これが基本です。
✅ 原因②:Variant以外の変数に直接Valueを代入している
※初心者が最初につまずくポイントです。
・Variant以外は型に厳しい
Dim n As Integer
n = Cells(1, 1).Value
セルの中身が、
- 小数
- 大きすぎる数値
- 文字列
の場合、
エラーになります。
・対処法:Variantで受ける or 型変換する
Dim v As Variant
v = Cells(1, 1).Value
または、
n = CInt(Cells(1, 1).Value)
✅ 原因③:Valueが「配列」になっている
※中級者でも見落としがちなポイントです。
・複数セルをまとめて取得している
Dim v As Variant
v = Range("A1:B2").Value
この v は、
- 単一の値ではなく
- 2次元配列
になります。
・配列を単一値として扱うとエラーになる
Dim x As Long
x = Range("A1:B2").Value ' ← エラー
・対処法:要素を指定する
Dim v As Variant
v = Range("A1:B2").Value
x = v(1, 1)
✅ 原因④:Nothing のオブジェクトから Value を取得している
※エラー行が分かりにくい原因です。
・オブジェクトが Nothing のまま
Dim ws As Worksheet
ws.Range("A1").Value = 10
この場合、
ws が Nothing なので、
Value以前の問題でエラーになります。
参考:【VBA】Nothingとは?オブジェクト変数の初期化と解放をわかりやすく解説
・対処法:存在確認を徹底する
If Not ws Is Nothing Then
ws.Range("A1").Value = 10
End If
✅ 原因⑤:日付・時刻の型不一致
※Value絡みで非常に多い落とし穴です。
・日付を文字列として扱っている
Dim d As Date
d = Cells(1, 1).Value
セルが
"2025/01/01"(文字列)
として入力されていると、
エラーになることがあります。
参考:【VBA】日付を判定する方法:IsDate・VarType・DateValue・CDate
・対処法:CDateで明示的に変換
If IsDate(Cells(1, 1).Value) Then
d = CDate(Cells(1, 1).Value)
End If
✅ 原因⑥:計算式の途中で型が崩れている
※エラー行がズレて見える代表例です。
・途中で文字列が混ざる
Dim x As Long
x = Cells(1, 1).Value + "10"
この場合、
- 数値 + 文字列
という組み合わせになり、
型不一致エラーが発生します。
・対処法:型を揃えてから計算する
x = CLng(Cells(1, 1).Value) + 10
✅ 原因⑦:ValueとValue2の違いを理解していない
※日付・通貨で特に多いです。
・Valueは「表示形式」の影響を受ける
Value は、
- 日付
- 通貨
- パーセンテージ
などで、
思っていない型になる ことがあります。
・Value2を使うと安定するケース
v = Cells(1, 1).Value2
Value2は、
- 日付を数値
- 通貨記号を除外
した形で取得するため、
型不一致を避けやすくなります。
✅ 実務で安全なValueの扱い方(設計編)
※直すだけでなく、防ぐ視点が重要です。
・基本方針
- ValueはまずVariantで受ける
- その後に型チェック
- 明示的に型変換
・安全なテンプレート例
Dim v As Variant
v = Cells(1, 1).Value
If IsNumeric(v) Then
result = CLng(v)
Else
' エラー処理
End If
✅ デバッグ時の確認ポイント
※闇雲に修正しないことが重要です。
・Immediateウィンドウで確認
Debug.Print TypeName(Cells(1, 1).Value)
これだけで、
実際の型 が一目で分かります。
参考:【VBA】プロパティが表示されない時の原因と対処法|ウィンドウ復元・設定方法を完全解説
✅ RPA(UiPath)連携時の注意点
※ValueエラーはRPAで頻発します。
- Excelの表示形式が人によって違う
- 空白・文字列が混ざる
- 配列として取得される
そのため、
- Variant受け
- Value2活用
- 型チェック
は 必須設計 になります。
✅ よくある勘違い
※遠回りする原因です。
・「Valueは何でも入る」
→ 誤りです。
参考:【VBA】TimeValue関数の使い方と活用方法:時刻の計算
・「セルが数値に見えるから大丈夫」
→ 表示と型は別物です。
✅ まとめ:"value 型が一致しません"エラーの本質
- これは実行時エラー13
- Valueは柔軟だが厳密
- 数値・文字列・配列の混在が主因
- Variant+型チェックが最強
- 設計段階で防ぐのが最重要
このエラーを正しく理解できるようになると、
VBAは 「運に左右されるマクロ」から「安定した業務ツール」 に変わります。
「とりあえずValueを代入する」から卒業し、
型を意識したVBA設計 を、ぜひ身につけてください。