ランダム数値!Excel関数で重複させない3つの方法

ランダム数値!Excel関数で重複させない3つの方法 Excel

Excelを使っていて、
ふと「重複しないランダムな数字のリストが欲しいな…」と思ったこと、ありませんか?

例えば、抽選用の番号を作ったり、
テストデータ用のIDをパッと用意したり。

もちろん、これを実務でガチガチに使うわけじゃなく、
あくまで「なんとなくやってみたい」っていう、好奇心からです。

そもそも、このブログサイトは「Excelで暇つぶし」がテーマ。

「無駄なことを一生懸命やる!」

実務では「いや、もっと簡単な方法あるでしょ…」って突っ込まれるかもしれないけれど、
そこはご愛敬ということで。

様々な方法を知ることで、Excel関数の組み立て方やそれぞれの関数の特徴について、

理解を深めよう!というのが今回の狙いなのです。

「この関数、こんな動きもするんだ!」
「こう組み合わせると、こんな結果が出せるのか!」

そういった小さな発見が、あなたのExcelスキルをさらにパワーアップさせるはずです。

さあ、今回も関数いじりの楽しい「暇つぶし」の世界へ!

今回のミッション

本記事では、Excel 2021を使用して検証および数式の作成を行っています。

現在の状態とゴール

はじめに、現在の状態を確認しましょう。

用意するのは、まっさらな空白のExcelシートだけです!

そして、ゴールはこちらになります。

このシートのB列、C列、D列に、それぞれ異なるExcel関数のみを使った方法で、

1から100までの重複しないランダムな整数を生成します。

ルール

今回挑戦するにあたって、いくつかお約束があります。

  1. 関数縛り: 使用するのはExcelの「関数」のみです!VBA(マクロ)は使いません。
  2. バージョン: Excel 2021 で利用可能な関数を使用します。
  3. 重複チェックは必須!: 生成した数値に本当に重複がないか、確認します。
  4. 作業列、解禁!: 必要であれば、作業列を使ってもOKです!

データの準備

今回はとってもシンプルです!

お手元のExcelで、新しい空白のシートを開くだけで準備完了となります。

具体的には、B列に方法1C列に方法2D列に方法3の結果を表示させていきますよ!

準備はよろしいですか?

それでは、頭の体操、スタートです!

方法1:古典的? RANK.EQ関数でシャッフル!

考えかた

まずご紹介するのは、古き良き(?)手法かもしれません。

A列を作業列として使い、
そこに RAND() 関数で0以上1未満のランダムな小数を並べます。

そして、そのランダムな数値が、
A列全体の中で何番目に大きい(または小さい)のかを RANK.EQ 関数で求めます。

そうすれば、あら不思議!

1から100までの番号がランダムに並び変わってくれる、ということです。

手順

作業列の準備 (A列)

はじめに、A1セルからA100セルまで、おなじみの RAND() 関数を入力します。

具体的には、A1セルに =RAND() と入力し、それをA100セルまでコピーしてください。

これにより、A列に100個のランダムな小数が生成されます。

数式入力 (B列)

次に、B1セルに以下の数式を入力します。

=RANK.EQ(A1,$A$1:$A$100)

入力したら、Enterキーで確定し、B100セルまで数式をコピーします。

これでB列に、A列の数値を基準にした順位(1100の重複しないランダムな整数)が表示されるはずです!

重複の確認

最後に、本当に重複していないか、確認してみましょう!

例えば、B101セルあたりに以下の数式を入力してみてください。

=ROWS(UNIQUE(B1:B100))

この結果が「100」になれば、重複がない証拠です!

バッチリですね!

解説

この方法のポイントは、RAND() 関数と RANK.EQ 関数のコンビネーションにあります。

RAND() 関数について

まず、RAND() 関数は、ご存知の通り0以上1未満のランダムな実数(小数)を返します。

シートが再計算されるたびに新しい値に変わるのが大きな特徴ですね。

RANK.EQ() 関数について

次に、RANK.EQ(数値, 範囲, [順序]) 関数は、
指定した「範囲」の中で、ある「数値」が何番目の大きさかを返します。

例えば、下の画像の場合、
99,100,101,102 の数の中で 100 3番目に大きい。

今回は順序を省略しているので、
降順(大きい方から数えて何番目か)で評価されます。

RAND() で生成された数値は、理論上は完全に同じ値になる確率が極めて低いため、

結果として1から100までのユニークな順位が得られる、というわけです。

重複確認の方法

そして、UNIQUE(B1:B100) でB列の重複しない値だけを取り出し、

さらに ROWS(…) でその行数を数えることで、簡単に重複チェックができるのも便利なポイントです。

方法2:SMALL関数で小さい順にインデックスを取得!

考えかた

次にご紹介する方法も、作業列Aに生成した RAND() 関数の値を利用します。

今度は、SMALL 関数を使って、
A列のランダムな数値の中から「X番目に小さい値」を探し出すのです。

そして、その「X番目に小さい値」がA列の「何行目にあるか」を MATCH 関数で特定します。

最後に、INDEX 関数と SEQUENCE(100) を組み合わせて、

特定された行番号(つまりランダムな順番)に従って1から100の連続する数値を並べ替える、

という、少々テクニカルなアプローチです!

手順

作業列の準備 (A列)

まず、方法1と同様に、A1セルからA100セルに =RAND() を入力し、コピーしておきます。

(もし方法1で既に入力済みなら、そのままでOKです!)

数式入力 (C列)

続いて、C1セルに以下の数式を入力します。

=INDEX(SEQUENCE(100),MATCH(SMALL(A$1:A$100,ROW(A1)),A$1:A$100,0))

入力したら、Enterキーで確定し、C100セルまで数式をコピーします。

これで、C列にも1100の重複しないランダムな整数が表示されましたか?

重複の確認

最後に、こちらも確認しておきましょう!

C101セルあたりに、このように入力します。

=ROWS(UNIQUE(C1:C100))

結果が「100」なら大成功です!

解説

この数式は、少し複雑に見えるかもしれませんが、一つ一つの関数の役割を理解していくと面白いですよ!

SEQUENCE(100) の役割

まず、SEQUENCE(100) ですが、これで1から100までの連続した数値の配列 {1;2;3;…;100} をメモリ内に作成します。

これが並べ替えられる元のリストになるわけです。

SMALL(A:A0,ROW(A1)) の仕組み

次に、SMALL(A$1:A$100,ROW(A1)) の部分です。

ここで、ROW(A1) は、数式を下にコピーしていくと1, 2, 3… と変化しますね。

つまり、SMALL 関数は、A列のランダムな数値の中から、

1番目に小さい値、2番目に小さい値、3番目に小さい値…と順番に取り出していきます。

MATCH 関数の働き

そして、MATCH(探す値, 探す範囲, 0) です。

これは、SMALL 関数で見つけた「X番目に小さいランダムな値」が、

A列のどの位置(行番号)にあるのかを探します。

最後の引数「0」は、完全一致で探すという意味です。

INDEX 関数による最終処理

最後に、INDEX(配列, 行番号) 関数です。

これで、SEQUENCE(100) で作った1から100のリストを、

MATCH 関数で見つけ出したランダムな行番号の順番に並べ替えて表示します。

この方法も、結果的にA列のランダムな値の「順序」を利用している点がポイントですね!

方法3:新時代のやり方! SORTBYとRANDARRAYで一撃!

考えかた

さあ、お待たせしました!

Excel 2021 ならではの「スピル」機能を活かした、
作業列いらずの一発表示に挑戦です!

ここで使うのは SORTBY 関数と RANDARRAY 関数です。

考え方は非常にシンプルです。

まず、SEQUENCE(100) で1から100までの連番を用意します。

次に、RANDARRAY(100) で100個のランダムな数値の配列をサッと作ります。

そして、SORTBY 関数が、このランダムな数値の配列を「並べ替えの基準」として、

1から100の連番をシャッフルしてくれるのです!

一つのセルに数式を入れるだけで、結果がぱっと表示される快感をぜひ味わいましょう!

手順

数式入力 (D列)

まず、D1セルに、以下の数式を1つだけ入力します。

=SORTBY(SEQUENCE(100), RANDARRAY(100))

Enterキーを押すと、D1セルからD100セルまで、結果が自動的にダーッと表示されます。

これがスピル機能です!実に気持ちいいですね!

重複の確認

最後に、念のためこちらも確認です。

D101セルあたりに、こう入力しましょう。

=ROWS(UNIQUE(D1:D100))

もちろん、結果は「100」のはずです!

解説

SEQUENCE(100) の役割

まず、SEQUENCE(100) は、ここでも1から100までの連続した数値の配列 {1;2;3;…;100} を生成します。

これがシャッフルされる対象のデータとなります。

RANDARRAY(100) の役割

次に、RANDARRAY(100) ですが、これは100行×1列のランダムな数値の配列を生成します。

このランダムな配列が、SORTBY 関数の並べ替え基準になります。

SORTBY 関数の強力な機能

そして、SORTBY(並べ替える配列, 基準にする配列1, [並べ替え順序1], …) 関数です。

この関数は、「並べ替える配列」(今回は SEQUENCE(100))を、

基準にする配列1」(今回は RANDARRAY(100) のランダムな値)に従って並べ替えます。

RANDARRAY が返す値は毎回ランダムなので、結果として SEQUENCE(100) がランダムにシャッフルされる、という仕組みです。

この方法の大きなメリットは、作業列が不要で、数式も比較的スッキリしている点でしょう。

ただし、この方法はExcel 2021以降、またはMicrosoft 365でないとスピル機能が使えないので、その点だけはご注意ください!

参考:今回登場したExcel関数

今回の「暇つぶし」で大活躍してくれた関数を、改めてご紹介しますね!

  • RAND(): 0以上1未満のランダムな実数(小数)を返します。
  • RANK.EQ(数値, 範囲, [順序]): 範囲内で指定した数値の順位を返します。
  • ROWS(配列): 配列またはセル範囲の行数を返します。
  • UNIQUE(配列, [方向], [回数]): 配列または範囲内の一意の値を返します。スピル対応!
  • SEQUENCE(行数, [列数], [開始番号], [ステップ]): 連続する数値の配列(例: 1,2,3…)を生成します。スピル対応!
  • SMALL(配列, x): データセットの中でx番目に小さい値を返します。
  • MATCH(検索値, 検査範囲, [照合の種類]): 範囲内で特定のアイテムを検索し、そのアイテムの相対的な位置を返します。
  • INDEX(配列, 行番号, [列番号]): テーブルまたは範囲内の値や参照を返します。
  • SORTBY(配列, 基準配列1, [並べ替え順序1], …): 指定した配列や範囲の内容を、対応する配列や範囲の値に基づいて並べ替えます。スピル対応!
  • RANDARRAY([行数], [列数], [最小値], [最大値], [整数にするか]): ランダムな数値の配列を返します。行数、列数、最小値、最大値、整数にするかどうかを指定できます。スピル対応!

普段あまり意識して使わない関数も、こうして組み合わせてみると面白い発見があるものですね!

まとめ

さて、今回は「重複しないランダム1から100までの数を生成する」というお題に、
Excel関数だけで挑む3つの異なる方法をご紹介しました!

はじめに、作業列と RANDRANK.EQ を使う古典的なアプローチを見ました。

次に、INDEXMATCHSMALL を組み合わせた少し技巧的な方法を試しました。

そして最後に、Excel 2021 以降ならではの SORTBYRANDARRAY を使った一括処理まで、
いろんな顔ぶれが登場しました!

正直なところ、実務でサッと作るなら、方法3の SORTBYRANDARRAY の組み合わせが、

数式も短くスピルで一発なので一番楽かもしれません。

でも、今回のように「普通はこうだけど、あえて違うやり方でやってみよう!」と考えること、

そして「この関数ってこんな動きもするんだ!」と発見すること自体が、

Excelの関数への理解を深める、とっても良い「暇つぶし」になるのだと思います。

「このケースではこの関数」と一つのやり方だけを知っているのももちろん良いですが、

様々な方法を知っておくことで、いざという時の応用力や問題解決の引き出しが格段に増えるはずです。

今回の関数パズルが、皆さんのExcelライフのちょっとした刺激や、

新しい「なるほど!」という発見に繋がっていれば、筆者として、とっても嬉しいです!

タイトルとURLをコピーしました