VBA技術解説
エクセルVBAのパフォーマンス・処理速度に関するレポート

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2013年5月以前 最終更新日:2019-06-16

エクセルVBAのパフォーマンス・処理速度に関するレポート


ExcelのマクロVBAは遅い・重いと良く言われることが多いようですが、

マクロVBAが遅い・重いのではなく、その書かれたVBAコードが遅いのです。

正しい高速化・速度対策をしたコードなら、それほど遅くはありません。

むしろ、巨大なスプレッドシートを扱っている事を考えれば、驚異的なパフォーマンスとも言えるのです。

Excel 2010 のパフォーマンス: パフォーマンスの問題を最適化するヒント
 
  • 参照とリンク
  • 使用範囲の最小化
  • 追加データの許可
  • ルックアップ
  • 配列数式と SUMPRODUCT
  • 関数の効率的な使用
  • VBA マクロの高速化
  • Excel ファイル形式のパフォーマンスとサイズ
  • ブックのオープン、クローズ、保存、およびサイズ
  • 他のパフォーマンスの最適化
  • まとめ
  • その他の技術情報
言わずと知れた、Microsoft、MSDNです。
ここは必読です、ここを読まずして、エクセルのパフォーマンスについて語る事がないように。

VBA高速化テクニック
 
  1. 無駄な表示を止める
  2. 無駄なSelectをしない
  3. 余計なことはしない
  4. 何度も同じことをしない
  5. 個別に呼ばない
  6. 型を指定する
  7. 名前で呼ばない
  8. 標準のプロパティ
  9. 関数も使おう
  10. セルの指定方法
  11. セルを配列に入れる
  12. 文字列型関数を使う
Office TANAKAのページです、ここも必読です。
配列を使う事の有効性等、かなり参考になるはずです。

以下は、私が速度について記載したページです。

上記と合わせて、読んでおかれると良いと思います。

記述による処理速度の違い
・1.変数の型指定 ・2.罫線の引き方 ・3.行高の変更 ・4.配列を使用した処理 ・処理速度を早くする為には
速度比較決定版【Range,Cells,Do,For,For Each】
何度も言っているのですが、RangeとCellsでどっちが早いか、とか、DoとForとFor Eachでどれが早いか とか、そもそも、その議論がナンセンスなんです。以下のコードと結果を見て、各自で判断して下さい。巷の議論が、いかに無意味で、実は良く解っていないのだと言う事を、理解してもらいたい。

Findメソッドを私が使わない理由
・1.処理速度が遅い ・2.指定オプションがシート操作とリンクしている ・「値」で検索した場合は、表示形式に依存した検索になる ・最後に


いずれも多くの事が書かれており、結局何をどうすれば・・・


どうしたら、マクロVBAが速くなるのか、なかなか分からないかもしれません。

まずやるべき事は、

Excel 2010 のパフォーマンス・・・VBA マクロの高速化
VBA高速化テクニック・・・セルを配列に入れる

この部分になります。

マクロVBAが遅いと相談されて、コードを確認した場合、

ほとんどは、以下の対処で劇的に速くなります。

Application.ScreenUpdatingの停止
・Applicationの主要プロパティ ・ScreenUpdating(マクロVBAの高速化) ・DisplayAlerts(警告停止) ・Interactive(ユーザー操作の禁止) ・Calculation(計算方法) ・StatusBar ・Cursor ・その他
Application.Calculationを手動
・Applicationの主要プロパティ ・ScreenUpdating(マクロVBAの高速化) ・DisplayAlerts(警告停止) ・Interactive(ユーザー操作の禁止) ・Calculation(計算方法) ・StatusBar ・Cursor ・その他
セルを配列に入れる

・セル範囲⇔配列の基本VBA ・使用例 ・配列およびマクロVBAの高速化に関するページ

また、単なるテクニックではなく、正しいロジック・アルゴリズムによっても大きく変わります。

【奥義】大量データでの高速VLOOKUP

この記事は、マクロVBAではなく、ワークシート関数についてですが、

考え方の問題として、非常に重要です。

データの検索はVBAでは頻繁に行われます。

データを並べ替え、適切なアルゴリズムで格段に速くなります。


エクセルのマクロVBAなんて、所詮この程度だろう・・・

とか思わないで、しっかり対処してみて下さい。

しっかり対処すれば、その速さに驚くはずです。


以下は、その後に速度関連で追加した記事です。

マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。

上記の速度対策について、具体的なVBAコードで速度検証しています。
同じ処理をするVBAコードが、全部で11サンプル掲載しています。
遅いVBAがあるなら、そのコードは、この11サンプルのどのレベルなのかを見て下さい。
そして、それ以降の対策を考えてみましょう。

さらに、
上記の速度対策では語られていない速度アップ技術について、以下で解説しています。

大量データで処理時間がかかる関数の対処方法(WorksheetFunction)
・大量データで処理時間がかかるサンプルデータ ・普通にマクロVBAコ-ドを書いた場合 ・指定範囲を絞ってみる ・配列を使って書いてみる ・アルゴリズムを考えてみる ・Dictionary(連想配列)を使う ・大量データで処理時間がかかる関数の対処方法の最後に

大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう… そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。

遅い文字列結合を最速処理する方法について
VBAは遅い… よく聞くことですが、確かに普通にコード記述しているととても遅いことがあります、その代表の一つに、文字列結合があります、文字列結合を最速処理する方法について解説します。そもそも文字列結合は、なぜ遅いのか、String型(可変長文字列)についての基礎知識が必要です。

ここでの速度アップ技術は、VBAにおける究極の対策です。
理論は決して難しいものではありませんが、
このような技術を、時々で臨機応変に駆使出来ればプロレベルと言えるでしょう。



同じテーマ「マクロVBA技術解説」の記事

最終行の判定、Rangeオブジェクトと配列、高速化の為に

最終行の判定 エクセル顧客管理の記事からのスピンオフ記事になります。以前に、モジュール「顧客一覧へ登録」において、.Cells.SpecialCells(xlLastCell).End(xlUp).Row と Cells(Rows.Count,1).End(xlUp).).Row を紹介しましたが、
記述による処理速度の違い
・1.変数の型指定 ・2.罫線の引き方 ・3.行高の変更 ・4.配列を使用した処理 ・処理速度を早くする為には
速度比較決定版【Range,Cells,Do,For,ForEach】
何度も言っているのですが、RangeとCellsでどっちが早いか、とか、DoとForとFor Eachでどれが早いか とか、そもそも、その議論がナンセンスなんです。以下のコードと結果を見て、各自で判断して下さい。巷の議論が、いかに無意味で、実は良く解っていないのだと言う事を、理解してもらいたい。
エクセルVBAのパフォーマンス・処理速度に関するレポート
VBAのFindメソッドの使い方には注意が必要です
・1.処理速度が遅い ・2.指定オプションがシート操作とリンクしている ・「値」で検索した場合は、表示形式に依存した検索になる ・最後に
マクロVBAの高速化・速度対策の具体的手順と検証
マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。特に、以下はぜひお読みください。
動的2次元配列の次元を入れ替えてシートへ出力(Transpose)
動的配列を使い様々な処理をした後にシートへ出力しようとしたとき、縦横が違っている為そのまま出力できません、そもそも、動的配列の要素数をRedimで変更できるのは、最下位の次元のみになります。2次元配列の場合、ReDimmyArray(2,10) ReDimmyArray(2,11) これはOKですが、
大量データで処理時間がかかる関数の対処方法(SumIf)
・大量データで処理時間がかかるサンプルデータ ・普通にマクロVBAコ-ドを書いた場合 ・指定範囲を絞ってみる ・配列を使って書いてみる ・アルゴリズムを考えてみる ・Dictionary(連想配列)を使う ・大量データで処理時間がかかる関数の対処方法の最後に
大量データにおける処理方法の速度王決定戦
VBAで自動化したが、大量データ処理に時間がかかってしまう… そんな悩みが非常に多いようです、そこで、各種処理方法の速度比較を行い、どの処理方法が最も速いかを検証します。つまり、処理方法の速度王決定戦です。検証する題材としては、最も一般的な集計で行います。
遅い文字列結合を最速処理する方法について
VBAは遅い… よく聞くことですが、確かに普通にコード記述しているととても遅いことがあります、その代表の一つに、文字列結合があります、文字列結合を最速処理する方法について解説します。そもそも文字列結合は、なぜ遅いのか、String型(可変長文字列)についての基礎知識が必要です。
大量VlookupをVBAで高速に処理する方法について
大量データ同士のVlookup処理は、非常に時間のかかる処理となります、マクロVBAで、これを高速に処理する方法について、VBAコードを示し解説します。ワークシート上の関数の場合 シートに関数を入れる場合は、以下を参照してください。【奥義】大量データでの高速VLOOKUP 以下の表で検証します。


新着記事NEW ・・・新着記事一覧を見る

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ