- 言われたとおりにやっただけのExcelマクロがエラー、動かないときに何をどうすればよいか
言われたとおりにやっただけのExcelマクロがエラー、動かないときに何をどうすればよいか
「今まで動いていたExcelのマクロが突然エラーになった!」
現場で、ただただ指示通りにやっていたスタッフの方々にとっては、大きな焦りや困りごとになっていると思います。
そういうときに限って、マクロを作った人はもうおらず、「そこを何とかやってくれないか」、と上司の指示。
テンパる寸前の方もおられるかもしれません。
今回のテーマは相当に広大です。
エラーには実に色々なケースがあります。いえ、ありすぎます。
マクロ(VBA)の技術的なことは、広すぎて説明するのが難しくです。
しかしながら、今回は「今まではエラーがなく動いていた」ということを前提に、マクロ作成が未経験の方でもできそうな点について説明していきたいと思います。
突っ込んだ言い方をすると、当ページでは、プログラムを触らずに治せるかもしれない、という部分を探っていきます。
マクロそのものを直すのではなく、マクロで使用した「ファイル・データ」を疑う
当ページでの説明は、マクロ(プログラムコード)自体を修正することを目的としていません。
以下にも書いていますが、「今まで動いていたマクロが突然エラーになった」ことが前提です。
マクロ(プログラム)自体の問題を疑うよりも、そのマクロで使っていたファイルやデータの内容について原因があるかもしれないという点を探っていきます。
そのため、「エラーが発生しなかったときのファイルやデータが手元にある」と比べやすくなり、原因を特定しやすくなる可能性があります。
マクロエラーを確認する前の「前提条件」とは
上記でも触れていますが、前提としては、マクロは「今までは通常通り動いていた」です。
そして、それがどういうわけか突然エラーが発生したということが前提です。
というか、マクロを作った当初からエラーが発生しているのならば、そもそも「その場で作った人が解決しているはず」ですよね。
(つまり、この前提条件は「無茶を言っているわけではない」・・つもりです)
つまり、エラーはプログラム自体の問題ではなく、「プログラムの外に問題がある」と考えることができます。
むしろ、「問題なく動いていたのが偶然で、エラーは必然だった」というトンデモなこともありえます。
この場合は原因がわかっても、その(考慮漏れ)箇所を含めてプログラムを修正してもらう必要がありそうです。
当ページでのエラーとは「実行時エラー」を対象にしています。エラーにはいくつか種類がありますが、この「実行時エラー」は、いわゆる構文・文法エラーになります。
マクロの実行で上記のエラーが発生したときに何をするべきかについて説明します。
いずれにしましても、今回の内容で絶対譲れないポイントは「マクロは今までは通常通り動いていた」です。
マクロの内容もおおまかに知っておく
みなさんのお使いのマクロがどのような動きをしているのか、ざっくりとでも良いので思い返してみてください。
これは原因を探す際の大きなきっかけになります。
マクロの作業は大きく3つに分けられると思います。
少し専門的にいうと、「入力」→「加工」→「出力」です。
以下の画像は、マクロで何をしているのか・・「マクロ処理」のイメージです。
もちろん3点セットでなく、「入力」だけのマクロもありますし、「加工と出力」だけのマクロかもしれません。あるいは、「入力と加工を兼ねている」ようなマクロもあります。
ここは、対象となる作業内容や、マクロの作り手依存の箇所でもありますので、「一概には言い切れない」ということを含めて確認してみてください。
ただ、たとえば3点セットの場合で、「入力」でエラーが起こっているならば、「加工」と「出力」は、今回のエラー調査の「対象の外に追いやる」ことができます。
正常な箇所と異常な箇所の線引きですね。
このように問題の切り分けを行うことで、エラーの発生源や原因を絞り込んでいきます。
そして、関係ありそうな部分に的を絞って比較していきます。
マクロが使用しているファイルやデータを比べる
エラーが発生したときのファイルやデータと、エラーが発生しなかったときのファイルやデータを比較します。
繰り返しますが、今までエラーが発生していないのであれば、マクロ自体に問題があったとは考えにくいわけです。
では、どこに問題があったのか・・それは「マクロが使うファイルやデータに問題があった」可能性があります。
料理で言えば、「作り方は間違っておらず、そもそも材料が間違っていた」イメージです。
このようなイメージに倣い、「問題ファイルや問題データがなかったか」を探します。
そのため、そもそも正しく動いていたときのファイルやデータがあると比較しやすく発見しやすくなります。
比べるときにはエラーが発生しなかったときの「状況」も含める
エラー内容にもよるのですが、ファイルやデータ以外にも注意するに値する点として、「マクロを実行したときの状況」も挙げられます。
たとえば、うまいくったときは、マクロ実行するブックの他に「〇〇ブック」も合わせて(画面の裏側で)開いておく、などもあります。あるいは、さらに〇〇ブックの「□□シートを開いておく」などもあるかもしれません。
いわゆる「マクロ実行前の準備」にあたります。
「準備には何が必要なのか」は、マクロのプログラムコードを見れば分かりますが、それがわからない場合は、この辺りも気をつけて確認する作業が必要です。
具体的な例示は難しいため「当てはまりそうなところはすべて確認」を
マクロのエラーは実に多岐にわたります。いえ、無限に近いかもしれません。その一方で、エラー対策が施されたマクロもあります。
これらは、マクロを作った人のスキルや作法なども影響します。
当ページでは、具体的な例示もしますが、それに当てはまらないケースも多数あるはずです。
あるいは事前対策されているマクロでは、ここでエラーと言っている内容がエラーにならないケースさえ考えられます。
タフな作業になりますが、「エラーとなった考え方自体は棄てない」でみなさんの状況にうまく当てはめてみる必要もあります。
エラーの原因となるヒントを探す
マクロ実行後に表示されるエラー画面ですが、ここで確認すべきは、その「エラーのメッセージ」とエラーが表示される「後ろの画面」です。
英字がズラズラと書き綴られ、ある箇所が黄色で表示される画面です。
エラーが発生すると、最初に、エラーのメッセージ画面が表示されます。
※エラーの内容は様々です。上記のメッセージは一例です。
そして上記の「デバッグ」ボタンをクリックすると、実際にエラーになった箇所が黄色でハイライトされています。
エラーメッセージには「内容がゆるい」ことが(わりと)ある
エラーが発生したらまずは「メッセージを見て」ください。このメッセージは「エラーの原因そのものを指摘している場合がある」のですね。このケースならば解決への道筋がつけられると思います。
たとえば、上記のように「ABCファイルが見つからない」と教えてくれています。
これは文字通り、「マクロがこのファイルを見つけられないから、マクロが先に進めないよ」ということを教えてくれています。
仮にこのエラーメッセージに対応するならば、この名前のファイルをマクロブックのある場所に格納すれば解決するものと思います。
一方、意味のわからないだろうメッセージが表示されることもあります。
「アプリケーション定義またはオブジェクト定義のエラーです」
こういったメッセージでは、見ただけではわからないので、メッセージの解読はスキップでよいと思います。
注意点として、エラーメッセージたちは、異なるエラーであっても、同じメッセージが表示されることもよくあります。
※上記のエラー番号「1004」もゆるさメッセージの定番に思います。
ネット検索で同じエラー番号、エラーメッセージでヒットしても、そこに出ている解決方法は別の内容のエラーで表示されたメッセージかもしれません。そのため深追いしても時間ばかり経過することになりかねません。したがいまして、エラー周りの内容を見つつ精査せねばならないこの点にはご注意です。
「エラーの発生箇所」についても(ざっくりでも)確認を
実行時エラー画面の「デバッグ」ボタンをクリックしてエラーメッセージを消すと、今度はプログラムの編集画面が表示されます。
そして、ここで黄色になっている行があると思いますが、ここがまさに今エラーが発生した箇所になります。
ちなみにデバッグボタンが淡色表示でクリックできないときは、マクロにパスワードがかけられている状態です。この場合、残念ながらプログラム箇所を見ることはできません。
プログラムは上から下へ流れていきます。
そして、黄色の行がエラーになっているまさにその箇所です。「ここの箇所が原因でマクロが動かくなった」ということがわかります。
ただし、注意点として、エラーが発生したのはまさのその行ですが、しかし実際にはその前段の行で、すでにエラーの原因を作っている可能性もあります。
つまり、黄色の行に限らず、その黄色の行やその前後(特に前[上]の行)を多少目で追ってみてください。
また、開発者が書いた「コメント」などが近くあれば、それも参考にできます。
コメントとは、「プログラムが何をしているのか」の概要です。
ただし、作り手によって内容に差(大雑把すぎる)があることや、コメント文自体の内容が古いままで実際に動いているプログラム内容と異なるケースもよくありますので、ここも参考程度にです。
ゆるい・・しかし当てはまるエラー内容について
さきほど、ピンポイントに教えてくれるエラーもありますが、「異なるエラーであっても、同じメッセージが表示される」とお話しました。
しかし、エラーメッセージによってはゆるいですが、ある程度原因を絞れるエラーメッセージもあります。
以下は、私の経験則です。当てはまるエラーがあれば、みなさんのマクロのエラーにも当てはまるか参考にしてみてください。
インデックスが有効範囲にありません
これは、「名前が見つからない」ケースでのエラーメッセージの可能性があります。
ブックの名前、シートの名前など今まで動いていたときと比べてどのようになっているか確認してみてください。
オーバーフローしました
かんたんにいうとマクロが準備していたキャパを超えてしまった状態(エラー)です。
たとえば、今まで動いていたときと比べ、エラー発生時の表の行数が異常に多いなどが考えられます。
あるいは、セルの数値で「百万円単位」で書くべきところを「円単位」で入力しているなどです。
型が一致しません
これは、数値のセルのはずが、文字のセルに変わっているなどが考えられます。
たとえば、ゼロで埋めている数値が、そのままの状態でセルに入力されていれば、それは数字ではなく「文字(列)」としてマクロは判断しエラーが発生するケースです。
エラーがあったときと、エラーがなかったときのファイルやデータの状況を比べる
以降が当ページの本題にもなりますが、「エラーがあったとき」と「エラーがなかったとき」の「どこが違うのか」を探っていきます。
さらに可能であれば、上記で説明した「エラーの内容の中身」なども頭に残しつつ確認してみてください。
ここで気をつけるべき点は、例示している内容はあくまでも「一例」であるということですね。
つまり、「一言一句」、「画面内容」などなど・・これらがみなさんの持っているマクロファイルと同じであることはほぼ皆無です。
マクロは、本当に実直に作業(処理)をします。それは同時に融通が効きませんと言えてしまいますので、ご注意ください。
あくまでも私の経験上ですが、「今まで動いていた」ということは、複雑怪奇な問題でエラーが発生する、ということは考えにくい部分でもあります。
つまり、よく見たらあるある?だったようなエラーの可能性もありえますし、そうであってほしいところですね。
外部ファイルやパスの書き方について
よくあるケースで、マクロブックの外にあるファイルを読み込みます。
エラーが発生しなかったときのファイルがあればこの部分から比べてみてください。
※「読み込み」と「出力」については、しばしば「インポート」、「エクスポート」とも表現されます
フォルダのパスを書くケースでは「¥」マークまで書くのか、フルパスで書くのかなども注意です。
ここの箇所に限定した話ではありませんが、「全角と半角」、「空白文字有無」など気づきにくいケースが原因でエラーが発生している可能性もあります。
しんどいですがこの辺りも確認ですね。
読み込む(書き出す)ファイルの種類
たとえば、このときマクロでは、CSVファイルを待っているのにも関わらず、Excelファイルを準備しているなども要確認です。
アイコンの違いはExcelのバージョン、Windowsの設定によっても変わります。見慣れていないと分かりづらいかもしれませんので確認を。
隣のシートから読み込む場合も注意
たとえば、シートの名前が、「マクロが指定する名前ではない → 変更前のシート名が見つからない」なども起こり得るエラーとしてありです。
「もっとわかりやすいシートの名前に変えよう」などと気を利かせたつもりでも、それがマクロで指定しているシートの名前と変わってしまい、シートが見つからないというエラーです。
※名前を変えるならば、マクロに伝えなければなりません。仮に上記の例でいうと、それは「プログラムを修正する」作業となります。
上記シート名のように、マクロに対して「見ればわかる」は通じません。たとえば、職場で「取引先」と「顧客」が同じ意味で混在、使用されていたとしても、人が見るとそれぞれ「同じ意味のこと言っている」と理解できるかもしれません。
しかし、マクロではそうはいかないのですね。
(作り込み方次第ですが、)一般的には、「取引先」のセルに「顧客」と入力されているとマクロは、それ(取引先)を見つけることができずエラーになります。これは、「西暦と和暦」、送り仮名のつけかた「取引」と「取り引き」など至ることで当てはまります。
つまり、みなさんがマクロを実行する前の段階で何かを従来にないルールで書き変えているとエラーになる可能性があります。
「データ・値」の内容について
あるあるのケースだと思いますが、データの内容についても「フォーマット・書式」が原因のケースもあります。エラーが発生していないときと比べてみます。
たとえば、以下のシート名は、人の目で見れば同じ意味と分かりますが、マクロは別物として扱います。
マクロ側で準備している書式がどれかにより、その書式が当てはまらないとエラーが発生するケースです。
繰り返しますが、マクロに対して「見ればわかる」は通じません。恐らくほとんどのケースでは、あらかじめ指定したフォーマットや文字でないとマクロはエラーになります。
マクロが「指定する箇所、使う箇所」などに対しては書式も要注意です。
データ(セル・表)の位置、大きさ
たとえば、ある表のデータを加工するマクロの場合、その表の位置や大きさにも注意です。
行列が入れ替わってしまったことによりエラーが発生していないかです。
本来は「A1開始」から開始するものが、エラーが発生した表は「B2開始」になっていないかです。
書式が変わっている
書式が原因ならば、非常に分かりづらい部分です。
注意深い確認が必要です。
上記のように、ついつい見た目表記につられて?「マクロが準備している入力桁数」になってないケースです。セルの書式設定は、ほぼ自在に見た目を変えられます。
数式バーで実際に入力されている値を確認します。
書式でもう一つ例を示します。
セルに表示される位置で判断できますが、この位置も設定でイジれます。マクロがどっちで対応しているかにより、もう一方はエラーになるケースです。
エラーが発生する原因は他にもまだまだあります。
エラーが発生しなかったときのファイルやデータを比べることで、できるだけ効率的な発見を試みてください。
意外な部分で発生するエラー
その他に考えられそうなエラーもたくさんあります。
この辺りのエラーになると、「エラーにならなかったときのファイルとの比較」ではないため、発見が難しくなりますが紹介します。
実行中にExcelに触ると発生するエラー
これは、プログラム自体を見なければなりません。
プログラムを見たときに、以下のようなコードが使われているのを見かけたら、エラーが発生する「可能性」はあります(状況次第でエラーになりえます)。
「Active〇〇○」
○の部分に入るのは
「ActiveWorkBook」、「ActiveSheet」、「ActiveCell」などがあります。
あるいは、「〇〇.Select」で終わるコードなども同様です。
上記のコードが使用されているケースでは、うまくいくときとうまくいかないときが起こりえます。
理由についての詳細は割愛しますが、もしエラーが発生したマクロに上記のコードがあれば、「マクロ実行直後から終了するまで」の間、キーボードとマウスから手を離しておくことをすすめます。
またキーボードなどから手を離すことと直結しませんが、このケースでは別の理由からマクロ実行前に準備しておくべきファイル等の状況も要確認です。
処理が終わりきってないのに次の手動作業を無理やり始めるエラー
マクロによっては「処理の終わりを告げてくれない」ものもあります。
終わりを告げないケースは、Excelが静かになっても、マクロは終わったかどうかがわかりません。判断する方法は専門的でかつ不確実でも有ります。したがいここでは対策としては「注意深く見守る」しかないと思います。
処理が遅くなるなどでタイミングがずれるエラー
よくあるケースではIE(Internet Explorer)との連携処理や、他のアプリと連動するような処理に起こるエラーです。
うまくいくときとうまくいかないときがあります。
確認点としては、関係ないアプリなどを終了させておくことや、PCを再起動して試します。
プログラム自体の修正リスク
マクロは「今まで動いていた」が前提です。従いまして、プログラム(コード)を修正することは、むしろ不自然であることも考慮したほうがよいと思います(例外ももちろんありますが・・)。
また、発生したエラーを強制的にスキップ(無視)をさせる処理もできます。こうするとエラーになっても、通常はそこをスルーして次の処理に移ります。
しかし、これを安易に行うことは、全くおすすめできないやり方です。
なぜならば通常は、エラーを飛ばしても良い箇所と、飛ばすとおかしくなる箇所があるからです。
どこが良くて、どこがダメなのか、これは完全に処理の内容次第です。
その把握をする前に単純にスキップさせるのは危険この上ない話と思います。
ご注意ください。
マクロ作成未経験者の検索「VBA エラー 1004」はキツい(と思う)
仮にリスクを承知で修正するにしても、マクロ未経験の方にとって、マクロで表示されるエラーの内容をネットで検索し、「プログラム(マクロ)を修正する」ということは、ほぼ無理だろうと思います。
なお、繰り返しますが当ページでの説明では、「今まではエラーが発生しなかった」ことが前提です。したがいまして、このようなプログラムの修正は不要という理屈です。
事前対策は「管理者の責任」でやる
エラーが発生し困った状況になった時点ですでに遅しですが、そもそもこうならないように事前に対策を考えておくことは「管理者の役割」だと思います。
「プログラムはよくわからないけど、作ったマクロが動くならどんどん使おうよ!」
この考えでは、足らない点が多いと思います。
作業をマクロ化させると、作業が秒殺ということもよくあります。圧倒的に高速で効率的です。
しかし、「マクロ化」させると、そのマクロがどんな作業を行っているのかが一気に「ブラックボックス化」します。
そうなっても最低限対処できるように、たとえば・・
- マクロでエラーが発生したとき、手動作業に戻せるような手順書を用意しておく
- マクロ開発者がいなくなったあと、使い続けるなら誰がメンテナンスをするのか
などは考えておかなければならない点だと思います。
こういったことは管理者の責任でやらなければならないと思います。現場では困るだけになります。
当ページをご覧になっている方は、今まさに困っている現場の方だと思います。
一息つける場面が作れましたらこのようなことを上司の方に提案してみることもおすすめします。