VBA実行時エラー13「型が一致しません」の原因と直し方|確認する場所は4つだけでした

朝一番にメールの集計作業を進めます。いつものマクロのボタンを押しました。すると、突然見慣れない画面が出現します。「実行時エラー13 型が一致しません」という冷たいメッセージでした。何も設定を変えていないはずです。なぜ今日に限って動かないのでしょうか。私は画面の前で数分間固まってしまいました。非エンジニアの私たちにとって、エラーの専門用語は難解です。まるで高い壁のように感じられます。

しかし、このエラー13はVBAからのシンプルな警告です。「入れる箱と中身が合っていませんよ」という意味を持っています。原因さえ分かってしまえば、直し方はそれほど難しくありません。私は何度もこのエラーで頭を抱えてきました。ようやくたどり着いたチェックポイントを順番に整理します。まずは落ち着いて状況を確認しましょう。エラーが起きているコードの場所を特定してみてください。この記事では、実務で経験した失敗例を交えてお伝えします。原因の切り分け方を具体的に解説していくつもりです。

型が一致しません」エラー、まさかの全角数字が原因

実は、このエラーが出た時の私は、何が原因か全く想像もつきませんでした。昨日まではボタン一つで大量のデータを処理できていました。しかし今日は一行目から全く進みません。そこでコードを一行ずつ確認しようと試みます。それでもどこが間違っているのか見当もつきませんでした。結局、関係のない計算式やセルの書式設定を片っ端から変更します。2時間以上の貴重な時間を無駄にしてしまったのです。

前日まで問題なく動いていたマクロが突然止まります。「型が一致しません」と出て困惑した経験があります。何も変えていないのにと不思議に思っていました。画面を何度も閉じたり、PCを再起動したりしましたが、エラーは消えませんでした。後で本当の原因が判明します。入力データに一箇所だけ全角の数字が混じっていたのです。

エラー13 Type mismatchの原因と対処

このエラー13は「Type mismatch」と呼ばれます。変数の型と値が衝突した時に発生する仕組みです。数字しか入らないはずの箱を想像してみてください。そこに無理やり「あいうえお」という文字を詰め込むイメージです。マクロは真面目なので、少しでもルールが違うと混乱して止まってしまいます。まずは「デバッグ」ボタンを押して、黄色く光っている行を特定してください。そこが、VBAが悲鳴を上げている場所です。

私のケースでは、この原因の特定だけで2時間ほどかかってしまいました。

変数の型とエラー回避

次に確認すべきは、コードの冒頭で行っている「Dim」による変数宣言です。「As Integer」や「As Long」と書いている場合を考えます。このとき、その変数には数字しか入れることができません。もしセルから取得した値に文字が含まれていると危険です。誤って「単位」などが入ると、たちまち型が一致しなくなります。

VBAのコード編集画面で、Dim宣言部分とエラー行を並べて表示している。エラー行

在庫数をカウントする変数にセルの値を代入する状況を想像します。そのセルに「10個」と入力されていたらエラーの発生です。VBAにとっては「10」は数値ですが、「10個」はただの文字列だからです。Integer型という整数を扱う型は、数値の範囲が決まっています。あまりに大きな数値を代入してもエラー13になる仕様です。

変数の型、確認と対処

そこで、まずは変数の型を見直してみてください。数値の場所に文字列が紛れ込む可能性も考えられます。その場合は型を「Variant」に変えるのも一つの手です。何でも入る便利な型として活用できます。入力側のデータを清掃して数値だけにするのが本来の王道です。それでも、実務においては例外がつきものと言えます。自分がどんな箱を用意したのかを再確認します。そこに何を入れようとしているのか、一行ずつ照らし合わせてみましょう。

ここで一度立ち止まって考えてみてください

Pythonや自動化スキルを体系的に習得して、ITエンジニアとしてのキャリアを切り開きたい方には「Enjoy Tech!(エンジョイテック)」が選択肢のひとつです。現役エンジニアのサポートで、未経験から実践的なスキルを身につけられます。

プログラミングスクール Enjoy Tech!(エンジョイテック) →

戻り値の型不一致エラーとVariant型での回避

自分で作ったFunction関数を使う場面もあるでしょう。VBA標準の関数を使う時にも同様に注意が必要です。関数の「戻り値」が何であるかを正確に把握してください。ここを曖昧にすると、受け取る側の変数とケンカをしてしまいます。計算結果を数値で返すはずの関数を例に挙げます。エラー時に「見つかりません」という文字を返していたらどうでしょうか。

Function関数の定義部分。戻り値の型がStringになっています。しかし受

具体的には、検索系の関数を使う際にこの問題がよく発生します。検索に成功すれば数値を返しますが、失敗するとエラー値を返します。このエラー値をそのまま数値型の変数に入れようとする人もいるでしょう。すると、型が一致しないというエラーでマクロが止まるのです。私は当初、この仕組みが全く理解できていませんでした。「関数の書き方が間違っているのか」と深く悩んでいた時期があります。

やがて、原因は関数そのものではないと気づきます。エラーが起きた時の「逃げ道」を作っていないことが問題でした。戻り値を一度Variant型の変数で受け取るように修正します。中身がエラーかどうかを判定させると、マクロは止まらなくなりました。関数の出口と変数の入り口が、同じ形をしているかどうかを確認することが大切です。

Set忘れで頻発するVBAエラー

セルを扱う「Range」や「Sheets」の操作にも注意を払います。これらの処理でも型のエラーは頻発するからです。よくあるミスは、セルの「中身」を取得したい場合に見られます。セルという「箱そのもの」を指定してしまうパターンです。VBAではオブジェクトの代入時に特定のルールが存在します。「Set」というキーワードが必須となるのです。

この「Set」忘れは、自分が振り返ってみても何度も繰り返してしまったミスでした。

もし「Set」を書かずにオブジェクトを代入しようとします。するとVBAは「中身専用の箱ではない」と怒ってエラーを出してくるのです。逆に、数値用の変数にセルそのものを入れようとしても、型が違うと言われます。初心者の頃の私には、この区別が全くつきませんでした。「Set」が必要な時と不要な時を見分けられなかったのです。

Setを使わずにRangeを代入しようとしてエラーが出ているコード。右側にローカ

Range変数の型と.Value明示

特定のセル範囲を変数に入れて使い回す場面を思い浮かべます。このような状況で、このミスが非常によく起こるのです。代入する側の変数宣言も正しく行われているか見直します。「As Range」となっているか、しっかり確認してください。セルの値を取得したい場合は、明示的に「.Value」と記述します。この癖をつけることで、無用な混乱を防ぐことができるでしょう。省略しても動くことが多いですが、型を意識する上では省略しない方が安全です。

見た目と違う!日付・数値データの罠

実は、私が一番長く苦しめられたのが「見た目」に騙されるパターンでした。Excelのシート上で「2024/05/20」と表示されるデータがあります。日付に見えていても、実際にはただの文字列というケースが存在するのです。これを「As Date」で宣言した日付型の変数に入れようとします。すると、エラー13が容赦なく襲ってくる仕組みです。

CSVから読み込んだデータが原因となることもあります。「日付っぽく見える文字列」が実は文字列型のままだったという経験です。地味で非常に気づきにくい原因でした。見た目は日付なのに、VBAがどうしても日付として認識してくれません。1時間以上もコードを書き直しては実行する作業を繰り返す羽目になります。最終的に、CDate関数を使って強制的に変換したことで解決しました。

外部システムから出力されたCSVファイルを扱うことも多いはずです。ウェブからコピーしたデータにも注意を払う必要があります。これらには「隠れた文字」や「特殊な形式」が含まれがちだからです。数字の前に目に見えない空白が入っていることもあります。全角文字が少し混じっているだけでも問題が起きます。VBAはそれだけでデータ形式を数値とは認めてくれないのです。

セルの書式設定が「文字列」になっており、数値が左寄せで表示されている画面。日本語

型宣言一時解除で犯人探し

そんな時に役立つ「禁断のテクニック」を紹介します。一時的にDim宣言を無効化するという大胆な方法です。変数の後ろに書かれた「As Integer」などの型指定に注目します。これをコメントアウトするか、思い切って削除してみるのです。こうすることで、VBAの挙動に変化が生まれます。自動的に変数を「Variant」として扱うようになります。

原因がどこにあるのか全く分からない日がありました。関係ないコードまで片っ端から確認して時間を浪費した経験です。一箇所直せば別の場所でエラーが出る泥沼にはまります。その日は深夜まで残業する羽目になってしまいました。結局、いったん変数宣言をすべてVariantに変えてみたのです。すると、どこで型が変換されているのかが手に取るように分かります。おかげで翌朝にはスッキリと問題を解決することができました。

もちろん、これは最終的な解決策ではなく、あくまで「犯人探し」のための手段です。型指定を外してマクロが動くようになった後の手順を説明します。その変数が「実際にはどんな型か」をローカルウィンドウで観察するのです。すると、「ここで急に文字列に変わっている」と気づく瞬間が訪れます。デバッグ作業において、意外な事実が見つかることはよくあります。

VBAのローカルウィンドウの画面です。変数の「型」の列にVariant/Stri

型意識の重要性とエラー激減・強いマクロ

型のエラーに何度も泣かされてきた過去があります。しかし今では、それがVBAからの「親切な警告」だと思えるのです。以前は「動けばいい」と考えて適当に書いていました。しかしそれでは、データが少し変わっただけで止まってしまいます。型を厳密に意識することの重要性に気づくことができました。それはどんなデータにも動じない「強いマクロ」を作る第一歩です。

型を意識する前と比べると、デバッグにかかる時間がかなり短くなった実感があります。

具体的には、宣言の際に自問自答する癖をつけます。「この変数には何を入れるのか」と最初に考えるようになりました。もし文字列と数値が混ざる可能性があるなら、あらかじめ例外処理を入れておきます。このように事前の準備をしっかりと整えておきます。すると不思議なことに、あんなに頻発したエラー13が激減しました。今では日常業務の中でほとんど出なくなったのです。

マクロエラー解決4つのポイント

たとえ出たとしても、もう焦ることはありません。「中身と箱のサイズが違った」と気づき、数分で直せるようになります。マクロが止まるのは、決してあなたが悪いわけではありません。単にデータのやり取りで小さな「翻訳ミス」が起きているだけなのです。今回紹介した4つのポイントを順番に確認してください。そうすれば、必ず解決の糸口が見つかるはずです。

無料プレゼント

Excel業務を自動化する前に確認するチェックリスト(PDF)

自動化していい作業かどうか、VBAかPythonか、最初に避けるべき落とし穴。実務でよく迷うポイントを1枚にまとめました。メールアドレスだけで受け取れます。

無料でチェックリストを受け取る

¥980 ミニキット

コピペで動かせる3スクリプト+自動化チェックリスト

最新ファイルの自動選択・部署名ゆれの正規化・CSV文字コード確認の3本セット。今週の作業を1つだけ楽にするための最小キットです。

ミニキットを見る(¥980)

関連リンクとチェックリスト

関連書籍

Excel・VBA関連書籍を、手元で見返せる形にしておきたい場合

ExcelやVBAのトラブルは、基本の考え方をあとから見返せるだけでかなり楽になります。手元に1冊置いておくと、同じエラーで止まったときに確認しやすいです。

Excel・VBA関連書籍をAmazonで探す

学習サービスとアンケート

このスキルを活かしてさらに前へ進むなら

PythonやExcel自動化スキルを持ったまま、ITエンジニアとして転職したい方には「EBAエデュケーション」が選択肢です。企業が求めるエンジニア像に合わせたカリキュラムで、実務直結のスキルを習得できます。

ITエンジニア転職・EBAエデュケーション →

[アンケート] この記事は役に立ちましたか?


1問だけ回答する