あらかじめ用意してある100個の単語を、
100個のセル(A1~J10)に、
ランダムに配置させたいのですが、
どのような関数・手順で行えばよいでしょうか?
要は、ボタンを押すなどのアクションを行うたびに、
100個の単語をランダムに配置させたいのです。
質問がわかりにくくて恐縮ですが、
よろしくお願いいたします。
http://www.relief.jp/itnote/archives/001798.php
ちょっと面倒な方法ですが。
まず、別シートに下図のような100個の単語のリストを作ります。
(1行)rank(A列) random(B列) 単語(C列)
(2行)3 0.781673996 単語1
(3行)55 0.561949554 単語2
(4行)27 0.117892303 単語3
(5行)8 0.031631073 単語4
…
(101行)91 0.168868717 単語100
B列には数式 =RAND()を入れ、ランダムな数を作ります。
A2に =RANK(B2,$B$2:$B$101)を入れ、下までずーっと伸ばしていくと
B列に入っているランダム数の、大きさの順位が出てきます。
重複のない乱数を作るためにこの操作をします。
あとはメインのシートに
=VLOOKUP(1,別シート!$A$2:$C$101,3,FALSE)
=VLOOKUP(2,別シート!$A$2:$C$101,3,FALSE)
=VLOOKUP(3,別シート!$A$2:$C$101,3,FALSE)
…
を入れていけばできると思います。
F9キーを押して再計算させれば、順番もランダムに変わると思います。
説明へたですみません。
<<前提条件>>
1.もとになる単語100個を選択しておく
2.コピー先の範囲が(A1:J10)であり、データは空である事
*コマンドボタンに関数を割り当てるところは割愛します
考え方としては、乱数で生成された値を10行10列の値に変換し、そこから後ろに向かってコピー先でデータがまだ入ってないところを探して行き、あいていたらそこにデータをコピーする。
という方針で作りました。
Dim a As Range
Dim i As Integer
Dim j As Integer
Dim iRow As Integer
Dim iCol As Integer
Randomize (Now) '乱数のSeedを毎回変えるため
For Each a In Selection
i = Int(Rnd() * 100)
'0-100までの乱数を10行10列の値に変換するところ(コピー元が10行10列だから)
iRow = Int(i / 10) + 1
If iRow > 10 Then
iRow = 1
End If
iCol = Int(i Mod 10) + 1
For j = 0 To 99
If iCol + j > 10 Then '列がJ列より外側をさしてたら先頭に戻す
iCol = -j + 1
iRow = iRow + 1
If iRow > 10 Then '行が10列より外側を指していたら先頭にもどす
iRow = 1
End If
End If
If Worksheets(2).Cells(iRow, iCol + j).Value = "" Then
Worksheets(2).Cells(iRow, iCol + j).Value = a.Value
Exit For
End If
Next j
Next a
■方式案
Excelの関数、randを使えば良いと思います。
randで作成したランダムな値を元に、100個の単語を並び替え(ソート)すれば、単語の並びをランダムにできます。
■手順例
①セルA1に下記の式
=RAND()
を代入して下さい。0以上1未満の値が表示されるはずです。
②セルA2~A100にもセルA1と同じ式を代入して下さい。
その際、セルA1を選択し、フィルハンドルにより一気に代入すると便利です。
http://excimer.hp.infoseek.co.jp/HP-Excel/e-FillN.htm
③セルB1~B100に、対象の単語を貼り付けてください。
④セルA1~B100を、行Aの値を基準に並べ替えてください。
すると、100個の単語がランダムに並び替えられます。
⑤最後に、A1~J10に単語を10ずつ切り取り配置します。
■課題
randは、
http://www.relief.jp/itnote/archives/001798.php
ちょっと面倒な方法ですが。
まず、別シートに下図のような100個の単語のリストを作ります。
(1行)rank(A列) random(B列) 単語(C列)
(2行)3 0.781673996 単語1
(3行)55 0.561949554 単語2
(4行)27 0.117892303 単語3
(5行)8 0.031631073 単語4
…
(101行)91 0.168868717 単語100
B列には数式 =RAND()を入れ、ランダムな数を作ります。
A2に =RANK(B2,$B$2:$B$101)を入れ、下までずーっと伸ばしていくと
B列に入っているランダム数の、大きさの順位が出てきます。
重複のない乱数を作るためにこの操作をします。
あとはメインのシートに
=VLOOKUP(1,別シート!$A$2:$C$101,3,FALSE)
=VLOOKUP(2,別シート!$A$2:$C$101,3,FALSE)
=VLOOKUP(3,別シート!$A$2:$C$101,3,FALSE)
…
を入れていけばできると思います。
F9キーを押して再計算させれば、順番もランダムに変わると思います。
説明へたですみません。
とても近い気がします。
単語100は、テキストファイルか、
同一シート状の空いたセル上に配置しておく予定です。