アプリ版:「スタンプのみでお礼する」機能のリリースについて

5人のとき(5のひとは1回不戦)
1ー2 3 4 5
2ー1 4 3 5
3ー4 1 2 5
4ー3 2 1 5
5ー4 3 2 1

6人のとき
1ー2 3 4 5
2ー1 6 3 4
3ー5 1 2 6
4ー6 5 1 2
5ー3 4 6 1
6ー4 2 5 3

7人のとき(7の人は1回不戦)
 1-2 3 4 5
 2-1 7 3 4
 3-6 1 2 7
 4-5 6 1 2
 5-4 6 7 1
 6-3 4 5 7
 7-5 2 6 3
 これをエクセルにして名前をいれたらだれとだれが対戦すればいいのかお年寄りにもすぐにわかるようにしたいとおもっております。なお日曜の10時受付終了で10:10開始で直前まで何人になるのかわからないため名前を入力する際に何人のときでも対応できるようにしたいとおもっています。
よろしくおねがいします。

A 回答 (5件)

これ、表の見方が分かりません。

(^_^;)
5名の場合、「各人1回ずつ休んで総当り」なんでしょうが、誰といつ組むのかはっきりしません。
で、独自に対戦表を組んでみました。
添付画像のようにすれば、初めに誰とペアを組むのか、どこで休みになるのか分かりやすいと思います。

 名前は『vlookup』を利用しています。
対戦相手に対応する番号を、名前を表示したいマスの左隣に入れてあります。
例としてc2に「2」を入れてあります。
これは1(あきた)が1回戦に当たる相手の番号を示しています。
その右となりd2には『=VLOOKUP(C2;$A$2:$B$6;2)』が入っています。
これの意味を説明します。
A2からB6の行列があり、その一番左端(この場合A列)の上から順に『c2』と同じものを探して、同じものがあったらその段の左から『2』列目のものをここ(d2)に表示しなさい。
なおコピーしやすいように行列指定は絶対参照($を付けると絶対参照)にしてあります。

これと同じもの(c2の部分は対応するマスに変えてください。)を名前を表示したいマスに入れれば、B列の名前を書き換えるだけで、全部の名前を書き換えることができます。

 6・7名の場合も、どのタイミングで誰が休むのかなど解読できたら組んでみたいと思います。(その前に締め切られるかも(^_^;))
「総当りではない対戦表 将棋 時間がかぎら」の回答画像1
    • good
    • 0

追記


最大参加人数まで各シートに対戦表を作っておく。
「5名」シートに5名対戦表、「6名」シートに6名対戦表・・・最大人数対戦表
各対戦表は、先の例のように『VLOOKUP』を使用して名前を埋められるようにしておく。
 当日は、最大人数のシート(シート名を仮に「100名」とする)の名前記入欄(先の添付画像であればB列)に、先着順で上から順に名前を入れる。
他のシートのB列では例えばB2に『=100名!B2』と入力する。
これは「ここに『100名』シートのB2に入っているものを入れる」ということです。
http://www.relief.jp/itnote/archives/001800.php

 こうした仕掛けを各シートにしておけば、締め切った後に当日の人数に当たるシートを開けば対戦表の各箇所に名前が埋まります。
    • good
    • 0

更に追記


6名対戦の場合、元の表通りで休みを入れることなく実施できるので省略。
7名対戦の場合、適度に休みを入れないと二面指しが発生するので、当たり順も含めて変えてみた。(対戦相手は変えてない)
「総当りではない対戦表 将棋 時間がかぎら」の回答画像3
    • good
    • 0
この回答へのお礼

たいへんありがとうございました。とても実用的なエクセル表を
つくることができましたです。
ちなみに16人まで組み合わせ表があり
組み合わせは
15人は
1-2 3 4 5
2-1 3 4 6
3-5 2 1 7
4ー6 2 1 8
5ー3 1 7 8
6-4 2 7 9
7-10 5 6 3
8-11 5 4 12
9-13 10 11 6
10ー7 9 12 14
11-8 9 13 15
12-14 10 8 15
13-9 11 14 15
14-12 10 13 15
15-11 12 13 14
となっています。
ただクラスがA  B Cありひとつのクラスが
12人も集まることはないので12人までしかつくって
いません。
あと実際はチェスクロック(時計)を使わない将棋部会なので
終わり次第どんどん対戦相手と将棋をさして適当なところで
弁当をたべるので実際にはどこに休みをいれるかはあまり意識
はしていません。
ただ、この表をつくるにあたってどこに休みをいれれば
一番効率てきなのかは興味があるところです。
久しぶりにエクセルをさわって大変勉強になりました。
将棋部会のお年寄りの方も大変喜んでくれるでしょう。

お礼日時:2016/04/05 10:16

雰囲気以下でどうなりますか



標準モジュールに記述して、
参加者氏名をアクティブシートの A1 ~ Axx に入力後、
Samp1 実行で、4回戦までのリーグ表もどきが C 列以降に出力されます

これは、ほぼ1年前の以下

エクセルでの重複しない抽出方法について
http://oshiete.goo.ne.jp/qa/8961968.html

の #1 回答時に作ってみていたものを4回戦まで用に・・・・
(表示状況等は上記を参考にしてください)
ただ、その時には求め切れないチーム数もありましたが、
4回戦程度までならソコソコいけるかも・・・

※ 前提条件として、戦える環境はあること
8人の時、盤が3つしかないとか・・・これはナシということで


Option Explicit

Public Sub Samp1()
  Dim vA As Variant, vB As Variant, vC As Variant
  Dim vG As Variant, v As Variant
  Dim iA() As Long
  Dim iP As Long, iM As Long
  Dim i As Long, j As Long, k As Long
  Const CFIGHT As Long = 4

  vA = WorksheetFunction.Transpose( _
      Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value)
  ReDim vB(1 To UBound(vA), 1 To UBound(vA))
  iM = UBound(vA) Mod 2
  If (iM > 0) Then ReDim vC(1 To UBound(vA), 1 To 2)

  j = UBound(vA)
  If (j > CFIGHT) Then j = CFIGHT
  For i = 1 To j
    ReDim iA(1 To UBound(vA))
    ReDim vG(1 To UBound(vA) \ 2 + 1, 0 To 2)
    If (iM > 0) Then
      j = UBound(vA) - i + 1
      iA(j) = -1
      vC(i, 1) = i
      vC(i, 2) = vA(j)
    End If
    iP = 1
    While ((iP > 0) And (iP <= UBound(vA) \ 2))
      If (vG(iP, 1) = 0) Then
        If (iP = 1) Then
          vG(iP, 0) = iA
        Else
          iA = vG(iP - 1, 0)
          iA(vG(iP - 1, 1)) = -1
          iA(vG(iP - 1, 2)) = -1
          vG(iP, 0) = iA
        End If
        For j = 1 To UBound(iA)
          If (iA(j) = 0) Then Exit For
        Next
        vG(iP, 2) = j
      Else
        iA = vG(iP, 0)
        j = vG(iP, 1)
      End If
      For k = vG(iP, 2) + 1 To UBound(iA)
        If ((iA(k) = 0) And (vB(j, k) = 0)) Then
          vG(iP, 1) = j
          vG(iP, 2) = k
          iP = iP + 1
          vG(iP, 1) = 0
          Exit For
        End If
      Next
      If (k > UBound(iA)) Then iP = iP - 1
    Wend
    If (iP > 0) Then
      For j = 1 To iP - 1
        vB(vG(j, 1), vG(j, 2)) = i
        vB(vG(j, 2), vG(j, 1)) = i
      Next
    End If
  Next

  With Range("C1")
    .Resize(, UBound(vA) + 3).EntireColumn.Clear
    With .Offset(, 1)
      .Value = "氏名"
      .Offset(, 1).Resize(, UBound(vA)) = vA
      .Offset(1).Resize(UBound(vA)) = _
          WorksheetFunction.Transpose(vA)
      .Offset(1, 1).Resize(UBound(vA), UBound(vA)) = vB
      With .CurrentRegion
        .Columns(1).Interior.ColorIndex = 36
        .Rows(1).Interior.ColorIndex = 36
        .Borders.LineStyle = xlContinuous
      End With
    End With
    If (iM > 0) Then
      With .Offset(UBound(vA) + 2)
        .Value = "休"
        With .Offset(1).Resize(UBound(vA), 2)
          .Value = vC
          .Borders.LineStyle = xlContinuous
        End With
      End With
    End If
    With .Resize(, UBound(vA) + 2).EntireColumn
      .HorizontalAlignment = xlCenter
      .AutoFit
    End With
  End With
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。ただ正直難しすぎてよくわかりません。

お礼日時:2016/04/05 10:18

#4です



勘違いしていたようです

> 4回戦

ということで、4回戦する時間帯での組合せを求めていましたが、
1人が4対戦・・・時間帯的には、5回戦分なのですね

提示した処理で奇数人の場合、回戦毎に休む人を切り替えてましたが、
最後に、対戦数の少ない休みの人たちで組合せを組もうとした時、
それまでの処理で既に組合せを使っている場合があり、
きれいに4対戦を組むことができてませんでした
捨ててください


※ 以下はどのように読むことが正しいのでしょうか

> 組み合わせは
> 15人は
> 1-2 3 4 5
> 2-1 3 4 6

1番目の人は、1回戦は2の人、2回戦は3の人・・・
なら、
2番目の人の2回戦目は、3の人が終わるまで待つ?
11番~14番の4回戦目は、15の人?
15番目の人は、3回戦分は見てるだけ?
7回戦分の時間帯がある?


リーグ戦もどきで4回戦しかしないのなら、
リーグ戦表を記述して
1回戦目の対戦のみを指示して
終わった人から、リーグ戦表上で対戦を決めていけば・・・
15人とかなら、
終わった人群から対戦相手が見つからない・・・少ないように思います

運用的には、この表が大きな紙に書かれていて、
磁石で掲示していたとした場合、例えば
・左の氏名部分に磁石
・1回戦目の相手を確認し・・・
★・対戦中は、その行の対戦相手の所に磁石移動
・終わったら、その部分に結果を記述して
・左の氏名部分に磁石移動
・氏名部分に磁石のある人の対戦状況をみて未対戦なら ★へ

以上 失礼しました
    • good
    • 0

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