個別のロジックの記述でこれに対応する一つの有効なマクロVBAコ-ドについて解説します。以下の例で解説します。A列にコード、B列に数量、これが10万行あります。コードは、A1~A1000まであります。E列にユニーク化したコードA1~A1000があります。F列に各コードの数量合計を求めます。F2セルに=SUMIF(A:A,E2,B:B)と入れて下にコピーすれば求められるものです。実際にやってみると、コピー後に「再計算」がしばらく出るのが確認できると思います。E列が1000程度なので、再計算できますが、E列が数万行になるような場合は、「再計算」がいつまでも終わらない状態になります。俗にいう、計算式が重いという状態です。そこで、この処理をまマクロにしようと考えたと仮定してください。以下の計測は、Corei5、メモリ8G、Excel2013でのものです。要因を排除する意味と、比較のしやすさの意味で、行数等は固定値にしています。Subこれで処理時間は13.6秒~13.8秒シートでの再計算より、やや時間がかかてしまっています。改善点はあるでしょうか、データ範囲が列全体になっていますが、範囲を絞ったらどうでしょうか。変わりません、ワークシート関数は良くできています。「配列を使うと早くなる」これも盲信している人がいるようです。配列を使って書いてみましょう。変わりませんでした、実際には違いがあるはずなのですが、計測できる差がないという事です。1000行程度の出力では、配列にしてもあまり意味がないのです。行数がもっと多いとか、計算する列数が多ければ、配列にすることで早くなります。しようもないのでしょうか・・・それでは、この記事の意味がなくなってしまいますね。SumIf関数が無かったとして、これを集計することを考えてください。あなたならどうしますか・・・E2セルのA1を、A列で探してB列を足し上げる・・・E列の1データについて、10万行の中から探しますか・・・A1だけでもとんでもない時間がかかってしまいますね。そんな非効率事はしないはずです。A列で並べ替えれば、A1から順に並ぶので、A1だけなら、簡単に求められます。これを1000回繰り返せばよいのです。これをマクロVBAコ-ドにしてみましょう。格段に速いのがお分かりいただけると思います。A列の最終になったら、F列に合計を出力し、E列の次に移る・C列で昇順に並べ替え、元の順に戻す・G列で昇順に並べ替え、元の順に戻す・C列をクリア・G列をクリアこのようになります。注意点としては、E列も並べ替える必要があります。文字列の大小比較をする場合、A1,A2,A3,・・・A9,A10,A11ではありません、A1,A10,A100,・・・A2,・・・となります、これは実際に並べ替えてみればわかると思います。このような、シーケンシャル処理ロジックは、バッチ処理で大量データを扱ったことがあれば、ごく普通のロジックになります。大量データ同士の比較・集計においては、これが最も早いのです。無駄が一切ないのです。A列もE列も、上から下に向かって1回ずつしかループしていません。1回のループなので、これが最も早いという事です。sample1~sample3もVBAコードとしては1回のループですが、SumIf関数の中で、A列の上から下に向かってループしていることは想像に難くないはずです。大量データ処理において処理時間を短縮しようと思ったら、まずは、データを並べ替えてみる事です。すれば、データの特質が見えてきますので、それから適切な処理ロジックを考えてみて下さい。今回はSumIf関数を例にしましたが、CountIf関数でも、VlookUp関数でも、同様の考え方で出来るのがご理解できますでしょうか。これらの関数で処理時間がかかっているようでしたら、ぜひ試してみて下さい。考え方として、非常に参考になると思います。そもそもVBAの最低限の速度対策は必須です。以下を参考にしてください。エクセルVBAのパフォーマンス・処理速度に関するレポートExcelのVBAは遅い・重いと良く言われることが多いようですが、VBAが遅い・重いのではなく、その書かれたVBAコードが遅いのです。正しい高速化・速度対策をしたコードなら、それほど遅くはありません。巨大なスプレッドシートを扱っている事を考えれば、驚異的なパフォーマンスとも言えるのです。マクロVBAの高速化・速度対策の具体的手順と検証マクロVBAが遅い・重いという相談が非常に多いので、遅い・重いマクロVBAを高速化・速度対策する場合の具体的な手順をここに解説・検証します。マクロVBAの速度に関する記事は既にいくつか書いています。そもそも、その議論がナンセンスなんです。以下のコードと結果を見て、各自で判断して下さい。巷の議論が、いかに無意味で、実は良く解っていないのだと言う事を、理解してもらいたい。大量データで処理時間がかかる関数の対処方法(SumIf)このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。大量データで処理時間がかかる関数の対処方法このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。