2022/11/04
【4-20】VBAの処理速度を高速化する方法

【4-20】VBAの処理速度を高速化する方法

VBAでマクロ開発した処理の速度を高速化する方法を紹介します。

まずは処理時間・速度が遅くなる原因について考えます。
処理が遅くなる原因はほとんどの場合は以下の4つのいずれかに当てはまるかと思います。

それぞれについて詳しく解説します。




・Excelシートへの参照や書き込みが多い

処理の中でセルを参照している回数や書き込む回数が多いと処理時間がかかります。
その理由は、毎回セルに確認する必要があるからです。

例えば、セルA1からA3に「あ」という文字を入力してみます。

Range("A1").Value = "あ"
Range("A2").Value = "あ"
Range("A3").Value = "あ"

このように処理をすると、3回の出力命令を行っていることになります。

次のように記述することもできます。

Range("A1:A3").Value = "あ"

このように処理をすると、1回の出力命令で完了します。

要するに、なるべく少ない出力にした方が処理時間が早くなります。

他にも、セルの情報には背景色や枠線など多くの情報があります。
そのため、①のようにセルの情報を毎回参照するのではなく、②のように変数に入れてから設定するの方が処理速度が早くなります。

1回だけの処理の場合は大きく変わりませんが、繰り返し処理などで数万回と処理するとなると影響してきます。

そのため、複数のセルを操作する場合は、配列に格納して処理を行うことで処理速度を改善できます。
※配列についての説明は割愛します。





・ネストが深い(入れ子になっている)

「IF文の中にIF文、さらにその中にIF文」や「For文の中にFor文、さらにその中にFor文」などネストが深いと処理時間がかかります。
その理由は、単純に確認などの処理が増えてしまうためです。

IF文で例えると、①の場合だと、a~dすべてが0の場合、4回も確認作業をする必要があります。
それに対し、②の場合は1回の確認作業になります。※厳密には違います

これも、基本は「a=0」になる可能性が低い処理ならば、③のようにしても良いのですが、不規則の場合は②の方が良くなります。
※「a=0」が少ない場合は、初めのIF文のみで「ほとんどの場合にb、c、dの比較処理をしなくて済むためです

For文で例えると以下のような処理があるとします。

100回繰り返す処理の中に100回繰り返す処理があると、10000回の処理を行うことになります。
内側のFor文の数字が100から1000になれば、処理回数は900回増えるだけではなく、実際は90000回増えてしまいます。
処理の回数が増えれば増えるだけ処理に時間がかかるので、本当に必要な繰り返しなのかを考える必要があります。

次の①は無駄な処理になっています。
For文の中の、更にFor文の中のIF文に関して、本当にそこに必要なのでしょうか?
この場合は、i行目のA列に空白がなくても10000回繰り返されます。

それに対し②の場合は、内側のFor文を繰り返す前にIF文で絞っています。
この場合、i行目のA列に空白がなければ、繰り返しは100回しか行われません。

このような無駄な繰り返しを減らすことが処理の高速化のポイントになります。




Excel本紹介

・自動計算になっている ←ポイント

計算方法が自動(数式が自動で計算される)になっている場合は処理時間がかかります。

その理由は、セルを操作する度に数式の更新が行われるためになります。
セル上の数式の実行結果を使用したい場合にはできませんが、数式の実行結果の反映を処理後にしてよい場合は、手動にすることで処理速度を上げられます。

ただ、プログラムを実行する度に数式を手動に変換するのは大変です。
そんな時は、以下の内容を処理の前後に記述することで解決します。

「Application.Calculation = xlCalculationManual」で計算方法の設定を手動にしています。
処理が終了した後に「Application.Calculation = xlCalculationAutomatic」で自動に戻しています。

これだけで劇的に改善されることがあります。




・処理の度にシートを更新している ←ポイント

処理の内容をリアルタイムでExcelに反映していると処理時間がかかります。
その理由は、Excelに表示させるという動作が増えるためです。

長い処理などで途中経過を表示したいこともあるかと思いますが、基本的には処理が完了するまでExcelに反映する必要はないかと思います。

そんな時は、以下の内容を処理の前後に記述することで処理中の反映を止めることができます。

「Application.ScreenUpdating = False」で反映を止めて、「Application.ScreenUpdating = True」で戻しています。

次の処理だと動作のイメージしやすいです。

こちらはA1に「あ」と表示させた後に約5秒間停止して処理を終了するという内容です。
このコードの場合は、「Range(“A1”).Value = “あ”」が実行された時点でA1に「あ」と表示されます。

それに対し次のように書き換えると、5秒後の処理が終わるまで「あ」が表示されなくなります。




ExcelVBAレベル確認

以上が処理速度を早くする方法です。

以下の4つを紹介しました。

前半の2つは、いきなりはハードルが高いかもですが、後半の2つだけでも処理時間がかなり短縮されることがあるので、ぜひ試してみてください。
※後半の2つを同時に使用する例は以下になります

2022/10/05
【4-25】静的変数(Static)とは

【4-25】静的変数(Static)とは



YouTubeで開く

静的変数(Static)についてどのようなものなのかと、活用例を解説しています。
静的変数を活用することで、プロシージャの実行後にも変数の値を保持することができるため、色んなことに応用できます。

00:00 挨拶
00:15 静的変数(Static)とは
02:29 注意点
03:57 活用例
09:38 まとめ

2022/08/05
【4-24】ローカルウィンドウ・ウォッチウィンドウ

【4-24】ローカルウィンドウ・ウォッチウィンドウ



YouTubeで開く

ローカルウィンドウとウォッチウィンドウを用いたデバッグ方法について解説しています。
バグが見つかった際に、実行中の変数の中身を確認しながら調査する方法などについてメインで解説しています。

00:00 挨拶
00:06 主な使い道
00:38 ローカルウィンドウ(変数確認)
06:19 ウォッチウィンドウ(変数確認)
08:22 ウォッチウィンドウ(中断方法)
10:33 ステップイン・ステップオーバー・ステップアウト
16:06 まとめ

※動画内の参考動画は以下になります。
・Debug.Printの使い方
・受信メールの一覧を取得

2022/06/15
【4-23】各モジュールの違いと使い分け

【4-23】各モジュールの違いと使い分け



YouTubeで開く

VBAのモジュールには以下の5つがあります。
・標準モジュール
・ブックモジュール
・シートモジュール
・クラスモジュール
・フォームモジュール

これらの違いと使い分けについて解説しています。

00:00 挨拶
00:07 モジュールの種類
00:24 クラスモジュールとは
00:48 フォームモジュールとは
01:28 標準モジュールとは
06:51 ブックモジュールとは
12:23 シートモジュールとは
17:13 モジュールの使い分け
17:21 ブックモジュールの使い分け
17:46 シートモジュールの使い分け
18:17 標準モジュールの使い分け
18:43 まとめ

2022/02/12
【4-08】配列とは?基本的な使い方から応用

【4-08】配列とは?基本的な使い方から応用



YouTubeで開く

処理を早くするためには必要不可欠な要素「配列」について解説しています。
セルの値を「一括で取得する方法」や「一括で貼り付ける方法」などについても解説しています。

00:00 挨拶
00:05 配列とは
00:16 配列の宣言方法
02:07 配列の次元
03:29 2次元配列の使い道
05:14 特殊な配列
09:54 まとめ

>>昔の記事はこちら
2022/02/10
【4-04】条件分岐とは?基本的な使い方から応用

【4-04】条件分岐とは?基本的な使い方から応用



YouTubeで開く

プログラミングを学習する上で重要な「条件分岐」について解説しています。
また、こちらでは、条件分岐の中の「If」について解説しています。
応用では、繰り返し文の「For」との組み合わせを行っています。

00:00 挨拶
00:19 条件分岐とは
00:26 条件分岐が必要なケース
00:50 IF文の書き方
05:18 IF文の書き方:応用
07:31 まとめ

>>昔の記事はこちら
2022/02/08
【4-03】繰り返し文とは?基本的な使い方から応用

【4-03】繰り返し文とは?基本的な使い方から応用



YouTubeで開く

プログラミングを学習する上で重要な「繰り返し文」について解説しています。
また、こちらでは、繰り返し文の中の「For」について解説しています。

00:00 挨拶
00:06 繰り返しとは
00:36 繰り返しが必要なケース
02:56 For文の書き方
07:18 For文の書き方:応用
09:48 まとめ

>>昔の記事はこちら
2022/02/07
【4-02】変数とは?型の違いや宣言方法・活用例

【4-02】変数とは?型の違いや宣言方法・活用例



YouTubeで開く

プログラミングを学習する上で必要な要素「変数」と「型」について解説しています。
VBAでは変数宣言と型宣言を省略できますが、省略せずに記述することをおすすめします。

00:00 挨拶
00:05 変数とは
02:06 変数の宣言方法・型について
10:08 Variantについて
11:36 変数の活用例
14:05 まとめ

>>昔の記事はこちら
2022/02/03
【4-01】セルに値を自動入力する方法

【4-01】セルに値を自動入力する方法



YouTubeで開く

VBAにて、セルに値を自動入力する方法について7種類解説しています。
その他に、マクロを実行させる方法についても解説しています。

00:00 挨拶
00:11 基本操作について
04:22 セルに値を入力する方法①
06:57 セルに値を入力する方法②
07:49 セルに値を入力する方法③
08:23 ダブルクォーテーションの必要性
09:17 複数セルに値を一括入力する方法①
09:53 複数セルに値を一括入力する方法②
10:37 複数セルに値を一括入力する方法③
11:27 複数セルに値を一括入力する方法④
12:08 他のセルの値をコピーする方法
14:05 作成したマクロの実行方法①
14:29 作成したマクロの実行方法②
14:45 作成したマクロの実行方法③
16:45 作成したマクロの実行方法④
17:13 まとめ

>>昔の記事はこちら
2022/01/27
【4-22】ActiveX「コマンドボタン」の使い方

【4-22】ActiveX「コマンドボタン」の使い方



YouTubeで開く

ActiveXコントロールのコマンドボタンの使い方について解説しています。
フォームコントロールのボタンに比べて、多くのカスタマイズができるので、使ってみると可能性が広がります。

00:00 挨拶
00:06 ActiveXコントロールのボタンとは
00:20 ActiveXコントロールとフォームコントロールのボタンの違い
00:48 ActiveXコントロールのボタンの使い方
08:57 ActiveXコントロールのボタンにマクロ割当
10:53 まとめ