- ベストアンサー
テニス 乱数表
テニスのダブルスゲームのときに使う乱数表を作りたいと思うのですが、10人までならインターネットで検索すると出てくるのですが、16~20人のは見つかりません。 過去の質問Q352925に同じ質問が出ていたので見たのですが、そこにでている”参考にしたページ”が、すでになくなっていました。エクセルで作るのだと思いますが、教えてください。。パソコン初心者なので、こんなことも・・・と思うことが解からないかもしれませんが、よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 ヒマなのでwwwwマクロ作りました。すんげぇ長文レスなので覚悟してくださいw そもそも乱数表というものがよく判らないのですが、組み合わせの条件が相当複雑になります。 例えば下記のURL先の乱数表を見てください。 http://www.geocities.jp/ttc1jp/order.html これの9人の列を見てほしいんですが、2コートで実施した場合、9回,10回目のところで 6番さんが両コートでプレイしなければならなくなります。 9人などコート数が2コートだけで良いのであればこういうのも排除できるんですが、 13人以上で2コートでも3コートでも出来てしまう場合、乱数表だけでは必ず6番さんのような 重複が発生してしまいます。 そこで、乱数表のフォーマットからちょびっと外れるかも知れないんですが、 (1) 最初にコート数を指定する (2) 前回参加できなかった人(見学者)は次回に優先的に参加できる (3) ひとりの人を同時に別コートで試合という無茶はさせない (4) ランダムにこだわる というマクロを作ってみました。 【つかいかた】 <マクロ準備編> (1)新規ブックを開き、とりあえず名前をつけて保存します。『てにす乱数表.xls』にしましょうか。 (2)メニューバーから、ツール→マクロ→Visual Basic Editorを選択します。 Visual Basic Editorが起動します。 (3)左側に「VBAProject(てにす乱数表).xls」というのがあると思います。 ツリー状になっていて、左の[+]で展開していくと、「ThisWorkbook」という ものが表示されると思います。 (4)その「ThisWorkbook」をダブルクリックします。 右側に「~~.xls - Thisworkbook(コード)」というウインドウが表示されます。 (5)そこに、下記のコードをコピー&ペーストしてください。 (6)Visual Basic Editorを閉じます。 (7)ここで一旦上書き保存しておきましょう。 <データ準備編> (1)セルA1に、コート数を入力してください。数字でお願いします。 (2)セルB1から横方向に、人数を入れていってください。 (3)セルA2から縦方向に、試合数を入れていってください。 こんなかんじ _A__B_C_D__E__F__G__H__I__J__K 1| 3 5 6 7 8 9 10 11 12 13 14… 2| 1 3| 2 4| 3 5| 4 6| 5 7| 6 : <データ作成編> (1)メニューバーから、ツール→マクロ→マクロ と選択してください。 (2)実行するマクロの一覧に「ThisWorkbook.乱数表作成」というのがでるので、 それを選択して「実行」してください。 (3)砂時計が消えたら完成です。 このマクロは実行するたびに結果が変わります。気に入らなかったら何度でも やり直してください。 また、全セルを消去すれば、データ準備からやり直すことも出来ます。 好きな表をいくつでも作ってください。 ちなみに100人とかデータ数がえらく膨大になると、なかなか計算が終わりませんので。 その場合は気長に待ってください。 '-----マクロ ここから----- Sub 乱数表作成() Dim iRow As Integer Dim iCol As Integer Dim iCnt As Integer Dim iCnt2 As Integer Dim iTmp As Integer Dim sNum() As String Dim bChk() As Boolean Dim bChk2() As Boolean Dim bFull As Boolean Dim iCourt As Integer iCol = 2 Do Until Cells(1, iCol) = "" iRow = 2 If Cells(1, 1) * 4 > Cells(1, iCol) Then iCourt = Round(Cells(1, iCol) / 4 - 0.5, 0) Else iCourt = Cells(1, 1) End If ReDim sNum(iCourt * 4 - 1) ReDim bChk(Cells(1, iCol)) ReDim bChk2(Cells(1, iCol)) For iCnt = 1 To Cells(1, iCol) bChk(iCnt) = True bChk2(iCnt) = True Next iCnt Do Until Cells(iRow, 1) = "" iCnt = 0 Do Until iCnt = iCourt * 4 iTmp = Round(Rnd(Second(Now)) * Cells(1, iCol) + 0.5, 0) If bChk(iTmp) And bChk2(iTmp) Then sNum(iCnt) = "[" & Trim(Str(iTmp)) & "]" iCnt = iCnt + 1 bChk(iTmp) = False bChk2(iTmp) = False bFull = False For iCnt2 = 1 To Cells(1, iCol) bFull = bFull Or bChk(iCnt2) Next iCnt2 If bFull = False Then For iCnt2 = 1 To Cells(1, iCol) bChk(iCnt2) = True Next iCnt2 End If End If Loop Cells(iRow, iCol) = sNum(0) For iCnt = 1 To iCourt * 4 - 1 Select Case iCnt Mod 4 Case 0 Cells(iRow, iCol) = Cells(iRow, iCol) & Chr(10) & sNum(iCnt) Case 2 Cells(iRow, iCol) = Cells(iRow, iCol) & ":" & sNum(iCnt) Case Else Cells(iRow, iCol) = Cells(iRow, iCol) & sNum(iCnt) End Select Next iCnt For iCnt = 1 To Cells(1, iCol) bChk2(iCnt) = True Next iCnt iRow = iRow + 1 Loop iCol = iCol + 1 Loop End Sub '-----マクロ ここまで----- あー面白かったw ナイス暇つぶし。 解らないところがあったら聞いてください。
その他の回答 (3)
- dejiji-
- ベストアンサー率38% (327/858)
A列はA1に1を入れる。セルの右下にカーソルを合わせると黒十字のカーソルに変化する。これを必要なところまでドラッグして離し、連続データをクリックすると連続した数値が出る。 B1に=RAND()と入れ、A列と同じ状態の黒十字を出し、今度は左クリックをして、下までドラッグ。(これでコピーできる。) C1には一つずつ名前を入れる。 これで、A列の左上をクリックしてC列の右下までドラッグする。 これでセルの色が変わります。この状態でデータ→並べ替えを実行すれば、できます。 健闘を祈る!!
お礼
本当に丁寧に教えていただいてありがとうございます。 順不同で、ばらばらに並べ替えることが出来ました。 テニスのダブルス対戦表は、riodさんのやり方で作ることが出来ました。組み合わせ、並び替えなど、遠い昔の数学のようで、頭が痛くなりましたが、今回の経験で、私ももっとエクセルの事を知りたくなりました。 回答を寄せていただいた皆さんに感謝します。ありがとうございました。
- dejiji-
- ベストアンサー率38% (327/858)
>RANDの後の()の中には 何も入れません。こういう関数もあるのです。 これで、入れた範囲を選択して、データ→並べ替えで優先されるキーにRANDを入れた列を選択して改行で変化します。 あとRANDは何か確定するたびに(改行などを押す)変化します。また並べ替えた時も、数値順に並びません。ただし、ばらばらに入れ替わります。
お礼
ありがとうございます。TOngTOngさんに教えていただいて、途中になっている表でやってみていますが・・・本当に初心者で申し訳ないですー入れた範囲を選択して、とあるのは、A列にいれた1から18を選択するのですか?また、RANDを挿入するのはB1セルでいいのですか? わからないことだらけの私ですが、親切な方がたくさんいるのだ、と初めてこの掲示板を利用して感激しています。
- T0ngT0ng
- ベストアンサー率40% (8/20)
たとえば A列にメンバの名前 B列に=rand() (乱数生成関数) としてメンバ表を作ってB列のどこかを選択した状態で整列。 上から2人ずつペアにしていく。とかではどうでしょう?
お礼
早速ありがとうございます。エクセルを開いて、A列に18人でゲームをするとして、1~18まで入れて、B1のセルに挿入→関数→RAND までしました。RANDの後の()の中には何を入れたらいいのですか? 本当に初歩的な質問で申し訳ありません。よろしくお願いします。
お礼
ありがとうございます。 すごく難しそうに感じますが・・・今からこれをプリントして、頑張ってやってみようと思います。ゲームのやり方としては、18人のダブルスの対戦表を作っておいて、(全ての組み合わせで)それを長い期間で消化していって、個人別に勝ち点をつけよう、という目的で使います。ダブルスなので常に2人は休みになる前提です。そうすると・・・コート数は4で作ってみれば大丈夫ですか?