Excelのパフォーマンス改善(重たい処理の高速化)方法
1.検索用の連番取得
INDEXや〇LOOKUP系などで、重複する値を全部検索したいときに使うアレ。顧客名簿に登録されている3人の村上を全部抜き出すとか。
・遅いパターン
検索用の連番生成にMAX関数を使っていると遅くなる。
MAXは指定範囲の全セルを探索するので、計算量はO(n^2)となり、PCのスペックや環境にもよるが、5000~20000行あたりで目に見えて遅くなる。
試しにマスタに20000行(数式も20000個あるということ)入った状態で検索を行ったところ、筆者の環境ではおおむね1.5秒ほどかかった。
・早いパターン
作業列を2列使い、
①「条件一致すれば1を返すセル」と
②「①のセルの”その行までの和”を出すセル」とすることで、処理を格段に速くすることができる。
遅い例では1万行を処理するのに内部では約5000万回の計算が必要だったが、こちらは2万回( (値の比較と加算)*1万回 )の計算で済んでいる。
※「計算回数」というと語弊があるが、簡単のためこのような表現にした。
先ほどと同様にマスタを2万行にして検索を行ったところ、ノータイムで表示された。12万件にしても1秒未満であった。
2.ランキング集計などで大量にSUMIFSがあって重い
ランキングやSUMIFSに限った話ではいが、
・処理に時間のかかる計算を
・全員分処理しなくてはいけないが、
・特に処理の必要が無い人が相当いる
ような場合に高速化できることがある。
こういう場合は「処理する必要がない場合、IFで処理するしないを分岐させる」ことで早くなる。
集計フラグ列の数式は「何を除外したいか」によって変わる。
この例の場合は集計フラグの判定にCOUNTIFSを使うと意味が無い(結局重い)ので、「ある期間中に1回でも来ているかどうか」みたいな判定をすることになる。
軽量に計算するためには処理が複雑となってメンテナンス性や可読性は下がるが、今回やりたいことはパフォーマンス改善なので仕方のないところだ。
左のセルの値によって処理をする必要がなくなることがある場合はもう少し簡単だ。これは単に以下のようにすれば良い。
3.エラーの原因が明らかなら、IFERRORではなくIFを使う
以下の図のような場合だ。
この関数がエラーになるケースと言えば、もうほとんど「顧客IDが空白」の場合に限られるだろう。
こういうエラーの原因がはっきりしているような場合、IFERRORではなく単に
としてしまった方が早い。
2で述べたようにIFは条件に合致しなかった処理を行わないが、IFERRORは「全部計算してからエラーだった場合に分岐」するので、こういうちょっと重い処理が大量に入っているような場合にパフォーマンス改善になることがある。
4.〇〇IFSを〇〇IFで使う
複数条件の〇〇IFS関数を大量に使用する場合、複数の条件セルを文字結合しておいて、結合後の文字列の単一条件で〇〇IFとすることでパフォーマンスが改善することがある。