- 締切済み
excelで重複しない組合せ全通りをだしたい
excel:macを使っています。 例えばA.B.Cと各セルにあって、 そこから重複なしで全通り作りたいのです。 3の階乗なので6通りになると思います。 A.B.C A.C.B B.A.C B.C.A C.A.B C.B.A 以上 マクロの使い方がわからないので、 出来れば関数で教えていただけると有り難いです。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- bunjii
- ベストアンサー率43% (3589/8249)
>例えばA.B.Cと各セルにあって、そこから重複なしで全通り作りたいのです。 >3の階乗なので6通りになると思います。 そうですね。階乗を求める関数は回答No.1に提言されているPERMUT関数で求められ、PERMUT(3,3) → 6 となります。 >出来れば関数で教えていただけると有り難いです。 その6種類の組みわせを1つの数式で求めることは無理かと思われます。 作業用の表を作成して最終的に6種類の組み合わせを求めることは可能です。 貼付画像のように元の文字をA1:A3に入力し、B1セルへ次の数式を設定します。 =INDEX($A$1:$A$3,MOD(COLUMNS($B1:B1)-ROW(),3)+1) B1セルをオートフィルで右へC1までコピーし、そのまま、下へC3までコピーします。 次いで、E1セルへ次の数式を設定します。 =B1&C1&D1 E1セルをE3までコピーします。 更に、B4セルへ次の数式を設定します。 =B1&B2&B3 B4セルをD4セルまでコピーします。 E1:E3の範囲とB4:D4の範囲を他のセルへ値のみコピーする方法で良いと思います。 行方向のデータを列方向に貼り付けるときは形式を指定して「行列を入れ替える」を選択します。
- imogasi
- ベストアンサー率27% (4737/17069)
>マクロの使い方がわからないので、出来れば関数で教えていただけると有り難いです。 ーー だから下記は質問者には意味がないかと思う。 エクセル関数で説明してほしいということだろう。 しかし、エクセル関数での回答は、おいそれとは、出ないだろう。 エクセルは数を数えるのは得意で簡単なばあいが多い。 順列の数は Sub test03() MsgBox Application.WorksheetFunction.Permut(5, 5) End Sub や エクセルのPERMUT関数で出せる。 しかし変数を使えない関数では、本件は、式が複雑になるだろう。 もし関数の回答が出て、それほど雑な式でなく、短いものなら、その回答者に、本当に感謝してください。 === >重複しない組合せ全通り は順列の問題ではないかと思う。 この点間違っていたらすみません。-->本回答はスルーしてください。 ーー あえて掲げる理由は、 将来この質問と似た質問を考えて、VBAでもよいと、WEB照会する人が出れば、参考にしてもらおうと、下記を挙げてみました。 下記は、https://excel-ubara.com/excelvba5/EXCELVBA264.html を借用しました。 Public Sub permutation(ByRef aryIn, ByRef aryOut, Optional ByVal i As Long = 0) Dim j As Long Dim ix As Long Dim sTemp Dim ary If i < UBound(aryIn) Then For j = i To UBound(aryIn) '配列を入れ替える ary = aryIn sTemp = aryIn(i) aryIn(i) = aryIn(j) aryIn(j) = sTemp '再帰処理、開始位置を+1 Call permutation(aryIn, aryOut, i + 1) aryIn = ary '配列を元に戻す Next Else '配列の最後まで行ったので出力 If IsEmpty(aryOut) Or Not IsArray(aryOut) Then ix = 0 ReDim aryOut(UBound(aryIn), ix) Else ix = UBound(aryOut, 2) + 1 ReDim Preserve aryOut(UBound(aryIn), ix) End If For j = LBound(aryIn) To UBound(aryIn) aryOut(j, ix) = aryIn(j) Next j End If End Sub Sub sample1() Dim aryIn Dim aryOut '入力配列 aryIn = Array(1, 2, 3, 4, 5) '順列作成 Call permutation(aryIn, aryOut) 'シートへ出力 Cells.ClearContents Range("A1").Resize(UBound(aryOut, 2) + 1, UBound(aryOut, 1) + 1) = _ WorksheetFunction.Transpose(aryOut) End Sub ーー そして数字で出てくる結果を、具体的な、氏名の例にするため作成した(自作) s = Array("", "木村", "野村", "東", "泉", "大友") の部分は、勝手な例なので、適当な名称のものに、かえてください。 5人の場合ですが。 Sub test04() s = Array("", "木村", "野村", "東", "泉", "大友") Dim cl As Range Set sh1 = Worksheets("Sheet2") Set sh2 = Worksheets("Sheet4") For Each cl In sh1.Range("a1:f120") sh2.Cells(cl.Row, cl.Column) = s(cl) Next End Sub ===