遅せぇマクロ組んで満足してんじゃねぇぞ!この記事読んでスキルアップだ!
Excelマクロはプログラム初心者が手軽に組める、便利なプログラミング言語です。C言語やJavaを扱った経験が無くても、Google検索だけで勉強でき、ある程度『動く』プログラムを開発できます。
しかし、ノンプログラマー(プログラムに精通してない人)が独学で書くコードは、処理が遅く、実用に耐えれないツールとなってしまいますね…。
そこで、この記事では初心者が作ったExcelマクロ(VBA)が遅くなる主な原因を、4つ紹介します。この4つを改善すれば、あなたのマクロもスマートに動きますよ!
初心者のExcelマクロ(VBA)が遅い原因4つ
それでは、Excelマクロ初心者のプログラムが遅くなる原因を4つ紹介します。対策記事も用意したので、しっかり学習してください。習得すれば割とマクロが得意になりますよ。
画面更新が有効になっている
これは鉄板。Excelマクロを組む上での『常識』です。これを知らずに、Excelマクロが得意!なんて言うと恥をかきますよ。
皆知ってる事だぜ!お前も抜かりなくやれよ!
画面更新が有効な状態で、プログラムを実行すると、次の様に処理が進みます。
- プログラムを処理する
- 画面に結果を表示する
プログラムを1行処理する度に、「画面に結果を表示する」という『無駄な処理』をしているため、プログラムの処理速度が遅くなってしまうんですね。
対策方法は「Excelマクロの画面更新を無効化し高速化しよう!初心者向けVBAの常識について」の記事をご確認ください。
Excelのセル参照回数が多い
Excelマクロは『Excelのセルに値を書き込む処理』が苦手で、セルに値を書き込む回数が増えるだけで、処理が遅くなるんです。
ぐぅ…これは俺も気づくまでに時間がかかったんだ。早めに学べて良かったな!
Excelシートの値を直接参照せずに、Excelシート全体を配列に代入する事で、処理速度の改善が見込めます。
対策方法は、「【検証】Excelマクロ高速化!セルへの入力回数を減らせば早くなる」の記事をご確認ください。
Excelシートの関数を使っている
Excelマクロは、「vlookupu」や「countif」などExcel関数を手軽に使えるので、アルゴリズムの知見が無い素人でも、手軽にプログラムを組む事ができますね。
ただ、このExcel関数が処理を重くする原因になっているケースもあります。Excel関数と同じ機能を持つモジュールを、自分で作る事から初めてみましょう。
便利な機能に頼りっぱなしも良くねぇよな。
対策方法は、「【検証】ExcelマクロでVlookupを使うと遅い!辞書(Dictionary)で高速化しよう」の記事をご確認ください。
処理対象のExcelファイルが重い
処理対象のExcelファイル自体が重いと、Excelマクロも遅くなります。読み込みに時間がかかるので当たり前の事ですが…。主な原因は以下。
- ファイルの容量が大きい(ファイルサイズが大きい)
- 「条件付き書式」が多用されている
- セルに数式が多い(再計算が処理を重くする)
プログラムの欠点を修正しても、改善されない場合は、自動化対象ファイルそのものを見直す必要がありますね。
この改善には、業務そのものを見直す必要があるぜ。
Excelのセル参照を減らすための知識
Excelマクロに慣れた人間はまず、Excelシートのセル参照回数が減るようなコードを書きましょう。そのためには、どうしても配列や辞書(Dictionary)の知識が必要になります。ここからは、Excelのセル参照回数を減らす為に、必要な知識を紹介します。
ノンプログラマーは必見だぜ!
(ちょっとコイツ俺に似てるな…。)
繰り返し(for)
Excelマクロに関わらず、プログラミングを学ぶ上で避けては通れない処理です。世の中のプログラムは、『繰り返し(for)』と次に紹介する『条件分岐』で成り立っていると言っても、過言ではありません。
- 1行目~100行目まで繰り返す
- A列~C列まで繰り返す
このような、繰り返し処理を行う事ができます。
条件分岐(if / Select)
条件分岐は次のような処理で役に立ちます。
- もしセルA1が「2」ならセルB2を「5」にする
このような条件分岐をさせるのが、if文やselect文です。条件分岐もプログラミングの必須知識。この機会にマスタ―しておきましょう。
配列
配列を用いる事で、Excelシートを直接参照せずとも、処理が可能になります。処理の高速化や、読みやすいプログラムを作るうえでは欠かせない考え方です。配列も、他のプログラミング言語で使う概念なので、是非この機会にマスターしておきましょう。
辞書(Dictionary)
値が参照しやすくなった、配列と考えてください。
例えば、
- 社員番号:11111 氏名:田中
- 社員番号:22222 氏名:中村
- 社員番号:33333 氏名:八木
このようなデータが存在した場合、社員番号から一瞬で氏名を取得する事ができるのが、辞書(Dictionary)です。for文を使わないので、とても便利です。
列挙型変数(Enum)
Excelシートを処理するなら、列挙型変数は避けて通れません。列挙型変数を宣言しておくことで、コーディングスピードが改善されます。
例えば、A列~C列までの列の番地(列番号)を変数に代入する際、次のように記述しますよね。
Const col_EmpNo as Integer = 1 '社員番号の列(A) Const col_Name as Integer = 2 '氏名の列(B) Const col_Age as Integer = 3 '年齢の列(C)
Z列まで使われていると、これを24行記述しますね。ちょっと、メンドクサイです。しかも、入力ミスによりバグを作り込むのリスクも高まります。
ここで、列挙型配列の出番。列挙型配列なら次の様に宣言します。
Enum colEmp No = 1 '社員番号 Name = 2 '氏名 Age = 3 '年齢 end Enum
めっちゃ簡単ですよね。
まとめ
初心者が作ったExcelマクロが遅くなる原因は以下。
- 画面更新が有効になっている
- Excelのセル参照回数が多い
- Excelシートの関数を使っている
- 処理対象のExcelファイルが重い
これらを改善するだけで、劇的にExcelマクロの処理速度が向上します。
また、Excelのセル参照回数を減らすには、次のようなExcelマクロを作成する過程で、避けては通れない知識をマスターする必要があります。
- 繰り返し(for)
- 条件分岐(if / Select)
- 配列
- 辞書(Dictionary)
- 列挙型変数(Enum)
勉強するのは少し面倒かもしれませんが、Excelマクロが使えるだけで事務職には、重宝されるので是非、この機会に学習しましょう。
コメント