Excel VBAでマクロを作成していると、
ほぼ確実に一度は遭遇するのが、
実行時エラー 13
型が一致しません。
というエラーです。
このエラーは、
- どこが悪いのか分かりにくい
- エラー行だけ見ても原因が特定できない
- 修正したと思ったら別の場所で再発する
という特徴があり、
VBA初心者だけでなく、中級者でも時間を奪われやすい厄介なエラーです。
さらに実務では、
- Excelの入力値が人によって違う
- RPA(UiPath)から実行される
- 夜間バッチで止められない
といった条件が重なり、
「たまにしか出ない型不一致」に悩まされるケースも少なくありません。
この記事では、
Excel VBAの 「型が一致しません」エラー について、
- エラーの正体
- なぜ発生するのか
- 原因パターン別の具体例
- 正しい対処法と安全な書き方
- 実務で再発させない設計思想
を、コード例を交えながら体系的に解説します。
目次
- ✅ 「型が一致しません」とは何のエラーか
- ・これは「実行時エラー 13(Type mismatch)」
- ・VBAが何をチェックしているのか
- ✅ 「型」とは何かを正しく理解する
- ・VBAで扱う主な型
- ・Variantは万能ではない
- ✅ 最も多い原因①:数値と文字列の混在
- ・見た目は数値でも、実体は文字列
- ・対処法:IsNumericで必ずチェックする
- ✅ 原因②:Variant以外の変数に直接代入している
- ・型が厳しい変数への代入
- ・対処法:Variantで一度受ける
- ✅ 原因③:配列を単一値として扱っている
- ・複数セルをまとめて取得している
- ・配列を数値として使うとエラー
- ・対処法:要素を明示的に指定する
- ✅ 原因④:Nothing のオブジェクトを使っている
- ・オブジェクト変数が未設定
- ・対処法:Is Nothing で確認する
- ✅ 原因⑤:日付・時刻の型不一致
- ・日付に見えるが文字列
- ・対処法:IsDate+CDate
- ✅ 原因⑥:Value / Value2 / Text の使い分けミス
- ・Valueは表示形式の影響を受ける
- ・Value2を使うと安定するケース
- ✅ 原因⑦:計算式の途中で型が崩れている
- ・文字列が混ざる計算
- ・対処法:型を揃えてから計算
- ✅ デバッグで必ず使いたい確認方法
- ・TypeNameで実際の型を確認
- ✅ 実務で安全な型不一致対策テンプレート
- ・基本ルール
- ・安全なサンプル構成
- ✅ RPA(UiPath)連携時の注意点
- ✅ よくある勘違い
- ・「セルに数値が見えるから大丈夫」
- ・「Variantなら安全」
- ✅ まとめ:「型が一致しません」エラーの本質
✅ 「型が一致しません」とは何のエラーか
※ここを誤解すると、対処が場当たり的になります。
・これは「実行時エラー 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)
「思っている型」と「実際の型」
が違うケースは非常に多いです。
✅ 実務で安全な型不一致対策テンプレート
※再発防止のための考え方です。
・基本ルール
- 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設計 を、ぜひ習慣にしてください。