Script事業案内エクセル以外トップマクロVBAVBAクラス入門コレクション(Collection)の並べ替え(Sort)に対応するクラス最終更新日:2019-07-20コレクション(Collection)の並べ替え(Sort)に対応するクラスオブジェクトを扱う事が多くなってくるとコレクション(Collectionオブジェクト)を使う機会も増えてくると思います。単純にオブジェクトを保管し、順序通り(FIFO)に処理するだけなら、とても扱いやすい場合もあります。配列、ディクショナリー、コレクション、それぞれ一長一短はありますが、コレクションはキーを扱いづらいので、これに関連して並べ替え(Sort)が難しい点があります。そこで今回は、コレクションを並べ替えるクラスを作成しました。実務的にあまり使用場面があるとは思えませんが、VBAクラスとコレクション(Collection)の勉強素材として、考えてもらえれば良いと思います。コレクション(Collection)の並べ替え(Sort)に対応する方法コレクションには通常はオブジェクトを入れる事になるため、並べ替えが普通にはできません。キー(Key)を指定しても、そのキーの取得ができない為、コレクションに入れてしまった後では、並べ替えを実行するのはかなり大変になってしまいます。そこで今回は、コレクションへの追加も含めてサポートする専用クラスを作ってみました。・ItemとKeyを保存する別々のコレクシヨンをつくる。・コレクション追加時に、ItemとKeyをそれぞれのコレクションに追加する。・2次元配列をKeyで並べ替える・ItemとKeyのコレクションを2次元配列をから再作成このような順でコレクションの並べ替え(Sort)を行っています。注意点としては、Key重複を認めている点になります。コレクションのKeyを使ってしまうと重複できないが、独自Keyとして扱うので重複も可能。Key重複させないのなら、そもそもDictionaryを使ったほうが良いでしょう。Subクラスの基本については以下を参照してください。VBAのクラスとは(Class,Property,Get,Let,Set)VBAを覚えて、いろいろ作りながらネットで調べたりしていると、クラスとかオブジェクト指向といった言葉に出くわします。VBEの「挿入」の一番下にある「クラスモジュール」は気になっていたかもしれません。このクラスモジュールを使ってクラスを作ります。クイックソートについては以下を参照してください。2次元配列の並べ替え(バブルソート,クイックソート)配列(2次元)の並べ替え方法について、バブルソートとクイックソートのサンプルになります。2次元配列の並べ替えと言えば、まさにワークシートの並べ替え機能になります。本来は、ワークシートにデータを書き出して、ワークシートの並べ替え機能を使えば良いのですが、しかし、どうしても、配列をワークシートに処理途中で書き出すと言うのは面倒なものです。初回アップ時には、Indexメソッドは以下のように書いていました。「IndexだけCollectionの添え字アクセスの対策がされていないようです」とのご指摘をTwitterでいただきました。コレクションに対して、インデックス指定してアクセスすると、後ろの要素に行くにしたがってとても遅くなります。これは、コレクションのメモリ構造がチェーンのように次々につながっている事に起因します。VBAコメントにもあるようにDebug用なので、他とは違ってこのようにしたところもありますが、やはり遅いものは遅いですし、学習教材として考えた時にも良くないので訂正しました。逆に言えば、コレクションの特性を考える良い材料とも言えますので、元々のVBAもここに残しておきます。以下のサンプルでは、シートのA列にランダムなデータを用意しています。このA列のセルをオブジェクトとして、ValueをKeyとしてコレクションに入れ、ValueであるKeyで並べ替えます。以下では、100万件のデータの時のサンプルになります。Sub実行後は、以下のようになります。※ランダム数を元に作成したので、抜け番および重複があります。上掲のマクロVBAを実行するとイミディエイトウインドウに実行結果が出力されます。34397後B1セルの元位置:$A$632639※単位は秒ソートに要する時間は、5.6秒位です。しても、100万件のソートには時間がかかるようです。100万件でこの速度なら実用としては十分なのではないでしょうか。10万件であれば、以下の通りです。3471後B1セルの元位置:$A$26375最後に最初にも書きましたが、実用としての需要はかなり少ないだろうと思います。そもそも並べ替えが必要であれば最初からコレクションに入れないでしょうし、コレクションに入れてから並べ替えをしようとはあまり思わないでしょう。いう事ですので、あくまでクラスとコレクションを扱う勉強素材として、自由に改変しながら使ってみてください。VBAコードに関しては、学習用という事を前提に書いている部分も多くあります。変数名等は、WEB掲載も考慮して短めにしていたり、プロパティ名や引数名もコレクション規定の名称に合わせたりしています。元々のコレクションを扱っているような感じで独自クラスを扱えるようにという配慮でもあります。いうところも含めて、学習用としてVBAコードを読み解いてみてください。Next)|VBA入門7.マクロって何?VBAって何?|VBA入門8.セルに文字を入れるとは(Range,Value)|VBA入門9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説10.ひらがな⇔カタカナの変換|エクセル基本操作トップマクロVBAVBAクラス入門コレクション(Collection)の並べ替え(Sort)に対応するクラスこのサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。GASスプレッドシート入門スプレッドシート応用GAS入門GAS応用トップマクロVBAVBAクラス入門コレクション(Collection)の並べ替え(Sort)に対応するクラスこのサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。