こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

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

以上

マクロの使い方がわからないので、
出来れば関数で教えていただけると有り難いです。
よろしくお願いします。

投稿日時 - 2018-04-07 01:26:12

QNo.9485858

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>例えば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の範囲を他のセルへ値のみコピーする方法で良いと思います。
行方向のデータを列方向に貼り付けるときは形式を指定して「行列を入れ替える」を選択します。

投稿日時 - 2018-04-09 09:59:03

ANo.1

>マクロの使い方がわからないので、出来れば関数で教えていただけると有り難いです。
ーー
だから下記は質問者には意味がないかと思う。
エクセル関数で説明してほしいということだろう。
しかし、エクセル関数での回答は、おいそれとは、出ないだろう。
エクセルは数を数えるのは得意で簡単なばあいが多い。
順列の数は
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
===

投稿日時 - 2018-04-07 20:25:40