- ベストアンサー
組合せをエクセルに表にして表わしたい
5人のA、B、C、D、Eという人がいます。 5台の1、2、3、4、5、という自転車があります。 組合せは、 5*4*3*2*1=120通になると思います。 この120通りの組合せをエクセルの表に表したいです。 どのようにすればいいでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>5人を6人にしたり、5台を4台にしたりして使う場合はどうすればいいでしょうか? 御使いになられているExcelのバージョンは、Excel2007以降のものでしょうか、それとも、Excel2007よりも前のバージョンなのでしょうか? もし、Excel2007よりも前のバージョンである場合には、行数が65536までしかありませんので、ROW関数のみで元となる整数値を作成していたのでは、必要となる543210までの整数値を作り出す事は出来ません。 そのため、少々やり方を変えて、I列~K列の3列を作業列として使い、行番号の数値を6進法で表した場合の文字列を作り出してから、その中から条件に合う数字のみを取り出して、数値が小さい順に並べる事とします。(小さい順に並べ直した列を作らないと、計算処理に要する負荷が極端に過大になる様です) 【5人を6人にする場合】 まず、 A1セルに A B1セルに B C1セルに C D1セルに D E1セルに E F1セルに F と入力して下さい。 次に、I1セルに次の関数を入力して下さい。 =IF(ROW()+6^4+2*6^3+3*6^2+4*6+4>5*6^5+4*6^4+3*6^3+2*6^2+6,"",INT(MOD(ROW()+6^4+2*6^3+3*6^2+4*6+4,6^6)/6^5)*10^5+INT(MOD(ROW()+6^4+2*6^3+3*6^2+4*6+4,6^5)/6^4)*10^4+INT(MOD(ROW()+6^4+2*6^3+3*6^2+4*6+4,6^4)/6^3)*10^3+INT(MOD(ROW()+6^4+2*6^3+3*6^2+4*6+4,6^3)/6^2)*10^2+INT(MOD(ROW()+6^4+2*6^3+3*6^2+4*6+4,6^2)/6)*10+MOD(ROW()+6^4+2*6^3+3*6^2+4*6+4,6)) 次に、J1セルに次の関数を入力して下さい。 =IF(AND(LEN(SUBSTITUTE($I1,0,))=5,ISNUMBER(FIND(1,$I1)+FIND(2,$I1)+FIND(3,$I1)+FIND(4,$I1)+FIND(5,$I1))),$I1,"") 次に、I1~J1の範囲をコピーして、I2~J42926の範囲に貼り付けて下さい。(42926行目以下にまでコピーしてしまっても構いません) 次に、K2セルに次の関数を入力して下さい。 =IF(ROWS($2:2)>COUNT($J:$J),"",TEXT(SMALL($J:$J,ROWS($2:2)),"000000")) 次に、K2セルをコピーして、K3~K721の範囲に貼り付けて下さい。(721行目以下にまでコピーしてしまっても構いません) 次に、A2セルに次の関数を入力して下さい。 =IF((0&MID($K2,COLUMNS($A:A),1))+0,A$1&MID($K2,COLUMNS($A:A),1),"") 次に、A2セルをコピーして、A2~F721の範囲に貼り付けて下さい。(721行目以下にまでコピーしてしまっても構いません) 【5台を4台にする場合】 まず、 A1セルに A B1セルに B C1セルに C D1セルに D E1セルに E と入力して下さい。 次に、I1セルに次の関数を入力して下さい。 =IF(ROW()+5^3+2*5^2+3*5+3>4*5^4+3*5^3+2*5^2+5,"",INT(MOD(ROW()+5^3+2*5^2+3*5+3,5^5)/5^4)*10^4+INT(MOD(ROW()+5^3+2*5^2+3*5+3,5^4)/5^3)*10^3+INT(MOD(ROW()+5^3+2*5^2+3*5+3,5^3)/5^2)*10^2+INT(MOD(ROW()+5^3+2*5^2+3*5+3,5^2)/5)*10+MOD(ROW()+5^3+2*5^2+3*5+3,5)) 次に、J1セルに次の関数を入力して下さい。 =IF(AND(LEN(SUBSTITUTE($I1,0,))=4,ISNUMBER(FIND(1,$I1)+FIND(2,$I1)+FIND(3,$I1)+FIND(4,$I1))),$I1,"") 次に、I1~J1の範囲をコピーして、I2~J2737の範囲に貼り付けて下さい。(2737行目以下にまでコピーしてしまっても構いません) 次に、K2セルに次の関数を入力して下さい。 =IF(ROWS($2:2)>COUNT($J:$J),"",TEXT(SMALL($J:$J,ROWS($2:2)),"00000")) 次に、K2セルをコピーして、K3~K121の範囲に貼り付けて下さい。(121行目以下にまでコピーしてしまっても構いません) 次に、A2セルに次の関数を入力して下さい。 =IF((0&MID($K2,COLUMNS($A:A),1))+0,A$1&MID($K2,COLUMNS($A:A),1),"") 次に、A2セルをコピーして、A2~E121の範囲に貼り付けて下さい。(121行目以下にまでコピーしてしまっても構いません) 以上です。
その他の回答 (3)
- kagakusuki
- ベストアンサー率51% (2610/5101)
>5人を6人にしたり、5台を4台にしたりして使う場合はどうすればいいでしょうか? 質問者様が、どの様にしたいのかが良く判りません。 自転車の台数よりも、人数の方が多いのでは、重複無しに自転車を、全員に割り当てる事は出来ません。 誰か一人、自転車が無い人間を作れば良いのでしょうか? それとも、5台の自転車の内、どれか1台を2人で使うのでしょうか? その場合、どの自転車を共用とすれば良いのかという事や、誰と誰が1台の自転車を共用とするのか、自転車を持たない人間を誰にするのか、と言った事に関して、何か決まり事はあるのでしょうか? そういった事柄が不明であるため、回答のしようが御座いません。 ですから、どのように自転車を割り振れば良いのかを御説明願います。
補足
>誰か一人、自転車が無い人間を作れば良いのでしょうか? そうです。 最適なメンバーが知りたくて。 >1台を2人で使うのでしょうか? 違います。 1台1人です。 決まり事は、1台に乗れるのは1人です。 あふれる人は、売上はゼロになるので、利益もゼロです。
- kagakusuki
- ベストアンサー率51% (2610/5101)
あまりスマートな方法ではありませんが、次の様な方法は如何でしょうか。 まず、 A1セルに A B1セルに B C1セルに C D1セルに D E1セルに E と入力して下さい。 次に、G列を作業列として使用するものとして、G1セルに次の関数を入力して下さい。 =IF(AND(ROW(G1234)<43211,ISNUMBER(FIND(1,ROW(G1234)+11111)+FIND(2,ROW(G1234)+11111)+FIND(3,ROW(G1234)+11111)+FIND(4,ROW(G1234)+11111)+FIND(5,ROW(G1234)+11111))),ROW(G1234)+11111,"") 次に、G1セルをコピーして、G2~G41977の範囲に貼り付けて下さい。 次に、A2セルに次の関数を入力して下さい。 =IF(ROWS($2:2)>COUNT($G:$G),"",A$1&MID(SMALL($G:$G,ROWS($2:2)),COLUMNS($A:A),1)) 次に、A2セルをコピーして、A2~E121の範囲に貼り付けて下さい。 以上です。
お礼
見事にできました。 ありがとうございました。 これは理屈で説明するとどうなるんですか? 5人を6人にしたり、5台を4台にしたりして使う場合はどうすればいいでしょうか?
- NOBNNN
- ベストアンサー率50% (93/186)
VBA(マクロ)を作成すれば簡単にできます。 For 文の入れ子 2次元で計算すればOKです。 excelのSheet1 に 3個のオブジェクトを配置してください。 1.コマンドボタン(cmd自転車の台数) 2.テキストボックス (TxtB_自転車の台数) 3.ラベル(上記テキストボックスの名前) VBAの中身をVBを入力します。 Excelの表示/ツールバー/VisualBasic にチェック VisualBasic のデザインモードのボタンを押す。 '*************************************************************************** Private Sub cmd自転車の台数_Click() If IsNumeric(TxtB_自転車の台数.Text) = False Then MsgBox "自転車の台数を正しい値で入力してください。" TxtB_自転車の台数.Activate Exit Sub End If Dim Daisu As Integer Daisu = Int(TxtB_自転車の台数.Text) Dim I As Integer, J As Integer Dim Retu As String, gyo As Integer, Pos As String Dim RetuChr As String Const cnsManNameRetu = "B", cnsStgyo = 20 gyo = cnsStgyo - 1 Ans = 0 Range(cnsManNameRetu & cnsStgyo, "Z100").Clear For I = 1 To Daisu Retu = cnsManNameRetu gyo = gyo + 1 Ans = I - 1 Range(cnsManNameRetu & gyo).Cells = Chr(64 + I) '名前の設定 For J = 0 To Daisu - 1 RetuChr = Asc(Retu) Retu = Chr((RetuChr) + 1) Pos = Retu & gyo Ans = Ans + 1 If Ans > Daisu Then Ans = 1 End If Range(Pos).Cells = Ans '自転車の番号の設定 Next J Next I End Sub '*************************************************************************** 結果は画像の通りです。
補足
ありがとうございます。 VBAはしたことがなくて。 VBA言語は、どこに貼り付ければいいのでしょうか?
お礼
ありがとうございます。 途中でギブアップしました。 また時間があるときにしたいと思います。