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

【VBA】「型が一致しません」エラーに対処する方法|原因別に完全解説

Excel VBAでマクロを作成していると、
ほぼ確実に一度は遭遇するのが、

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

というエラーです。

このエラーは、

  • どこが悪いのか分かりにくい
  • エラー行だけ見ても原因が特定できない
  • 修正したと思ったら別の場所で再発する

という特徴があり、
VBA初心者だけでなく、中級者でも時間を奪われやすい厄介なエラーです。

さらに実務では、

  • Excelの入力値が人によって違う
  • RPA(UiPath)から実行される
  • 夜間バッチで止められない

といった条件が重なり、
「たまにしか出ない型不一致」に悩まされるケースも少なくありません。

この記事では、
Excel VBAの 「型が一致しません」エラー について、

  • エラーの正体
  • なぜ発生するのか
  • 原因パターン別の具体例
  • 正しい対処法と安全な書き方
  • 実務で再発させない設計思想

を、コード例を交えながら体系的に解説します。

目次

✅ 「型が一致しません」とは何のエラーか

※ここを誤解すると、対処が場当たり的になります。

・これは「実行時エラー 13(Type mismatch)」

「型が一致しません」は、
実行時エラー 13(Type mismatch) に分類されます。

つまり、

  • 文法(構文)は正しい
  • 実行して初めて問題が発覚する

というエラーです。

コンパイルエラーと違い、
コードは通るが、実行すると止まる
という点が特徴です。


・VBAが何をチェックしているのか

VBAは処理中、常に次の点を確認しています。

「この値は、この変数・プロパティ・演算に使って問題ないか?」

ここで、

  • 期待している型
  • 実際に入ってきた値の型

が一致しないと、
型が一致しません エラーが発生します。


✅ 「型」とは何かを正しく理解する

※型の理解が浅いと、根本解決できません。

・VBAで扱う主な型

VBAでは、次のような型を扱います。

  • Long / Integer / Double(数値)
  • String(文字列)
  • Date(日付)
  • Boolean(真偽値)
  • Variant(何でも入る特別枠)
  • Object / Worksheet / Range などのオブジェクト型

型が違えば、
代入・計算・比較のルールも異なります。


・Variantは万能ではない

よくある誤解として、

Variantなら何でも大丈夫

という考えがありますが、
Variantは 「何でも入るが、何でもできるわけではない」 型です。

Variantの中身が、

  • 数値なのか
  • 文字列なのか
  • 配列なのか

によって、
後続処理で型不一致が起こります。


✅ 最も多い原因①:数値と文字列の混在

※発生率No.1の原因です。

・見た目は数値でも、実体は文字列

Dim x As Long
x = Cells(1, 1).Value

セル A1 に
"100"(文字列)

"ABC"
が入っていると、
このコードは 型が一致しません になります。


・対処法:IsNumericで必ずチェックする

If IsNumeric(Cells(1, 1).Value) Then
    x = CLng(Cells(1, 1).Value)
End If

「数値だと思い込まない」
これが最重要ポイントです。




✅ 原因②:Variant以外の変数に直接代入している

※初心者が最初につまずくポイントです。

・型が厳しい変数への代入

Dim n As Integer
n = Cells(1, 1).Value

セルの値が、

  • 小数
  • 大きな数値
  • 空白
  • エラー値

の場合、
型不一致が発生します。


・対処法:Variantで一度受ける

Dim v As Variant
v = Cells(1, 1).Value

その後で、
型チェック・型変換を行います。


✅ 原因③:配列を単一値として扱っている

※中級者でも頻発する原因です。

・複数セルをまとめて取得している

Dim v As Variant
v = Range("A1:B2").Value

この v は、
2次元配列 です。

参考:【VBA】文字列を一括置換する方法|大量データを安全に処理する実務手順


・配列を数値として使うとエラー

Dim x As Long
x = Range("A1:B2").Value   ' ← 型不一致

・対処法:要素を明示的に指定する

x = v(1, 1)

✅ 原因④:Nothing のオブジェクトを使っている

※エラー行がズレて見える代表例です。

・オブジェクト変数が未設定

Dim ws As Worksheet
ws.Range("A1").Value = 10

ws は Nothing のため、
内部的に型不一致エラーが発生します。

参考:【VBA】Nothingとは?オブジェクト変数の初期化と解放をわかりやすく解説


・対処法:Is Nothing で確認する

If Not ws Is Nothing Then
    ws.Range("A1").Value = 10
End If

✅ 原因⑤:日付・時刻の型不一致

※Value絡みで非常に多い落とし穴です。

・日付に見えるが文字列

Dim d As Date
d = Cells(1, 1).Value

セルが文字列として入力されていると、
型が一致しません。

参考:【VBA】日付を判定する方法:IsDate・VarType・DateValue・CDate


・対処法:IsDate+CDate

If IsDate(Cells(1, 1).Value) Then
    d = CDate(Cells(1, 1).Value)
End If

✅ 原因⑥:Value / Value2 / Text の使い分けミス

※表示と実体のズレが原因です。

・Valueは表示形式の影響を受ける

  • 通貨
  • パーセンテージ
  • 日付

などは、
思わぬ型になります。


・Value2を使うと安定するケース

v = Cells(1, 1).Value2

Value2は、

  • 日付 → 数値
  • 通貨記号なし

で取得でき、
型不一致を避けやすくなります。


✅ 原因⑦:計算式の途中で型が崩れている

※エラー行が分かりにくい典型例です。

・文字列が混ざる計算

x = Cells(1, 1).Value + "10"

数値+文字列は、
型不一致になります。


・対処法:型を揃えてから計算

x = CLng(Cells(1, 1).Value) + 10

✅ デバッグで必ず使いたい確認方法

※原因特定のスピードが段違いです。

・TypeNameで実際の型を確認

Debug.Print TypeName(Cells(1, 1).Value)

「思っている型」と「実際の型」
が違うケースは非常に多いです。

参考:【VBA】変数のデータ型変換(型変換)の方法と注意点


✅ 実務で安全な型不一致対策テンプレート

※再発防止のための考え方です。

・基本ルール

  • ValueはまずVariantで受ける
  • 型チェックを必ず行う
  • 明示的に型変換する

・安全なサンプル構成

Dim v As Variant

v = Cells(1, 1).Value

If IsNumeric(v) Then
    result = CLng(v)
Else
    ' エラー処理・ログ出力
End If

✅ RPA(UiPath)連携時の注意点

※型不一致はRPA環境で特に多発します。

  • 表示形式が人によって違う
  • 空白・文字列が混在
  • 配列取得になっている

そのため、

  • Variant受け
  • Value2の活用
  • 型チェック

必須設計 です。


✅ よくある勘違い

※遠回りの原因になります。

・「セルに数値が見えるから大丈夫」

→ 表示と型は別物です。

・「Variantなら安全」

→ 中身次第で普通にエラーになります。


✅ まとめ:「型が一致しません」エラーの本質

  • 実行時エラー13
  • 原因は「想定型」と「実体型」のズレ
  • 数値・文字列・配列・日付が主犯
  • Variant+型チェックが最強
  • 設計段階で防ぐことが重要

このエラーを正しく理解できるようになると、
VBAは 「たまに壊れるマクロ」から「安定して動く業務ツール」 に変わります。

「とりあえず代入する」から卒業し、
型を意識したVBA設計 を、ぜひ習慣にしてください。

参考:【VBA】エラーを無視して終了する方法:エラーハンドリングの正しい設計と実務対応

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