【VBA入門編 ④】エラーだって怖くない!(初心者向け)

Excel VBA VBA入門編

【VBA入門編 ④】エラーだって怖くない!(初心者向け)

【VBA入門編 記事一覧】
第1回 VBAで仕事がラクになる?
第2回 マクロは誰にでも作れる!
第3回 VBAを書いてみよう!
第4回 エラーだって怖くない!←イマココ

プログラミングにエラーはつきものです。それはVBAも同様。エラーが出ても慌てなくて大丈夫!VBA入門編最後はエラーの種類やどのように対処しているかざっくり説明します。
目次

エラーの種類

コンパイルエラー(構文エラー)

  1. 記述エラー
    コードの入力中に発生するエラーです。VBEには自動構文チェック機能が備わっているため、記述が不完全な状態で次の行に移動した場合、エラーメッセージの表示ともにエラーが発生した行が赤字に変化します。
    • 「“」や「()」が不足した状態で[Enter]を押した。
    • IF文の条件式にThenを記入せずに[Enter]を押した。


    • 文法エラー
      マクロ実行前にコンパイルを行うことによって確認することができるエラーです。打ち間違いはないけれど、文法的な誤りによって発生します。
      • 変数の宣言を強制しているのに、宣言をせずに変数を使った。
      • For文に対する「Next」やIF文に対する「End If」を記述していない。

    【コンパイルを行う方法】
    [デバッグ]メニューの[VBAProjectのコンパイル]をクリック

    実行時エラー

    マクロ実行後に発生するエラー。宣言したデータ型と格納されている値の種類が違ったり、コードに間違いはないが、操作対象のブックやシートが存在しなかったりした時に起こります。

    【.Activateはおまじない】
    RangeとCellsを併用してセルの特定を行うときに起こしやすいエラーがあります。
    「Sheets(1).Range(Cells(1,1),Cells(3,3))」のようにCellsに対するシートの指定を省略するとアクティブシートが指定されるため、「Rangeに対して指定したシート」と「アクティブになっているシート」が異なる場合、セルの特定ができずにエラーが起きてしまいます。
    私はRangeに指定しているシートをアクティブにすることでエラーを解消していたので、長いこと『.Avtivate』をおまじないのように使用して対処していました。本来であれば「Sheets(1).Range(Sheets(1).Cells(1,1),Sheets(1).Cells(3,3))」のように、Cellsに対してもシートの指定を行うのが良い方法です。この情報が今はなんのこっちゃという感じでも、いつか役に立つ日がくるかもしれません。ぜひ頭の片隅に入れておいてください!

    論理エラー

    コンパイルエラーや実行時エラーは発生していないが、意図した結果にならないエラーのことです。これはプログラムの組み立てや考え方に問題があるため、どの部分が間違っているのか特定や修正に一番時間がかかります。

    エラーが発生したら

    メッセージボックスを確認する

    実行時エラーが発生したときは下記のようなエラーメッセージが表示されます。

    エラーメッセージにはエラー番号(Err.Number)とエラー内容(Err.Description)が表示されます。よくあるエラーメッセージについて、こちらのサイトで分かりやすく解説されています。私もよくお世話になるサイトです。

    通常、エラーが発生するとマクロは中断され一時停止状態になります。ダイアログボックスの[終了]ボタンを押すとそれ以降の処理が行われずマクロが終了し、[デバッグ]ボタンを押すとVBEが中断モードで起動します。中断モード中、エラーの原因となっている行が黄色く反転して表示されるので、エラーメッセージと合わせてエラーの原因をつきとめます。

    デバッグを行う

    エラーを解消する(=バグを取り除く)ことをデバッグといいます。デバッグ中に活躍するのがコードウィンドウの下にある「イミディエイトウィンドウ」「ローカルウィンドウ」「ウォッチウィンドウ」です。

    また、理論エラーの場合は自らエラーの原因となっている行を特定しなければなりません。任意のタイミングでマクロの実行を中断・一時停止させるために「ブレークポイント」や「Stopステートメント」を使用したり、「ステップイン」で処理を1行ずつ実行しながらエラーを探します。このようにVBEにはデバッグのための機能がたくさん用意されていますが、ここでは説明しきれないので改めて記事にする予定です。

    マクロが中断しないために

    エラー時の処理を記述しておく

    あらかじめ起こりうるであろうエラーを想定しておく”かもしれない運転”が大切です。
    〇〇を押すかもしれない。入力間違いがあるかもしれない。作成したい名前のファイルが既に存在しているかもしれない。そんなときはどうするか。を考えておく必要があります。
    そんなときに使えるコードをご紹介。使い方についても別記事で解説します。

    使用するコード コードの詳細
    On Error GoTo 行ラベル エラーが発生したら指定位置までワープする
    On Error Resume Next エラーが発生しても無視して処理を続ける
    On Error GoTo 0 エラー処理を無効化する

    データの種類を整える

    ある列に入力されている”数値”を操作するマクロを作ったけれど、その列に「入力形式が”文字列”になっている数字」が入力されている場合、エラーが起きてしまいます。

    • 数字の入力形式(数値/文字列)を合わせる
    • 英数字は全角と半角のどちらかに合わせる
    • 不要な空白を削除する

    などは入力時から統一できていることが理想ですが、こういった変換(置換)に要する操作もマクロにしてしまえば、ボタン一つで終わらせることができます。

    さいごに

    編集後記 ~VBA入門編~

    入門編はいかがだったでしょうか。1人でも多くの方に「VBAやってみようかな」と思っていただけたなら嬉しいです。私が入門編を通じてみなさんにお伝えしたいのはこの4つ。

    1. マクロとは何か
    2. マクロをどうやって作っているか
    3. VBAをどこに書いているか
    4. エラーが出たらどんなことをしているか

    あくまでもエクセルマクロ・Excel VBAの概要だけで、具体的なVBAのコードに関しては基礎のキの字もお伝えできていません。でも大丈夫。大事なのはコードの知識ではなく②の作り方の部分です。世の中にはVBAに関するブログやサイトが山ほどあるので、「Sub()」さえ書けたら後のコードなんてその時調べて知ればいいんです。そのためのキーワードは散りばめられたかなと思います。

    今までマクロの存在も知らなかった方々がVBAに興味を持ってくださり、マクロ作りに挑戦するきっかけになれたら嬉しいです。少しでも日々の業務がラクになるように、このブログでもコードに関する記事をどんどん増やしていくのでまた見に来てくださいね。


    自分の写真
    りり
    ここまで読んでくださったみなさん本当にありがとうございます!
    それでは良いVBAライフを~★


    QooQ