- ベストアンサー
Excelで重複しない数字を表示する方法
- Excelで1~100の範囲内で重複しないランダムな数字を表示させる方法を教えてください。
- また、左側の列と同じ条件の範囲で右側の列に重複しない数字を2個表示させる方法も教えてください。
- 表示数は1~50まで変化します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 関数での方法を示します。 A1に =RAND() と入力し、A2~A100にコピー&ペースト B1に =RANK(A1,$A$1:$A$100) と入力し、B2~B5までコピー&ペースト C1に =RANK(INDIRECT("A"&100+1-ROW()),$A$1:$A$100) と入力し、C2にコピー&ペースト これで、1~100のランダム値が B列に5個、C列に2個、重複せずに表示されます。 A列にあらかじめ3000個の乱数を用意し、 数式内の100という数字を3000に変更すれば応用できます。 また、B列C列のペースト数を増やせば表示数も変更可能です。 ただし、B列+C列がA列の元データを超えないようにしてください。 超えた場合は確実に重複したデータが発生します。 尚、A列がうっとうしいのであれば、A列選択後に 「書式」「列」「表示しない」をクリックしてください。 注意)無視できるほど極めて低い確率の話ですが、 RAND関数は、重複する数字が発生する可能性があります。 RANK関数ではそれらを同順位として判定するので、 結果的にB列C列に重複した値が発生する可能性は 否定できません。 極々まれな現象ですが、許されないのであれば マクロで確実に重複をチェックしたほうが良い かと思います。 ( =RAND()+ROW()/10^20 などで試してみましたがダメでした。)
その他の回答 (3)
- ka_na_de
- ベストアンサー率56% (162/286)
#1です。 たびたびのコメントです。 2番目のコードのポイントは A列にあらかじめA列+B列のランダム値を作っておいて、 あとで、分解するという方法です。 この考え方を応用というか、そのまま適応すれば、 もし、ree198888さんが、A列に関数で50行の重複しない ランダム値を作成が完成しているのなら、 A列に最初から100行のランダム値を作っておいて、 あとで、後半の50行をB列に移動させればいいのではないでしょうか。 もちろん、セル参照してもいいでしょうし・・・ もっと早く気づけば良かったです。
お礼
ka_na_de様 回答本当にありがとうございました! こんなややこしく、分かりづらい質問に回答していただいて本当にありがとうございます。 最初に明記しておけばよかったのですが、Excelの知識は関数止まりなんです・・ 回答していただいて、すぐ色々調べながら、書類を作成していたのですが、上記の方が関数での方法を教えてくださったので、その方法で作成しました。 教えていただいたマクロは、ちゃんと勉強してみたいと思います。 本当にありがとうございました!
補足
上記の方もka_na_de様だったんですね!! 勘違いして本当に申し訳ありません! 何から何までお世話になってしまって・・ 本当にありがとうございました!
- ka_na_de
- ベストアンサー率56% (162/286)
くどい表現だったので、改良してみました。 Sub test2() Dim i As Integer Dim k As Integer Dim flg As Integer Dim Lt_Row_Num As Integer Dim Rt_Row_Num As Integer Dim Try_Val As Integer Dim Rnd_Num As Integer Lt_Row_Num = 5 '左のA列の行数 Rt_Row_Num = 2 '右のB列の行数 Rnd_Num = 100 'ランダムな数字の値の範囲(最大値) '不適切な初期値の判定 If Rt_Row_Num + Lt_Row_Num > Rnd_Num Then GoTo ErrorTrap Range("A:B").ClearContents Cells(1, "A").Value = Int(Rnd() * Rnd_Num + 1) For i = 2 To Lt_Row_Num + Rt_Row_Num flg = 0 Do Try_Val = Int(Rnd() * Rnd_Num + 1) For k = 1 To i - 1 If Cells(k, "A").Value = Try_Val Then Exit For If k = i - 1 Then flg = 1 Next k Loop Until flg = 1 Cells(i, "A").Value = Try_Val Next i Range("B1:B" & Rt_Row_Num).Value = Range("A" & Lt_Row_Num + 1 & ":A" & Lt_Row_Num + Rt_Row_Num).Value Range("A" & Lt_Row_Num + 1 & ":A" & Lt_Row_Num + Rt_Row_Num).ClearContents Exit Sub ErrorTrap: MsgBox "初期値が不正です。" End Sub
- ka_na_de
- ベストアンサー率56% (162/286)
こんにちは。 マクロでサンプルコードを記述してみました。 新しいブックの標準モジュールに登録して実行してみてください。 もし、関数で実現したいということであれば、この回答は無視してくださいね。 Sub test() Dim i As Integer Dim j As Integer Dim k As Integer Dim flg As Integer Dim Lt_Row_Num As Integer Dim Rt_Row_Num As Integer Dim Try_Val As Integer Dim Rnd_Num As Integer Lt_Row_Num = 5 '左のA列の行数 Rt_Row_Num = 2 '右のB列の行数 Rnd_Num = 100 'ランダムな数字の値の範囲(最大値) '不適切な初期値の判定 If Lt_Row_Num > Rnd_Num Then GoTo ErrorTrap If Rt_Row_Num > Rnd_Num - Lt_Row_Num Then GoTo ErrorTrap '左のA列 Range("A:A").ClearContents Cells(1, "A").Value = Int(Rnd() * Rnd_Num + 1) For i = 2 To Lt_Row_Num flg = 0 Do Try_Val = Int(Rnd() * Rnd_Num + 1) For k = 1 To i - 1 If Cells(k, "A").Value = Try_Val Then Exit For If k = i - 1 Then flg = 1 Next k Loop Until flg = 1 Cells(i, "A").Value = Try_Val Next i '右のB列 Range("B:B").ClearContents For j = 1 To Rt_Row_Num flg = 0 Do Try_Val = Int(Rnd() * Rnd_Num + 1) For i = 1 To Lt_Row_Num If Cells(i, "A").Value = Try_Val Then Exit For If i = Lt_Row_Num Then flg = 1 Next i For k = 1 To j - 1 If flg = 0 Or j = 1 Then Exit For If Cells(k, "B").Value = Try_Val Then flg = 0 Exit For End If Next k Loop Until flg = 1 Cells(j, "B").Value = Try_Val Next j Exit Sub ErrorTrap: MsgBox "初期値が不正です。" Exit Sub End Sub
お礼
回答ありがとうございました! 正に教えていただいた方法が知りたかったのです。 読んだ後すぐに書類も作成できました。 御気にされていた重複の件ですが、書類を使って作業する中で、重複していれば、すぐに分かるので、極々まれな現象であれば、全く許容の範囲内です。 本当にありがとうございました!