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

エクセルで重複しない組み合わせ出し方を教えいただきたいです。
14人のメンバーで二人ペアの重複しない組み合わせの一覧を出す方法はあるでしょうか?
仮に6人だとしたら15通りできて、AB, CD, EFの三つの組み合わせを1巡目とした時に、2巡目に1巡目ではペアにならなかった人と全員がペアにできるようになるのを3,4順目と繰り返したいです。
質問がわかりにくくて恐縮ですが、教えていただけると幸いです。

質問者からの補足コメント

  • 無知で申し訳ないのですが、マクロが何かわからないけれどお願いしたいです。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/01/13 18:14
  • マクロが実行されましたという表示を出すことができました。

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/01/13 20:28
  • HAPPY

    全パターン出力することができました!ありがとうございます!

    No.4の回答に寄せられた補足コメントです。 補足日時:2023/01/13 21:33

A 回答 (6件)

tatsumaru77さんの回答により、解決しているようなので、余計なお世話かもしれませんが、ご質問者のいう、



>仮に6人だとしたら15通りできて、AB, CD, EFの三つの組み合わせを
>1巡目とした>時に、2巡目に1巡目ではペアにならなかった人と全員
>がペアにできるようになる

という意味が競技会等のリーグ戦でいう「試合順」のことを意味しているのであれば、tatsumaru77さんのマクロとは異なる気がします。

EXCELでいずれかのセルに「=COMBIN(6,2)」と入力してみてくでさい。「15」と表示されるはずです。これは、6人から2人選ぶ組合せの数は15であることを意味しており、ご質問者の説明と一致しています。

次に、「=COMBIN(14,2)」と入力してみてくでさい。「91」と表示されるはずです。つまり、14人から2人選ぶ組合せの数は91であり、上記の14人のリーグ戦の試合数は91試合であるということになります。

従って、ご質問の意図がリーグ戦の試合順の意味と同等だとすると、91種類の組合せを列挙することになります。

単純に列挙するだけなら、それほど困難ではないのですが、ご質問者のいう1巡目、2巡目という考え方をいれるとちょっと工夫が必要になります。。
つまり、例えばA-B、A-C、A-D、A-E、A-F・・・のように数学的・機械的に列挙したとすると、Aさんは連続して13試合行うことになってしまうからです。
これを回避する方法をEXCEL数式で作成すると添付画像のようなものになると思います。

(1)一巡目は手入力でA~Nを添付画像のように入力します。
(2)二順目としてB2セルに入力したAを固定して、他のセルに入力された文字を時計回りにひとつづつ移動させます。
(3)そのための数式は添付画像を例にすると、B4セルに「=B2」、C4セルに「=B3」、D4セルに「=C2」を記述し、D4セルの数式をH4セルまで右方向へコピー、さらに、B5セルに「=C3」を記述し、G5セルまで右方向へコピー、最後にH5セルに「=H2」を記述します。
(4)三巡目以降は二巡目の「B4~H5」の範囲を選択した状態で下方向へオートフィル等で13巡目(14人から2人づつ【14÷2=7】の7試合を一巡として91試合を表示するので【91÷7=13】)までコピーします。

この手順で添付画像のような表が完成します。

この表の見方は、説明するまでもないと思いますが、一巡目の組合せは「A-N」「B-M」「C-L」「D-K」「E-J」「F-I」「G-H」の7組からスタートするということになります。
「エクセルで重複しない組み合わせの出し方」の回答画像6
    • good
    • 2

No4です。


もし、6人のケースで確認したいなら
persons = "ABCDEFGHIJKLMN" を
persons = "ABCDEF"
に変えてください。

人数を減らす分には構いませんので、その場合は偶数の人数になるようにしてください。
現在14人ですが、これ以上人数を増やすと劇的に所要時間が増えるので、
(たぶん終わらなくなります)やめておいた方が良いかと思います。
    • good
    • 0

以下のマクロを標準モジュールに登録してください。


結果はSheet1に出力されるので、空のSheet1を作成しておいてください。
こちらの環境では完了までに約1分半かかりました。

Option Explicit
Dim ctr As Long
Public Sub 組み合わせ()

Dim i As Long
Dim j As Long
Dim t1 As Double
Dim t2 As Double
Dim persons As String
t1 = Timer
ctr = 0
persons = "ABCDEFGHIJKLMN"
Application.ScreenUpdating = False
Call combination("", persons)
Application.ScreenUpdating = True
t2 = Timer
MsgBox ("完了 所要時間(秒)=" & t2 - t1)
End Sub

Private Sub combination(ByVal comb As String, ByVal persons As String)
Dim i As Long
Dim wcom As String
Dim wper As String
Dim p1 As String
Dim p2 As String
If Len(persons) = 0 Then
Call print_out(comb)
Exit Sub
End If
p1 = Mid(persons, 1, 1)
For i = 2 To Len(persons)
p2 = Mid(persons, i, 1)
wcom = p1 & p2
wper = get_remain(persons, p1, p2)
Call combination(comb & wcom & "|", wper)
Next
End Sub

Private Function get_remain(ByVal persons As String, ByVal p1 As String, ByVal p2 As String)
get_remain = persons
get_remain = Replace(get_remain, p1, "")
get_remain = Replace(get_remain, p2, "")
End Function

Private Sub print_out(ByVal comb As String)
Dim arr As Variant
Dim i As Long
If ctr = 0 Then
Worksheets("Sheet1").Cells.ClearContents
End If
ctr = ctr + 1
comb = Left(comb, Len(comb) - 1)
arr = Split(comb, "|")
For i = 0 To UBound(arr)
Worksheets("Sheet1").Cells(ctr, i + 1).Value = arr(i)
Next
End Sub
この回答への補足あり
    • good
    • 0

No2です。


追伸:
もし、マクロを実行するのは面倒なので、結果だけ、ほしいという場合は、
以下のようなテキストファイルをどこかにアップし、それをダウンロードしていただくことは可能です。
AB CD EF GH IJ KL MN
AB CD EF GH IJ KM LN
AB CD EF GH IJ KN LM
AB CD EF GH IK JL MN
AB CD EF GH IK JM LN
AB CD EF GH IK JN LM
・・・以下続く・・・・

テキストファイルでなく、excelのファイルが欲しいという場合は、
excelファイルでも可能です。(セキュリティを考えるとテキストファイルの方が安心かもしれません)
excelファイルの場合は、添付図のような内容になります。
「エクセルで重複しない組み合わせの出し方」の回答画像3
    • good
    • 0

>マクロが何かわからないけれどお願いしたいです。



まず、あなたの環境でマクロを実行できるようにする必要があります。
下記URLを参照して、その環境を設定してください。
https://office-hack.com/excel/macro-enable/

次に、マクロを登録します。
下記URLを参照して、登録及び実行を行ってください。
https://ecdtejun.work/archives/2877

サンプルのマクロです。これを登録して、実行してください。
Public Sub 試験()
MsgBox ("マクロが実行されました")
End Sub

実行すると添付図のようなメッセージが表示されます。
それで、完了です。
そのメッセージが表示されましたら、再度、その旨を補足してください。
「エクセルで重複しない組み合わせの出し方」の回答画像2
この回答への補足あり
    • good
    • 0

マクロで良いなら提供可能です。


こちらで14人でやってみると約13万5千通りになりました。
この回答への補足あり
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています