Excelマクロ(VBA)

初心者のVBAが遅い原因4つを紹介!Excelのセル参照を減らすための知識

Excelマクロ(VBA)
P.Man
P.Man

遅せぇマクロ組んで満足してんじゃねぇぞ!この記事読んでスキルアップだ!

Excelマクロはプログラム初心者が手軽に組める、便利なプログラミング言語です。C言語やJavaを扱った経験が無くても、Google検索だけで勉強でき、ある程度『動く』プログラムを開発できます。

しかし、ノンプログラマー(プログラムに精通してない人)が独学で書くコードは、処理が遅く、実用に耐えれないツールとなってしまいますね…。

そこで、この記事では初心者が作ったExcelマクロ(VBA)が遅くなる主な原因を、4つ紹介します。この4つを改善すれば、あなたのマクロもスマートに動きますよ!

初心者のExcelマクロ(VBA)が遅い原因4つ

pc

それでは、Excelマクロ初心者のプログラムが遅くなる原因を4つ紹介します。対策記事も用意したので、しっかり学習してください。習得すれば割とマクロが得意になりますよ。

画面更新が有効になっている

これは鉄板。Excelマクロを組む上での『常識』です。これを知らずに、Excelマクロが得意!なんて言うと恥をかきますよ。

P.Man
P.Man

皆知ってる事だぜ!お前も抜かりなくやれよ!

画面更新が有効な状態で、プログラムを実行すると、次の様に処理が進みます。

  1. プログラムを処理する
  2. 画面に結果を表示する

プログラムを1行処理する度に、「画面に結果を表示する」という『無駄な処理』をしているため、プログラムの処理速度が遅くなってしまうんですね。

対策方法はExcelマクロの画面更新を無効化し高速化しよう!初心者向けVBAの常識についての記事をご確認ください。

Excelのセル参照回数が多い

Excelマクロは『Excelのセルに値を書き込む処理』が苦手で、セルに値を書き込む回数が増えるだけで、処理が遅くなるんです。

P.Man
P.Man

ぐぅ…これは俺も気づくまでに時間がかかったんだ。早めに学べて良かったな!

Excelシートの値を直接参照せずに、Excelシート全体を配列に代入する事で、処理速度の改善が見込めます。

対策方法は、「【検証】Excelマクロ高速化!セルへの入力回数を減らせば早くなる」の記事をご確認ください。

Excelシートの関数を使っている

Excelマクロは、「vlookupu」や「countif」などExcel関数を手軽に使えるので、アルゴリズムの知見が無い素人でも、手軽にプログラムを組む事ができますね。

ただ、このExcel関数が処理を重くする原因になっているケースもあります。Excel関数と同じ機能を持つモジュールを、自分で作る事から初めてみましょう。

P.Man
P.Man

便利な機能に頼りっぱなしも良くねぇよな。

対策方法は、「【検証】ExcelマクロでVlookupを使うと遅い!辞書(Dictionary)で高速化しよう」の記事をご確認ください。

処理対象のExcelファイルが重い

処理対象のExcelファイル自体が重いと、Excelマクロも遅くなります。読み込みに時間がかかるので当たり前の事ですが…。主な原因は以下。

  • ファイルの容量が大きい(ファイルサイズが大きい)
  • 「条件付き書式」が多用されている
  • セルに数式が多い(再計算が処理を重くする)

プログラムの欠点を修正しても、改善されない場合は、自動化対象ファイルそのものを見直す必要がありますね。

P.Man
P.Man

この改善には、業務そのものを見直す必要があるぜ。

Excelのセル参照を減らすための知識

プログラマ

Excelマクロに慣れた人間はまず、Excelシートのセル参照回数が減るようなコードを書きましょう。そのためには、どうしても配列や辞書(Dictionary)の知識が必要になります。ここからは、Excelのセル参照回数を減らす為に、必要な知識を紹介します。

P.Man
P.Man

ノンプログラマーは必見だぜ!
(ちょっとコイツ俺に似てるな…。)

繰り返し(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マクロが使えるだけで事務職には、重宝されるので是非、この機会に学習しましょう。

コメント

タイトルとURLをコピーしました