VBAを扱っていると、様々なエラーに遭遇する機会があると思います。
その中でも、「型が一致しません」というエラーについては、1度は見た経験がある人も多いのではないでしょうか。
VBAやその他のプログラミング言語においては、どんな場合でも変数を使うことは必須です。その中で、宣言された変数に型の合わない値を代入してしまいエラーになる、といったケースはよくあると思います。
今回の記事では、VBAでもよく起こるケースである型の不一致に関するエラーについて、原因や対処法などの具体的な内容を解説していきたいと思います。
実行時エラー「型が一致しません」とは?
VBAのコードを実行した際に発生する「実行時エラー13『型が一致しません。』」のエラーは、主に変数の型と異なる型の値を代入してしまったときに発生するエラーです。
例えば、以下のサンプルコードのような記述をするとエラーが起こります。
【サンプルコード】(実行するとエラーになります)
Sub sampleErr()
Dim age As Long
age = "20歳"
End Sub
数値を入れるLong型に文字列を入れてしまっているので、型が一致していません。
上記のようなミスをすることは稀かもしれませんが、VBAではセルの値を扱う場合が多いため、以下のようなケースでエラーが発生する可能性は少なくありません。
- セルの入力内容と指定した型に相違がある(数値で入力されるはずが文字列になっているなど)
- 指定するセルの範囲が間違っている
- セルが空のままになっている(指定した型として判定されていない)
特に、不特定多数の人が使用するファイルの場合はVBAを作成したひとが意図していない値がどこかに入力されていることもあり得るかと思いますので、事前の対応やエラーが起きた場合の対処法を覚えておくことが重要です。
エラーが発生した場合はどうする?
エラーが起きないようにする、あるいは起きた場合に対処する方法は様々ありますが、その内のいくつかを紹介していきます。
エラー番号で検索して対処法を調べる
VBAでエラーが発生した場合、表示されたメッセージにはエラー番号が載っています。
型が分かりやすいように変数の命名規則を決める
コードを見た時に一目で何の変数かが分かるように命名しておくと、管理が楽になりデータ型を間違えるようなミスも減らしやすくなります。
命名規則の1つとして、先頭の文字だけで型名が分かるような変数名にする方法があります。
ハンガリアン記法と呼ばれるもので、以下のような「型名+任意の変数名」という形式の命名規則です。
【ハンガリアン記法の例】
Dim intCount As Integer
Dim lngRowNo As Long
Dim strCellValue As String
基本的に、見ただけで何の値を格納しているのかが分かるようなきちんとした変数名をつけておけば、それだけで型を推測することはある程度可能です。
しかしながら、例えば「nameList」といった変数があった際に、配列なのか連想配列なのかが名前だけでは分からない…となったり、数値を入れる変数なのは分かってもどの型なのかまでは分からないといったケースもあります。
特に数値の場合、型ごとに入れられる数の大きさが変わるものの、数字であれば変数に代入することはできてしまうため、バグが発生しやすくなります。
型を詳細に分かるようにできる、意図せず不具合が起こる可能性を低くできるといった点で、ハンガリアン記法で命名することを推奨します。
変数の値・型の確認方法を覚えておく
変数の型に関しては、上記のように命名規則などを工夫することで事前に把握できますが、セルの値などは実際のデータを見てみなければ中身が分かりません。
変数やセルなどに代入されているデータを確認したい!という時、VBAにはイミディエイトウィンドウという便利な機能が存在します。この機能を利用することで、代入済みの値だけでなく、関数の結果やプロシージャ実行途中の値の内容まで即座に確認することができます。
イミディエイトウィンドウを表示するには、メニューの「表示」→「イミディエイトウィンドウ」をクリック、または Ctrl + G で表示できます。
イミディエイトウィンドウで値を確認する方法は2つあり、1つはウィンドウに直接コードを書く方法、もう1つはプロシージャ内に「Debug.Print」と記述する方法があります。
イミディエイトウィンドウに書く際は、次のように記述します。
Debug.Print 確認したい内容
もしくは
?確認したい内容
実際の例がこちらになります。
このエラーが出る原因は?
一例として、セルの値と変数の型が一致していないケースなどを紹介しましたが、その他にもいくつかのケースでエラーが発生する場合があります。
どのようなケースでエラーが起こるのか、順に見ていきましょう。
変数またはプロパティの型が正しくない
こちらは今までにも解説してきた通り、任意で宣言した変数や既存のプロパティが指定している型と、代入しようとした値の型が一致していない場合に起こるケースです。
先ほど挙げた例の他に、代入しようとした関数の返り値が変数の型と一致していない場合など、様々な要因があります。
プロシージャに渡した引数の型が間違っている
プロシージャ内に宣言した変数だけでなく、引数が必要なプロシージャに指定の型以外の値を渡した場合にもエラーが発生します。
引数に関しては、記述時にそれぞれ変数名と指定している型を表示してくれるので、渡す値が一致しているかを確認すると良いでしょう。
式が必要な箇所でモジュールやプロジェクトが呼び出された
例えば、イミディエイトウィンドウに値を表示するために、「Debug.Print」を記述したとします。この際、変数名や式などでなく、モジュール名などを指定してしまった場合に起こります。
【記述例】
Debug.Print MyModule
指定する内容を正しいものに修正することで、エラーを解消することができます。
Error関数の引数にCVErr関数の戻り値を指定した
エラーメッセージの表示に使うことのあるError関数ですが、CVErr関数と組み合わせて使おうとするとエラーが発生します。引数に数値を指定しなければいけないのに対し、CVErr関数で返却される値はVariant型だからです。
CVErr関数の戻り値を他のデータ型として扱いたい場合には、関数を利用して型変換を行う必要があります。
まとめ
エラーが発生すると、どう処理すればいいのか分からなくなってしまう時もあるかもしれません。慣れないうちは特に、原因の見つけ方や修正の仕方に戸惑ってしまうことも多いと思います。
そんな時は、ぜひこの記事を参考にしてみてくださいね。
関連記事
- VBAとは
- Excelで覚えておくべき17の基本関数と目的別逆引き一覧
- オートフィルターの設定・解除方法
- メッセージボックスの設定方法
- セルの値を取得・上書きするValueプロパティの使い方を解説
- 【Excel VBA】Functionの使い方を解説(宣言・引数、戻り値の指定、応用法)
- 【VBA入門】配列まとめ(宣言・初期化、反復処理、コピー、結合)
VBAの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、VBAに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。