
【VBA高速化】爆速処理にする簡単な方法【マクロが遅いと感じるあなたへ】
知らぬ間にVBAの処理速度が遅いなんてことありませんか?
少し意識するだけで、案外簡単に高速処理にすることが可能かもしれません。
そこで今回は、VBA高速化の基本的な事から、より高度な手法まで、初心者でも分かりやすくExcelのVBAを高速化する方法を解説します。
合わせて、エクセルのマクロが遅い原因とその対策方法も紹介します。
- 表示処理をしない
- 再計算の最適化
- シートイベントを発生させない
- 貼り付け処理はしないで配列を使用する
- Selectを使用しない
このような処理をすることによって、VBAの処理実行を速く終わらせることができます。
< ---目次--- >
◆はじめに
VBA高速化をするテクニックがあると勘違いされている方が多いです。
ですが、VBA高速化のテクニックなどは、ありません。ただの知識といいますか、やり方です。
VBAを高速化しようとしたことのない方は、この記事を読めば
確実にVBAを高速化することができます。
意識すれば簡単にできますので、VBAを高速化して処理速度を改善したい方はかなりおすすめです。
また、VBA高速化のおまじないを検索される方もいますが、それは、おやめになった方が賢明です。
どうしてもVBA高速化のおまじないを使用したい方は、こちらをご覧ください。
おまじないのような感じで使用できます。
おまじないとして意味も理解せず実行するのは
初心者の方に向けて、説明していますので、VBA初心者ではない方は
こちら(VBA高速化の方法)から読んでいただいた方が手っ取り早く、VBA高速化できると思います
エクセルで大量データを処理するとマクロが遅い、重いと感じたり
そんなに重いマクロ処理をしていないのにマクロが重いと感じる方がいると思います。
マクロって知らぬ間に遅くなってしまいがちですが。本来はもっとマクロを早く処理したいですよね。
VBAの実行が遅いと感じても、意外と簡単にVBA高速化ができちゃうんです。
初心者だとさらに、簡単に処理を速くすることができます。
知識がないと、意外と無駄なことをして、マクロを重くしています。
皆がやってしまいがちな、VBAが遅くなってしまう原因とその対策を紹介しています。
便利なエクセルのマクロを使いこなし、VBAを高速化しましょう!
そうすることによって、処理する時間の無駄を減らし、楽にデバッグする事ができます。

◆VBA高速化とは
VBA高速化とは、VBAのコードを処理速度重視のコードに最適化する事によって
マクロの処理時間を早くすることができます。
マクロの実行内容にもよりますが
VBAのコードを少し変更するだけで
10秒かかっていたマクロが、1秒で終わる速いマクロ処理にすることが可能です。
処理を高速化をしたい場合は、VBAやVBEの設定のみでは、できません。
VBAのコードを見直し、最適なコードしかありません。
VBAを高速化するのに、PCのスペックはほぼ関係ありません。
古すぎる、低スぺすぎるCPUは例外ですが。
書いているVBAのコードを処理速度の速いコードにすれば
多少古いのPCでもVBAの高速化は可能です。
◆VBA高速化について
エクセルマクロが遅い、重い時の対策を探していてお困りの方がいると思います。
簡単にエクセルマクロを早くする方法、VBA高速化の方法や
VBA処理が遅い原因を詳しく説明していきたいと思います。
簡単なのは、マクロが遅い原因を対策することによって、VBAの高速化ができます。
じゃあ、マクロが遅い原因はなに?って思いますよね。
下記をご覧ください。
初心者がよくやってしまうVBA処理が遅い原因は複数ありますが
VBAのコードで処理速度を改善してVBA高速化できる場合がかなり多いです。
エクセルのVBAを適切な文にして、マクロが重い時の対策して、マクロを高速化していきましょう。
◆VBAが遅い原因一覧
- セルの更新表示をしている
- 結果ではなく、一時演算処理のためにセルに直接、値を書き込んでいる
- シートイベントを無効にしていない
- シート上のセルで処理して、配列を使用していない
- 無駄なコードが多い
- 不必要なSelectをしている
- 他のブックを開いて値を取得している
- 単純に処理が多く、重い
ExcelのVBAの処理速度を遅くしてしまう原因として、よくあるのは、上記の内容だと思います。
エクセルVBA初心者の方は、ほぼ当てはまっていると思います。
それぞれの意味はページ下部で紹介していますので、このまま読み進めください。
上記に1つでも当てはまる場合は、VBAを高速化する事は、できません。
最初のうちは、マクロが重いのは当たり前なので、しっかり対策する知識を身につけて
「VBA高速化」をしていきましょう。
色んなマクロを作って、色々な記述法、VBAの仕組みを学んでいけば
「VBA高速化」も簡単にできます。
上記のVBAが遅い原因である多くは、対策があります。
「VBA高速化」ができるので、下記のVBAを高速化する方法をご覧ください。
「単純に処理が多く、重い」
これに関しては、本当に処理が多い場合は、諦めるしかないです。
“本当に処理が多い場合”だけですよ。
ですが、上級者が見直せば、意外と早くなるものです。
例えば、VBAを高速化するのに必須の知識である「配列」を使用せずに
「単純に処理が多く、重い」と感じている場合は、それは、処理内容が多いと断定できません。
なので、処理する量が多くて、マクロが重い、VBA処理速度が遅いと思っていても
改善の余地がある可能性があります。
マクロが重くて「応答なし」になり、エクセルが固まってしまう対策は
こちら(VBA応答なしの対策)をご覧ください。
◆VBAを高速化する方法
予備知識をつけて、もらったところで、色々なVBA高速化の方法を紹介します。
初心者の方は、必ずどれか、当てはまります。
●セルの更新表示を無効にしてVBAを高速化する
・セルの更新表示とは
セルの更新表示とは、複数のブックを使用したり、シート上の関数などで処理するために
セルに書き込みしたりすると、ウィンドウの表示やセルの内容が変わったりしますよね。
それが、「セルの更新表示」です。
Excelでセルの更新表示を無効していないと、たくさん表示処理が行われ、VBAが遅い原因になってしまいます。
セルの更新表示を無効にすることでVBAを高速化する事ができます。
少しでも、VBAを軽量化するためにも、更新表示しない設定(False)にしてください。
更新表示しない設定(False)にするとエクセル画面のちらつきも防止できるので、ちらつき対策にもなると覚えておいてください。
処理完了後にはセル更新表示する設定(Ture)に戻さないと、セルの更新表示がされないのでご注意をしてください。
・セルの更新表示を設定する方法
Application.ScreenUpdating = False 'セル更新表示しない
'//処理//
Application.ScreenUpdating = True 'セル更新表示する
●再計算設定を手動にして高速化する
・再計算設定とは
一時演算処理のためにセルに直接、値を書き込むマクロを組むことを、初心者の方は、よくやってしまうと思います。
独学でマクロをやっている方は、特にそうだと思います。
セル内の値が変化、すなわちセルに書き込む度に、エクセルは再計算します。
当然、再計算が行われると、VBAが遅い原因になってしまいます。
その再計算をするかしないかの設定を変更できるのが「再計算設定」です。
セルに書き込む回数が多ければ、多いほど、セルの再計算、更新表示等の
エクセル側の処理が実行され、VBAが重くなる原因になりますので、意味なく無駄に書き込むのは書き込むのはやめましょう。
エクセルの再計算が遅い原因として、セルに重い関数をたくさん使用していたり、条件付き書式を設定している事がほとんどです。
関数や条件付き書式がたくさんあり、消すことができずに、再計算が遅いのが回避できない場合の解決策はあります。
解決策は、セルに書き込まずに変数や、後述する「配列」を使用し、セルに書き込む回数を減らすことです。
セルに書き込む回数を減らせるのがベストですが
それができない場合は、セルの再計算を無効にしてから
再計算が必要な場合は、随時、再計算する処理をする事によってVBAを高速化する第1歩です。
・再計算を設定する方法
Application.Calculation = xlCalculationManual ' 再計算「手動」
'//処理//
Application.Calculation = xlCalculationAutomatic ' 再計算「自動」
書き込む処理が複数ある場合は、指定範囲を再計算、特定のシートを再計算、1回だけ再計算とかできるので、次のようにしましょう。
「Application.Calculation = xlCalculationManual」にすると、再計算は自動でされないので
再計算が必要場合は、随時、個別に再計算してください。
' A1:C5の範囲を再計算
[A1:C5].Calculate
' Sheet1を再計算
Worksheets("Sheet1").Calculate
' すべての関数の再計算を行う
Application.CalculateFull
●シートイベントを無効にしてVBA高速化
・シートイベントとは
シートイベントとは、シートか、そのシートのセルに対して、特定の操作を指します。
手動でもVBAでも、特定の操作が行われた場合は、発生します。
シートイベントはシートをアクティブにした時や選択セルの変更など複数あります。
その中でセルの更新イベント「Worksheet_Change」イベントを使用しているエクセルにのみ適用される話です。
セルに書き込む回数が多ければ、多いほど、「Worksheet_Change」イベントが発生し、処理が実行されてしまうので、VBAが遅い原因になってしまい、マクロが重いと感じてしまいます。
セルに書き込む回数を減らせるのがベストですが
それができずに、「Worksheet_Change」イベントの処理をしなくてもいい場合は
イベントの発生を無効にしてVBA高速しましょう。
・シートイベントを無効にする方法
Application.EnableEvents = False 'イベントを無効
'//処理//
Application.EnableEvents = True 'イベントを有効
●配列を使用してVBA高速化
・配列とは
複数のデータを並べたデータ構造のことを指し、その複数のデータはインデックスで識別されます。
要は、1つの変数にデータを複数格納でき、インデックス(数値)を指定すれば、呼び出しも書込みもできるよ!って感じですかね。
エクセルの行のみ、又は、列のみの場合は、1方向しかデータがないので、一次元配列となります。
https://jovba.com/2022/02/17/ary1/
配列を使った時は、正直、早すぎてびっくりしました。
これは、ぜひ使うべきで、VBA高速化には必須です。マクロを組むなら、配列を使わないと、もったいないです。
配列は難しそうですが、イメージとデバッグ方法さえ掴めば、VBA初心者でもできちゃうと思います。
内部的な演算は配列を使用してVBA高速化しましょう。
・配列を使用する方法
詳しくはこちらの記事をご参照ください。
●不必要なSelectをしている
セルから値を取得する時や、参照するときにわざわざ「Select」していませんか。
上述した、セルの更新表示無効やシートイベントを無効をすれば、「Select」しても
処理速度は気にならなくなるかもしれません。
ですが、セルから値を取得する時に「Select」は不必要な処理です。
少しでもVBAを高速化したい場合は、下記サンプルコードのようにしてください。
Sub セルから値取得()
'×××遅い例×××
Cells(1, 1).Select
a = Selection.Value
'○○○速い例○○○
a = Cells(1, 1).Value
b = Range("A1").Value
c = [A1].Value
Debug.Print "変数a:" & a _
& vbCrLf & "変数b:" & b _
& vbCrLf & "変数c:" & c
End Sub
●他のブックを開いて値を取得している
VBAで他のブックを開いて値を取得すると、遅くてイラつきますよね。
ですが、他のブックの値取得もVBAでは高速化できます。
他のブックの値取得で一番早い方法をこちらで紹介しています。
●無駄なコードを減らす
対策があるとは言いましたが、慣れるまでは、無駄なコードと判断するのは、正直、難しいです。
ざっと考えれる例を紹介します。
・対策例
×セルのSelectしなくても処理できるのに、Selectしている
×まとめてできる処理があるのにまとめていない
上記内容の遅い原因を初心者では、簡単に判断するのは難しいと思います。
ですので、たくさんコードを書いて無駄な処理を判断できるようになるか、まわりのVBA高速化の上級者に相談してください。
自分の周りにVBA高速化の上級者がいなければ、相談に乗るので
コメントして頂くか、又は、こちらからお問い合わせしてください。
◆まとめ
この記事を読んで、VBAの高速化に繋がれば、嬉しいです。
私は、セルの更新表示無効、再計算の設定、シートイベント無効に関しては、よく使うので、まとめて1つのサブモジュールを作っています。
これを多用することによって、かなり楽にVBAの処理を速くすることができます。
何より、コードを覚えなくてよいので、最高ですね。
詳しくはこちらをご覧ください。
上記を読んでも、まったく改善できない、他に方法がないか知りたい方は、コードをコメント欄にくだされば書いてくだされば、可能な範囲で答えます。
以下コードの処理に、約5分程度かかってしまいます
シートを配列に読み込んで、行毎に文字、背景色の変更、計算式の書き込みを行っています
アドバイス頂けると助かります
画面、自動計算停止処理等については行っています
Const 黒 As Long = 0 ‘XlRgbColor.rgbBlack
Const 淡 As Long = 1 ‘XlRgbColor.rgbLightYellow
Const 赤 As Long = 2 ‘XlRgbColor.rgbRed
Const 橙 As Long = 3 ‘XlRgbColor.rgbOrange
Const 黄 As Long = 4 ‘XlRgbColor.rgbYellow
Const 緑 As Long = 5 ‘XlRgbColor.rgbLime
Const 青 As Long = 6 ‘XlRgbColor.rgbBlue / rgbDodgerBlue
Const 紫 As Long = 7 ‘XlRgbColor.rgbFuchsia
Const 灰 As Long = 8 ‘XlRgbColor.rgbGray
Const 白 As Long = 9 ‘XlRgbColor.rgbWhite
Const 銀 As Long = 10 ‘XlRgbColor.rgbSilver
・・・・・
以下省略
メールの方で送ったので、ご確認よろしくお願いします。
長文のコードであれば、
お問い合わせページにてよろしくお願いします。