タカヒロ@extanExcel関数/VBAで指定数値から重複しない乱数を生成する方法!Excel関数/VBAで指定数値から重複しない乱数を生成したいときはないでしょうか。VBAで指定数値から重複しない乱数を生成したいが方法がよくわからないですよね。関数の数式をシートへ入力する1行で指定数値から重複しない乱数を生成する他の乱数系関数で重複しない乱数を生成するRAND関数で重複しない乱数を生成RANDBETWEEN関数で重複しない乱数を生成VBAで指定数値から重複しない乱数を生成するVBAコードVBAを設定するVBAを実装するVBAを実行するVBAの説明VBAの実装手順VBAを実行するさいごに指定数値から重複しない乱数を生成する関数についてExcel関数で指定数値から重複しない乱数を生成する方法について説明をします。Excelワークシート上で乱数を取り扱う関数は3つあります。未満の乱数を返します。指定された数値の範囲内の乱数を返します。範囲の乱数を配列で返します。入力する行と列の数、最小値と最大値、および整数または小数の値を返すかどうかを指定することができます。[整数])備考RANDARRAY関数はスピルとなります。Office2019、Microsoft365以降のバージョンの対応となります。標準仕様の範囲で数値を指定できる関数は、RANDBETWEEN関数とRANDARRAY関数になります。引数の最大値と最小値に範囲設定したい数値を指定すればできます。重複させない条件となると、対応している関数はありません。別の関数を組み合わせて重複させない仕組みを実現させる必要があります。関数の組み合わせで指定数値から重複しない乱数を生成する指定数値から重複しない乱数を生成する関数の組み合わせについて説明します。SEQUENCE関数で指定数値の配列を作成まずは、SEQUENCE関数で指定数値の配列を作成します。SEQUENCE関数の書式は以下の通りです。配列内の連続した数値の一覧を生成します。行:出力先の行数を指定します。列:出力先の列数を指定します。目盛:生成する整数の間隔を指定します。省略した場合は1つづつ増えます。5から14の間を指定したい場合は以下のようにします。Excel側にシートを準備し、A1に入れるようにしましょう。=SEQUENCE(10,1,5)SORTBY関数で並び替え次にSORTBY関数と乱数系関数で先ほどのSEQUENCE関数で作成した配列をランダムに並び替えていきます。SORTBY関数の書式/機能/引数SORTBY関数の書式は以下の通りです。範囲または配列の内容を、対応する範囲または配列の値に基づいて並べ替えます。範囲:並び替えの対象となる範囲や配列を指定します。基準:並び替え基準の範囲や配列を指定します。順序:並び替えの順序を指定します。1が昇順でデフォルト、-1が降順となります。SORTBY関数の第一引数「範囲」にSEQUENCE関数で作成した配列を指定し、第二引数の「基準」に乱数系関数で生成した数値や配列を指定することにより乱数に準じた形で並び替えが行われる形となります。RANDARRAY関数でランダムな並び替え基準を指定SORTBY関数の第二引数の「基準」にRANDARRAY関数で生成した乱数の配列を指定します。これにより第一引数に指定した数値がランダムに並び替えらえる形となります。RANDARRAY関数の書式/機能/引数RANDARRAY関数の書式/機能/引数については以下の通りです。範囲の乱数を配列で返します。入力する行と列の数、最小値と最大値、および整数または小数の値を返すかどうかを指定することができます。行:乱数出力先の行数を指定します。列:乱数出力先の列数を指定します。最小値:乱数の最小値を指定します。省略すると0の指定となります。最大値:乱数の最大値を指定します。省略すると1の指定となります。整数:整数の乱数を発生させるかを指定します。備考SEQUENCE関数はスピルとなります。Office2019、Microsoft365以降のバージョンの対応となります。関数の数式をシートへ入力するRANDARRAY関数は配列数式として入力されます。引数に10を指定した場合は第一引数の行数に該当され、10個の配列と乱数が生成されます。タカヒロなかなか複雑ですので、実際に入力してみましょう。B1セルにRANDARRAY関数の数式を入れます。10行指定なので引数は10としています。=RANDARRAY(10)C1セルにA,B列を指定したSORTBY関数を入れます。=SORTBY(A1:A10,B1:B10,1)はい、乱数が重複無しに生成されましたね!1行で指定数値から重複しない乱数を生成する1行で指定数値から重複しない乱数を生成する方法について説明をします。これまで、各列ごとに配列を展開してSORTBY関数でまとめて並び替えをしてきましたが、この配列を直接SORTBY関数に割り当てることもできます。サンプルと同じく5から14までの間で重複しない乱数を生成させるとなると、以下の数式となります。=SORTBY(SEQUENCE(10,1,5),RANDARRAY(10))A1へ入力してみましょう。はい、1行でRAND関数で乱数が重複無しに生成されましたね。各引数に指定する内容は以下の通りとなっています。SORTBY(SEQUENCE(<配列数>,<列数>,<開始の値>),RANDARRAY(<配列数>))他の乱数系関数で重複しない乱数を生成する他の乱数系関数でも重複しない乱数を生成してみましょう。RAND関数で重複しない乱数を生成RAND関数をB1からB10まで入力します。=RAND()はい、RAND関数で乱数が重複無しに生成されました。RANDBETWEEN関数で重複しない乱数を生成RANDBETWEEN関数で最小値を1,最大値を10にしてB1からB10まで入力します。=RANDBETWEEN(1,15)はい、RANDBETWEEN関数で乱数が重複無しに生成されましたね。ちなみにSORTBY関数の基準にて、該当する値が重複していたとしても、範囲の値側で並び替えられていることがわかります。サンプルでは並び替え指数は1の昇順となっています。VBAで指定数値から重複しない乱数を生成する指定数値から重複しない乱数を生成するVBAについて説明をします。VBAで乱数を発生させる関数はRnd関数が用意されていますが、ワークシート関数と同様に重複する場合があります。一般的に値が重複しないまで繰り返し乱数を生成して重複をさせないやり方がありますが、乱数生成の数が多くなるほど繰り返し処理も多くなるのであまり良いやり方とはいえません。そこで、VBAのRnd関数は使用せず、ワークシート関数のSORTBY関数、SEQUENCE関数、RANDARRAY関数の組み合わせで生成された乱数を生成し、それをVBAで取得することにより実現していきたいと思います。VBAコード指定数値から重複しない乱数を生成するVBAは以下の通りとなります。'乱数の最小値を入力します。配列数を指定すると重複値が発生しますので注意してください。'出力先の列を入力します。'指定列1行目にワークシート関数のSORTBY関数、SEQUENCE関数、RANDARRAY関数を代入します。'関数の結果を配列に格納します。'配列の値を指定列1行目から入力します。SubVBAを設定するVBAを設定していきましょう。乱数の最小値を入力します。配列数を指定すると重複値が発生しますので注意してください。10出力先となるシートを用意して、出力先の列を入力します。サンプルではA列に指定していますので、A1以降に重複しない乱数が生成される形となります。"A"タカヒロ環境に応じてセルや値の範囲を変更してください。VBAを実装するVBAの実装手順は下記「VBA実装手順」をご参照ください。VBAを実行するVBAを実行して、重複しない乱数が生成されるか確認をしてみましょう。「指定数値から重複しない乱数を生成」のマクロを選択して実行します。はい、乱数が重複無しに生成され、式自体ではなく値が入力されていますね!VBAの説明VBAの内容について説明をします。Excelシート側の値を消去します。strStartCell).Clear指定列1行目にワークシート関数のSORTBY関数、SEQUENCE関数、RANDARRAY関数を代入します。それぞれの引数へ代入している値はワークシート関数と同様となります。"))"関数の結果を配列に格納します。intMaxRow)配列の値を指定列1行目から入力します。実装手順は以下の通りです。Excel側にVBAを実装していきます。1Excelを新規に開き、「開発」タブをクリックし、「VisualBasic」をクリックします。ショートカットキー「Alt」+「F11」でもOKです。2標準モジュールを追加します。モジュール」を選択します。3右ペインのウインドウに上記のVBAを入力します。VBAを実行するでは早速VBAの実行をしてみましょう。1「開発」タブの「VBA」をクリックし実行したいマクロを選択し、「実行」をクリックします。2処理がされたことが確認できれば完了です。さいごにいかがでしょうか。VBAで指定数値から重複しない乱数を生成する方法についてまとめました。他にも便利な方法がありますので、よろしければご参照頂ければと思います。この記事の関連キーワードこちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。セル「スピル」の関連記事こちらの記事の内容「スピル」に関連する記事一覧です。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。VBA】指定時間にメールを自動送信する方法!タスクスケジューラや予定表から実行!RECOMMENDこちらの記事も人気です。380「プロパティの値が不正です。