Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


61674 / 76738 ←次へ | 前へ→

【19678】Re:教えてください
発言  ichinose  - 04/11/14(日) 0:15 -

引用なし
パスワード
   ゆか さん、皆さん、こんばんは。


>エクセル初心者です。
>例えば、A、B、C、D 4つのアルファベットを、二組に分けたものの組み合わせを全て表示させるようなプログラムを作りたいのですが、探してもアイデアが見つかりません。
>どなたかわかる方教えてください。
この問題は、組合せリストを作成するアルゴリズムがネックですよね!!
例えば、例題のようにメンバがA、B、C、Dの場合だと
A組 : B組のメンバ数が
 1 : 3
 2 : 2

という組合せがあります。

1:3の場合は、Combin(4,1)=4の組合せ数になりますが、
2:2の場合は、Combin(4,2)/2=3の組合せ数になりますよね?
(Combinについては、ワークシート関数を参照して下さい)
基本的には、総リストから1を選ぶ組合せ、2つを選ぶ組合せのリストを作成し、
残ったメンバがもう一組のメンバと言う事になりますが、

既に投稿されいるように

1:3の場合は、4つから1つを選ぶ組合せリストを作成すると
     残り
A    BCD
B    ACD
C    ABD
D    ABC

でも、2:2の場合は、4つから2つを選ぶ組合せリストを作成すると

4つから2つを選ぶ組合せリストを作成すると
     残り
1 AB    CD
2 AC    BD
3 AD    BC
4 BC    AD
5 BD    AC
6 CD    AB

とダブりが生じるのでここの工夫が必要ですが、これは帰納的な発想をすると、
上記の1(AB)と6(CD)、2と5、3と4 という組を形成できます。

「アイデア」とあったので、全部のコードは載せませんが、
組合せだけ・・・・。
実は、組合せはここのサイトで以前にも質問がありまして、

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=16249;id=excel

こんな方法でも可能だし、場合によっては、これの方が都合の良い事も有るのですが、
私の勉強も兼ねて別解で作りました。

'============================
Sub test()
Dim 組合せ
組合せ = combin_list(Array("a", "b", "c", "d"), 2)
Range(Cells(1, 1), Cells(UBound(組合せ, 1) - LBound(組合せ, 1) + 1, 2)).Value = 組合せ
End Sub
'========================================
Function combin_list(総リスト, 抜取り数, Optional ByVal nest As Long = 0, Optional ByVal st As Long = 0)
'組合せリストを作成する
'input :総リスト----組合せリストを作成する元リスト(1次元の配列)
'    抜取り数----組合せ抜取り数
' nest及び、stは、指定不可 内部で使用するパラメータ
'output:combin_list---組合せリスト2次元配列
  Static ans()
  Static idx() As Long
  Static jdx As Long
  If nest = 0 Then
   jdx = 0
   ReDim idx(抜取り数 - 1)
   ReDim ans(WorksheetFunction.Combin(UBound(総リスト) - LBound(総リスト) + 1, 抜取り数) - 1, 抜取り数 - 1)
   st = LBound(総リスト)
   End If
  For idx(nest) = st To UBound(総リスト)
   If nest < 抜取り数 - 1 Then
     Call combin_list(総リスト, 抜取り数, nest + 1, idx(nest) + 1)
   Else
     For kdx = 0 To 抜取り数 - 1
      ans(jdx, kdx) = 総リスト(idx(kdx))
      Next kdx
     jdx = jdx + 1
     End If
   Next
  If nest = 0 Then
   combin_list = ans()
   End If
End Function

これでnCrの組合せリストの作成は可能です。

後は、呼び出し元で、抜取り数が1のとき、2のときの残りのメンバを作成する方法
を上記を参考にして考えてみて下さい。
0 hits

【19670】教えてください ゆか 04/11/13(土) 16:49 質問
【19673】Re:教えてください Kein 04/11/13(土) 20:22 発言
【19675】Re:教えてください [名前なし] 04/11/13(土) 21:07 発言
【19678】Re:教えてください ichinose 04/11/14(日) 0:15 発言
【19679】Re:教えてください ちゃっぴ 04/11/14(日) 11:34 回答
【19680】Re:教えてください ちゃっぴ 04/11/14(日) 13:56 発言
【19691】ありがとうございます ゆか 04/11/15(月) 12:06 お礼
【19710】教えてください ゆか 04/11/15(月) 16:48 質問
【19946】Re:教えてください hamar 04/11/19(金) 18:39 回答
【19951】Re:教えてください ちゃっぴ 04/11/19(金) 22:15 回答
【19953】Re:教えてください ちゃっぴ 04/11/19(金) 22:21 発言
【19957】Re:教えてください ichinose 04/11/20(土) 0:29 発言
【19958】Re:教えてください ちゃっぴ 04/11/20(土) 0:33 発言
【19959】Re:教えてください 追伸 ichinose 04/11/20(土) 1:22 発言
【20041】ありがとうございました! ゆか 04/11/25(木) 11:42 お礼

61674 / 76738 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free