VBAテクニック集 VBA一覧 コンパイルエラー・構文エラー デバッグ・エラー処理

【VBA】"value 型が一致しません"エラー(Value型)の原因と対処方法

Excel VBAでマクロを作成・修正していると、
ある日突然、

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

というエラーに遭遇することがあります。

特にエラーメッセージの中に
Value
という単語が含まれている場合、

  • 値を代入しただけなのにエラーになる
  • 昨日まで動いていたコードが急に止まる
  • どの変数が悪いのか分からない

といった状況に陥りやすく、
VBA初心者〜中級者が最も混乱するエラーの1つ です。

このエラーの厄介な点は、

  • 原因が1つではない
  • エラー行だけ見ても判断できない
  • 「Value」という名前が誤解を生みやすい

という点にあります。

この記事では、
「value 型が一致しません」エラー(実行時エラー13) について、

  • エラーの正体
  • なぜ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設計 を、ぜひ身につけてください。

    -VBAテクニック集, VBA一覧, コンパイルエラー・構文エラー, デバッグ・エラー処理