出産前後の痔にはご注意!

Excelで書類を作っています。
行き詰ってしまったので、どなたか教えてください!
よろしくお願いいたします。

1~100の範囲(この範囲は1~3000まで変化します)で、重複しないランダムな数字をRANDやRANKを使って表示させました。

下記の例は5個表示させています。

表示数は1~50まで変化します。

ここまではできました。

問題はその右側の列に、左側の列と同じ条件の範囲で、しかも左側の列と重複しない数字を2個表示させるというのはできますでしょうか?

こちらも表示数は1~50まで変化します。



100

     5    2

 1   1    ☆
 2  18    ☆
 3  38
 4  62
 5  98
 6
 7
 8
 9
 ・
 ・
50

A 回答 (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 などで試してみましたがダメでした。)
   
    • good
    • 0
この回答へのお礼

回答ありがとうございました!
正に教えていただいた方法が知りたかったのです。
読んだ後すぐに書類も作成できました。

御気にされていた重複の件ですが、書類を使って作業する中で、重複していれば、すぐに分かるので、極々まれな現象であれば、全く許容の範囲内です。

本当にありがとうございました!

お礼日時:2007/07/09 14:49

#1です。



たびたびのコメントです。

2番目のコードのポイントは
A列にあらかじめA列+B列のランダム値を作っておいて、
あとで、分解するという方法です。

この考え方を応用というか、そのまま適応すれば、
もし、ree198888さんが、A列に関数で50行の重複しない
ランダム値を作成が完成しているのなら、
A列に最初から100行のランダム値を作っておいて、
あとで、後半の50行をB列に移動させればいいのではないでしょうか。

もちろん、セル参照してもいいでしょうし・・・

もっと早く気づけば良かったです。

この回答への補足

上記の方もka_na_de様だったんですね!!

勘違いして本当に申し訳ありません!

何から何までお世話になってしまって・・

本当にありがとうございました!

補足日時:2007/07/09 15:10
    • good
    • 0
この回答へのお礼

ka_na_de様

回答本当にありがとうございました!

こんなややこしく、分かりづらい質問に回答していただいて本当にありがとうございます。

最初に明記しておけばよかったのですが、Excelの知識は関数止まりなんです・・

回答していただいて、すぐ色々調べながら、書類を作成していたのですが、上記の方が関数での方法を教えてくださったので、その方法で作成しました。

教えていただいたマクロは、ちゃんと勉強してみたいと思います。

本当にありがとうございました!

お礼日時:2007/07/09 15:09

くどい表現だったので、改良してみました。



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
    • good
    • 0

こんにちは。



マクロでサンプルコードを記述してみました。
新しいブックの標準モジュールに登録して実行してみてください。

もし、関数で実現したいということであれば、この回答は無視してくださいね。

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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング