新創刊!
▼[無料]メルマガの登録
「エクセルVBA技術通信」
マガジンID:0000252815
Powered by

|
|
|
■高速化ランキング【第3位】
ここまで高速化ランキングということで、これまでに第1位と2位を発表して
きましたが、今回は続くランキングの第3位の発表です。
--------------------------------------------------------------------
【今日のテーマ】 大量のデータをソートする場合の高速化
--------------------------------------------------------------------
ソートとは、ある条件にてデータを並べ替えるということですが、一般的に
何かのデータ群を昇順や降順やその他の条件で並べ替えを行なう必要がある
際に、プログラム内で行われるロジックというものは「データ同士を比べて
入れ替える」ということをやることになるわけです。
そこで、少々やっかいなのがそのようにデータを比べる為にはいわゆる2重
ループのプログラムというものを組まなければならないところにあると思い
ます。
C言語などの高級言語とは違って、特にベーシック言語の場合にはこの2重
や3重のループを回す処理というのが大の苦手(時間を食うもと)であります
から、単純に言ってしまうと、VBAの場合でも可能な限り多重のループ
は組まないで済ませたいというわけですね。
けれど、通常はソートの処理で2重ループは避けて通れない。と、大抵のプ
ログラマーは考えるだろうと思います。
でも、エクセルVBAの場合は違います。
2重ループを組まずに高速でしかも簡単にソートができる方法というのがあ
るからです。
まずは、通常はの2重ループを使った場合のソート処理の例(サンプル1)
で処理した場合です。
サンプル1(一般的な昇順ソートプログラムの例)
―――――――――――――――――――――――――+
For i = 1 To n - 1
For j = i + 1 To n
If gData(j) < gData(i) Then
tmpData = gData(j)
gData(j) = gData(i)
gData(i) = tmpData
End If
Next j
Next i
―――――――――――――――――――――――――+
このサンプル1での処理時間は 14秒です。
備考:
今回は、1万件のデータ(1次元)を対象にベンチマークを
実施した結果です。
これではおのずと時間が掛かります。
一概には言えませんが、2重ループなのでデータ量が増えれば増えるほど2乗
に比例して時間が掛かってくることになります。(例えば、この場合でもデ
ータ量が倍の2万件になると実測で100秒以上掛かることを確認しています)
そこで、これを高速化する方法として次のSortメソッド(サンプル2)を用
いてみます。
サンプル2
―――――――――――――――――――――――――+
Selection.Sort _
Key1:=Range("A1"), _
Order1:=xlAscending, _
Header:=xlGuess, _
OrderCustom:=1, _
MatchCase:=False, _
Orientation:=xlTopToBottom, _
SortMethod:=xlPinYin, _
DataOption1:=xlSortNormal
―――――――――――――――――――――――――+
このサンプル2では 0.02秒でした。(2万件では0.94秒)
桁がいくとも違うので、比較しようもないほどの大差の結果です。
この結果からも歴然と分かるように、エクセルVBAでソートをする場合に
は、2重ループを回すよりSortメソッド使った方が圧倒的に早いということ
が言えます。
このSortメソッドは、エクセルメニューの並べ替え機能に他なりませんので
これもマクロの記録で簡単にプログラムの自動記録ができます。
たぶん、読者の皆さんの中には実際にプログラマーをされている方もいるだ
ろうと思いますが、私はソート処理のロジックを組むのがどうも苦手だ。と
いう人も多いのではないでしょうか?(実は、私もその一人です(笑)。)
ですが、このSortメソッドを用いれば色々な並び替えの条件をエクセルにて
設定できますので、わざわざ複雑なソートのロジックを考える必要もなくプ
ログラムが組めるという大きな利点があります。
よほど複雑な条件での並び替えを必要としない限りにおいては、特にこのメ
ソッドのパラメータの意味をいちいち調べる必要もありませんし。
VBAのソート処理でこの方法を用いるための全体的な処理手順としては、
外部データの読み込み→ソート処理(2重ループ)→データの書き出し
ではなくて、
外部データの読み込み→データの書き出し→ソート処理(sortメソッド)
とすべし。ということになります。
最後に、本日のポイントをまとめておくと、「VBAでのソートの処理は、
シート上でsortメソッドを使ってやると圧倒的に早くなる。しかも、面倒な
ロジックを考える必要もなくなる。」ということなので、これは非常にいい
こと尽くめのテクニックです。
こんな良い方法があるにも関わらず、これを使わずに2重ループを組んでい
るがために非常に遅い他人の拵えたVBAのシステムを、私は過去に何本も
直した経験がありますので、案外、このことに気が付いていない人も多いん
だなぁということで、今回はこれを取り上げてみました。
----------【サンプルテストの実行環境】----------
PCスペック:Pentium4 1.8GHz
OS :Windows XP
Excel :Microsoft Excel2003 or 2002
----------------- r(-●_●-) -----------------
|
▼エクセルVBA技術通信(メルマガ)の登録/解除はこちら((無料))
「エクセルVBA技術通信」 (まぐまぐマガジンID:0000252815)
|
|
|