【EXCEL VBA】処理速度アップの基本を紹介!
「VBAを使って効率アップを図りたい」と考えている、SE・プログラマーではない方、
会社の事務処理担当者の方、VBAツールを今まさに開発中という方、せっかく作った
マクロツールの処理が遅くて時間がかかりすぎて困ってるなど、マクロの処理速度ア
ップを図るための基本を紹介いたします。
Select・Activateメソッドを省略
まず、「メソッド」って何?という疑問への回答ですが、「メソッド」というのは「オブジェクトを操作するための命令文」です。
それぞれの説明としては下記となります。
Select・・・指定したセルなどのオブジェクトを選択。セル範囲を選択することもできます。
Activate・・・指定したセルなどのオブジェクトをアクティブにする。
と、簡単に説明しましたが、これだけでは「何が違うの?」という疑問があると思います。
もっと簡単に説明すると、「Selectは選択範囲」「Activateは現在のセル」ということになります。
また、これ以外にも「対象となるオブジェクトが違う」という違いもありますが、ココでは、
「Select・Activateメソッド」を省略する書き方とその理由を説明します。
「マクロの記録」の機能を使うと「Select・Selection・Activate」などがよく出てきます。
これらは「必ず必要になるコード」ではなく、「手を動かした一連の動きを記録したから出てくる
コード」となります。
例えば、
Range(“A1”).Select
Selection.Copy
→ これは「Range(“A1”).Copy」と書くことができます。
また、
WorkSheets(“Sheet1”).Activate
Activesheet.Range(“C1”).Select
Selection.Copy
→ これは「WorkSheets(“Sheet1”).Range(“C1”).Copy」と書くことができます。
これだけを見ると「たいして変わらないでしょ」と思うかもしれませんが、同じようなコードが
複数書いてあるだけで、コードが読みにくくなりますし、不要な行を1行にまとめることによって
「1行分、処理が減る」ことになり、また、セルやシート・ブックを選択するというだけで、いち
いち負荷がかかりますので、少しでもそういった負荷は減らした方が処理速度向上につながります。(塵も積もれば・・・というヤツです)
上記のことから、SelectメソッドやActivateメソッドを使用する必要はなく、値を変更したりコ
ピーしたりするなど、変更対象となるシートやセルがアクティブでなくても、オブジェクトの操
作・変更はできます。
(複数のシート・複数のブックを対象とする場合も、Select・Activateは基本使いません)
画面更新の抑止
マクロを実行中だったとしても、常に画面の更新を行っています。
例えば、Book1.xlsxがアクティブになっている状態でBook2.xlsxを選択すると、Book2.xlsxに
画面が切り替わります。
これが画面更新です。
この画面更新を行うということは、そのための処理を実行していることになりますので、VBAの
プログラムが実行されている間に割込んで実行されている状態です。
最初に記載したSelectやActivateメソッドなどを多用したプログラムは、その都度画面更新を行
います。
これが処理として負荷がかかってしまい、処理速度が遅くなってしまうことにつながっていきます。
画面の更新を抑止するためには下記コードを「画面更新を止めておきたい処理の前の行」に書く必要があります。
Application.ScreenUpdating = False
このままでは、マクロの実行が終わった後も画面の更新が抑止されたままになってしまうので、最後に下記コードを書きます。
Application.ScreenUpdating = True
自動計算を手動計算に切り替える
エクセルの設定が「自動計算」になっていると、下記の場合に自動計算が行われます。
・セルの値が変更されたとき
・セルの数式が変更されたとき
(上記以外にも自動計算されることがありますが、ここでは割愛致します)
エクセルの自動計算はマクロを実行中でも行われます。
数式を多く使用していると、それだけでマクロの処理速度が遅くなってしまいます。
マクロの実行でほしい結果は、基本的には、「マクロ実行終了後の状態で計算された結果」だと思います。
この場合は、エクセルの自動計算を「手動」に切り替えて、マクロ実行の終了直前に「自動計算」に切替ることで、「マクロ実行終了後の状態で計算された結果」を得られ、マクロの処理速度を上げることができます。
▼計算方法を手動に切り替える
Application.Calculation = xlCalculationManual
▼計算方法を児童に切り替える
Application.Calculation = xlCalculationAutomatic
▼計算方法手動のまま、再計算を実行する
Application.Calculate
まとめ
Select・Activateメソッドを使用しない書き方、画面更新を抑止して処理を減らす方法、自動計算を
手動計算に切替て処理速度を上げる方法を紹介してきました。こういった小さなことから気にしてい
くことで、処理速度の向上が見込めます。
これ以外にも、処理速度とはまた別の話にはなりますが、「コードを見やすくするためにタブや改行
を入れる」ということも、後々修正するときに重要になってきますし、1つのプロシージャの中にず
らずらとコードを書くのではなく、関数を作成したり、別のSubを作成して、処理によってプロシー
ジャを分けたりすることで、冗長にならない、すっきりしたコードの作成や組み立てをすることが大
切だと思います。
最新記事 by SR人事メディア編集部 (全て見る)
公開日: