• 締切済み

すべての組合せをシートに出力したい

a1~a10を1以上5以下の整数とするとき、 a1+a2+a3+a4+a5+a6+a7+a8+a9+a10=20 となるような組み合わせは、 (5,5,3,1,1,1,1,1,1,1)→10!/(2!*7!) =360通り (5,5,2,2,1,1,1,1,1,1)→10!/(2!*2!*6!)=1260通り (5,4,4,1,1,1,1,1,1,1)→10!/(2!*7!) =360通り (5,4,3,2,1,1,1,1,1,1)→10!/(6!) =5040通り (5,4,2,2,2,1,1,1,1,1)→10!/(3!*5!) =5040通り (5,3,3,3,1,1,1,1,1,1)→10!/(3!*6!) =840通り (5,3,3,2,2,1,1,1,1,1)→10!/(2!*2!*5!)=7560通り (5,3,2,2,2,2,1,1,1,1)→10!/(4!*4!) =6300通り (5,2,2,2,2,2,2,1,1,1)→10!/(6!*3!) =840通り (4,4,4,2,1,1,1,1,1,1)→10!/(3!*6!) =840通り (4,4,3,3,1,1,1,1,1,1)→10!/(2!*2!*6!)=1260通り (4,4,3,2,2,1,1,1,1,1)→10!/(2!*2!*5!)=7560通り (4,4,2,2,2,2,1,1,1,1)→10!/(2!*4!*4!)=3150通り (4,3,2,2,2,2,2,1,1,1)→10!/(2!*7!) =360通り (4,2,2,2,2,2,2,2,1,1)→10!/(2!*7!) =360通り (3,2,2,2,2,2,2,2,2,1)→10!/(8!) =90通り (2,2,2,2,2,2,2,2,2,2)→10!/(10!) =1通り で合計41,221通りだと思います。 ごの、41,221通りの組合せを、エクセルシートに 41,221行20列の範囲に漏れなく出力したいのですが、 VBAで上手いテクニックがあれば教えてください。 よろしくお願いいたします。

みんなの回答

  • warumx
  • ベストアンサー率0% (0/9)
回答No.4

なんらかの方法で全ての組合せが得られたとして、その後どのように その大量のデータを使うのでしょうか。そちらの方が心配です。 目的にもよりますが通常は全ての組合せが必要なケースは少ないと 思います。 最終目的を書かれれば皆さんのアドバイスも的確になるでしょう。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.3

上手いって何なんでしょうか。観点は速度、保守、汎用性、いろいろあります。 全体の組み合わせから不要なパターンを除く DO-LOOPやIF 各桁の必要な組み合わせパターンの積み重ね FORーNEXT多重 のどちらか。 5進数の考え方、組み合わせ数の求め方、n!は四則演算式でどうなるか、等を学習すればいいのでは?。 セルを操作しながら、ならOFFSETとか。 機能要件が明確ですしセル操作の類の命令書くだけでは?。あふれあれば5分割すればいい。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.2

(4,3,2,2,2,2,2,1,1,1)の計算が間違っているし、 (4,3,3,3,2,1,1,1,1,1)や(3,3,3,3,3,1,1,1,1,1)などの組み合わせの漏れがありますね。 合計は72,403通りです。 下記のコードでできますが、Excel2007以降でないと行数の制限をオーバーしてしまいます。 Excel2003で実行するなら、シートを分けるなりして分割すれば可能でしょう。 Sub Test() Cells.Select Selection.ClearContents Range("A1").Select n0 = 0 n = 1 For i = 1 To 7 Cells(n, i) = 1 Next Cells(n, 8) = 3 Cells(n, 9) = 5 Cells(n, 10) = 5 Do IsOK = (Cells(n, 10) > 1) k = 9 Do While k > 0 If Cells(n, k) < 5 And IsOK Then n = n + 1 p = 0 For i = 1 To 10 If i < k Then Cells(n, i) = Cells(n - 1, i) ElseIf i = k Then Cells(n, i) = Cells(n - 1, i) + 1 ElseIf 20 - p - 5 * (10 - i) < 2 Then Cells(n, i) = 1 Else Cells(n, i) = 20 - p - 5 * (10 - i) End If p = p + Cells(n, i) Next Exit Do End If IsOK = (IsOK Or (Cells(n, k) > 1)) k = k - 1 Loop Loop While k > 0 End Sub

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.1

こんな趣味みたいな課題に付き合いたくないが、 プログラムで、初歩的にやるなら、ForNextループを10重にネスト(For a1=1 to 5,For a2=1 to 5・・・Next a1、Next a2・・・) にすればできるはず。 組み合わせの問題は手作業より計算が速いと言うだけで、良いアルゴリズムは無いのではないか。 近似値でよいタイプの値の算出は、色々とXX法がありうるが。 ーー もっとスマートな方法は(多分無いと思うが)数学のカテゴリにするものだよ。 そういうアイデアは並みの文系のプログラマには(VBAの経験は相当あっても)聞いても判らないだろう。

関連するQ&A

  • Excelですべての組合せ(重複組合せ)を出力するには?

    Excelですべての組合せ(重複組合せ)を出力するには? 次の条件のような場合、Excelですべての組合せ(重複組合せ)をVBAで出力するにはどうしたらいいのでしょうか? 10種類のお菓子の中から、好きなものを3個選んでセットにするとします。 同じものを複数選ぶのはありですが「菓子A、菓子B、菓子C」と「菓子B、菓子C、菓子A」は選んだ順が違うだけで同じ組合せなので、どちらか片方だけにします。 この場合、すべての組合せの数は Excelの関数で求めることができるようで COMBIN(10+3-1,3) = 220 通りあることまではわかりましたが、このすべての組合せの一覧をどのようにして出力したらいいのかがわかりません。 いろいろ検索した結果、順列という方法は見つかりましたが、重複組合せでの方法は見つけることができませんでした。 また、Accessを使っても似たようなことができるのでしょうか? 直積? できれば、3個固定ではなく5個の場合も出来るとうれしいです。 よろしくお願いします。

  • Excelシートを分割してcsvに出力するVBA

    すいませんが、ご教示願います。 パソコンExcelのVBAです。 Excelファイルシートの24,000行あるデータを、 任意に選択した範囲(例えば2行目から3,000行目)をcsvデータに出力する VBA構文が知りたいです。 どなたかおわかりになりますでしょうか。

  • 合計値が同じ組み合わせ

    下記の様な事ってEXCELの関数を使って、出力は可能でしょうか? 可能でしたら是非とも教えてください。 例)B列の1行目から10行目にそれぞれ数字が入力されていて、そこから4つのセルを抜き出し、合計値が30となる組み合せ全てを抽出する。

  • エクセルのVBAでタブ区切りのテキスを出力したい。

    エクセルのVBAでテキスト出力をしたいのですが、 ・タブ区切りで保存 ・A列の最終行×1行目の最終列の範囲指定が対象 ・範囲内の空欄もタブ区切りにする(最終列には必ず数値あり) ・出力テキストはシートと同じフォルダ内へ格納 ・テキストファイル名はシート名 という感じにしたいのです。 いろいろ検索はしているのですが、これといった回答やサンプルは 見つかっておりません(><) ちなみに、私は、自動記録をしたものを改良して少し使えるレベルです。 よろしくお願いします。

  • Excelマクロでのデータ全通り組み合わせ出力方法

    Excelマクロでのデータ全通り組み合わせ出力方法 VBA初心者です。以下の内容につき教えて頂けますと助かります。 添付ファイルの【因子/水準表】データの全組み合わせを【全通り組み合わせ表】に出力したいです。 以下にやりたいことを纏めます。 ・【因子/水準表】データ(因子/水準)の全組み合わせを【全通り組み合わせ表】に出力したい。 ・【因子/水準表】と【全通り組み合わせ表】は同一シート内で列を合わせたい。 ・因子数、水準数は可変としたい。(添付ファイルでは因子数3、水準数の最大は4となっているが、この数が可変となるため、【全通り組み合わせ表】の開始セルも併せて可変となる) 以上、よろしくお願いいたします。

  • アクセス2013でエクセルにデータを出力したい

    はじめまして。初心者ですがよろしくお願いします。 アクセス2013で作成したテーブルをエクセル2013に出力させたいと思っています。 出力する場所が、1行ごとに出力するセルを指定したいのですが、どのようにすればよいのかわかりません。(うまく説明できないので下記のテーブルイメージと出力エクセルイメージを見てください。) あわせて出力イメージの合計はH列になっていますが、これは可能であればの範囲で、一番やりたいことは、メーカーAの後数行あけてメーカーBにしたいのです。 ちなみに例ではメーカー名は2メーカーですが、実際には数十個あります。 よい方法があれば教えてください。 VBAは勉強中なのでなんとなくは読み書きできます。 よろしくお願いします。 ~テーブルイメージ~ メーカー名  2014/6/1  2014/6/2,2014/6/3  合計 ----------------------------------------------------- メーカーA     2    1    1     4 メーカーB     1    1    1     3 ~出力エクセルイメージ~ A       B    C    D   ・・・ H   1 メーカーA     2    1    1       4 2 3 4 5 メーカーB     1    1    1      3 6 7

  • EXCELVBA 全通りの組み合わせの出力

    はじめまして! VBAの記述の方法が分からず困っています。 過去の質問も検索してみましたが、自分のケースにどうあてはめればよいかわからず・・。 どなたが教えていただけないでしょうか? A1~AK1までそれぞれ1~37までの数字が入力されています。 組み合わせとして、そこから35個の数字を選ぶ場合の全通りを記載したいです。 2行目のA1~AI1までに選んだ35個の数字を出力し、 1行ずつ下にずらしていきたいです。 大変お手数ですが・・・よろしくお願いします・・・

  • エクセル複数シートから一定の範囲を1シートへVBA

    エクセルのVBAで質問です。 A1~A3行までは、タイトル(3行が列タイトル) A4行以降から一定のデータが入っており、商品ごとにシートを分けています。 列BF4~BM81までのデータを自動でコピーし、全データシートも自動でできればと思っています。 BF4列には、日付が入っており、複数のシートからコピーされたものは、日付順にて並べたい。「全データシート」を自動で作成する方法は、ネットにて調べることができたのですが、一定の範囲内の複数シートを合算し、日付順に並べ替えて自動でコピーするというのが分かりません。 VBAも全くの初心者です。 詳しくお教えいただればと思います。 よろしくお願いします。

  • シート1から特定の条件でシート2に出力

    すみません、エクセルについてご教示ください。 シート1に入力したデータ中から条件にあったものを シート2に出力したいと思っています。 シート2の A3に該当月を指定(例)2012/09)することで、 シート1中から条件のあったデータをシート2中に出力することは可能でしょうか。 可能であれば関数などご教示いただけるとさいわいです。 ## エクセルに詳しくない社内の担当が、シート2のA3に該当月を入れるだけで ## 丸っとシート2をコピーして、必要なメールを作成できないかなあと考えています なお、条件にあるものが複数ある場合、該当するものをすべてシート2の 5行目以降に表示されるようにしたいと思います。 【シート1】                      行 __A__ __B___  __C__   ____D___  ____E____ 1  No. 該当月  管理番号 顧客名   備考 2  1  2012/09  11****  株式会社A  ちょめ 3  2  2012/09  23****  株式会社B  ちょめ 4  3  2012/10  27****  株式会社C  ちょい 5  4  2012/10  28*****  株式会社D  ちょい 【シート2】 行  __A__ ____B__ __C__ ____D____ __E__ 1  (ここにメールテンプレート) 2  (ここにメールテンプレート) 3  ★該当月★ の対応案件です。お願いします。 4 5  (以下 Sheet1 の B列で Sheet 2 A3 の該当月と一致するものの A~E列を出力。) 6 7

  • ExcelSheet1のデータから、指定したデータをSheet2に一括出力する。

     ExcelSheet1に約4000件(1行)のデータを入力しています。  そのデータから指定した100件のデータを、VBAで一括してSheet2に出力するマクロを教えてください。  Sheet1のA列には、主キーとして(0001~9999)の文字列をいれています。  

専門家に質問してみよう