HOME > VBA高速化 > 【第3位】大量のデータをソートする時

エクセルVBA高速化ランキング【第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(-●_●-) -----------------



この記事は、「GoGo エクセルマクロをはじめよう!」を運営するWATエクセルカスタマイズセンターが実施した速度計測 ベンチマークテストによる結果を基にした高速化手法テクニックを順位付けして発表するものです。 (2007年発行の「エクセルVBA技術通信」のバックナンバー記事からの抜粋)




NEXT >>
セル指定の高速化
【コラム】間違いだらけのマクロ高速化手順

目次へ戻る
 

 
最新号 は、下記にアドレス登録すると無料配信されます。

▼マクロ講座の登録はこちら((無料)) まぐまぐ
Go!Go! エクセルマクロをはじめよう! (マガジンID:0000135169)   
メルマガ登録
  メールアドレス:

ロジック編ランキング

  • プログラムのロジックを駆使したVBA高速化の王道テクニックを公開。 (現在準備中...)

 

読者数1万人達成しました!

エクセルで 最大級の
メールマガジン。
まぐまぐ殿堂入り

最新号は 今すぐ ↓↓↓ 登録

メールアドレス:

Powered by
まぐまぐ

完全まぐまぐ配信なので登録安心です!