セルの値をバラバラに並べ替えたい

特になんらかのデータのテストを行いたい場合に多いのですが、複数あるデータを規則性がない状態で並べ替えたい場合があります。

こんな感じです。

Excelでの並べ替え機能は、列に特化していたり昇順や降順がメインできれいに並べ替えることを目的としていますが、やりたいことはその逆で、めちゃくちゃに並べたい、という話です。行や列に関係なく不規則に並べ替える方法がないのもあります。

そういう機能はExcelにはないので手で並べるか、VBAで作ることになります。

以下では選択セル範囲の値をバラバラにするコードを紹介します。


選択セル範囲の値をランダムに並べ替えるコード

以下の関数は選択セル範囲の値をランダムに入れ替えます。使い方もそのままで、入れ替えたい値があるセル範囲を選択して実行します。

入れ替えているのはセルの値だけになるため、RangeオブジェクトのValue値のみを対象としています。

セルを複数選択して実行するたびに選択範囲内で値が入れ替わります。

空白セルが選択範囲に含まれていても動作するため、値が入っているセルだけで入れ替えたい場合は空白セルは選択しないようにして実行する必要があります。


コード説明

上のコードは大きく3つに処理が分かれています。

  1. 選択セル範囲の現時点の値を配列に格納。
  2. 配列を並べ替え
  3. 並べ替えた配列内容を選択セル範囲に反映。

1つ目と3つ目は選択セル範囲をくるくるループして配列に入れるかセットするかの話なので大したことはやっておらずコメントに書いたままです。

メインは2つ目の配列の並べ替えです。配列の内容を入れ替えているのですが、ぱっと見た感じでは分かりにくいです。これはフィッシャー-イェーツのシャッフルアルゴリズムと言われる並べ替えの手法を採用しており、そのままコード化しています。

配列の並べ替えの詳細については「VBAの配列を偏りなく高速にランダムに並べ替える」をご参照ください。リンク先で紹介しているコードを簡略化したものを上のコードに採用しています。