【Excel VBA】中級者?が陥りやすい罠 ソートの仕方は?

記事
IT・テクノロジー
閲覧いただきありがとうございます!
Excel VBA関連で出品しているさべろくと申します。

中級者?が陥りやすい罠について書いていこうと思います。

Excel VBAで配列の使い方を覚えて高速化ができるようになると、何でも配列にすれば速くなると思いがちです。ここに罠があります。実は配列での処理にしない方が速いというパターンがあります。

それはソートです。
シートに配列の値を書き出す。そのとき、値は昇順に並んでいる必要がある。
という問題があるとします。

このとき方法として大きく分けて2パターン考えられます。

【パターン1】
 配列の値をシートに書き出してから、SortというVBAの関数を使ってソートする(Excelの機能を用いてソートする)。

例.Range("A1:A100").Sort(Key1:=Range("A1"), Order1:=xlAscending)

【パターン2】
 配列の中身をソートして、ソートした結果をシートに書き出す。

さてどちらの方が速いでしょうか?

実際に検証した結果を以下に張り付けます。
表中の数字は秒数になっています。

ソート結果.jpg

【検証方法】
指定した個数の配列を作成し、配列の中身はランダムの数値を入れます。
その後、下記3パターンで実行します。

①.シートに配列を書き出した後、Sort関数を用いてソート
②.配列をバブルソートした後、シートに書き出す
③.配列をクイックソートした後、シートに書き出す

計測時間は上記パターンを実行している時間です。
ランダムに生成した数値に偏りがあるといけないので、計測は各パターンで5回ずつ実行し、その平均値を表に記載しています。

ソートの方法はいくつかありますが、実装が容易なソートとしてバブルソートを、処理速度が速いソートとしてクイックソートを選定しています。

表を見て頂ければ分かるかと思いますが、データが10万個以上の場合はSort関数を用いるExcel機能を利用したソートの方が速いことが分かります。

データが少ないときはクイックソートの方が速いですが、Excelの機能を用いたソートと速度の差はそこまで大きくないことが分かります。

実装が容易なため初心者が選びやすいバブルソートに関しては、データ量が多くなると実務に支障が出るレベルで遅いことが分かります。

まとめますと、配列をソートしてから張り付けるやり方でもクイックソートで実装するならば問題ないですが、バブルソートのように遅いソートの仕方を選び実装してしまうと問題があることが分かります。

そして、Excelの機能(Sort)を用いた方法でのソートは大規模データをソートする際には上記やり方よりも高速であることが分かりました。

どうでしょう?想定通りの結果でしたでしょうか?
面白かった、役に立ったと思って頂けたのなら幸いです。

普段Excel VBAに関する相談などを請け負っております。
困ったことがあればお声がけください。
お読みいただきありがとうございました<(_ _)>
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す