• ベストアンサー

数値の組み合わせを求める方法

数値の組み合わせを求めるのによい方法はありませんか。 具体例を書きますのでよろしくお願いします。 2,3,5,8の4個の数値があります。 この数値のいずれかを足して10になる組み合わせを 求めたい。 この場合の答えは、 2+3+5=10または2+8=10から、 2,3,5の組み合わせ、または2,8の組み合わせ となります。 また、上の場合で、足して11になる数値の組み合わ せは、3,8の組み合わせのみです。 これらは、簡単に求められますが、数値が多くなって くると手で計算していては、ものすごく時間がかかって しまいます。 エクセルを使って、ササーッと求める方法があったら 教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

プログラムの書き方は、あまり自信ないですけど、 一例として作って見ました。 VBAが分かる様なので、考え方が分かれば私の作り方より きれいな書き方が出来るのではないかと思います。 標準モジュールに下記のプログラムを貼り付けて [Sheet1]のA列に数値を入力し、      B1セルに求めたい数値を入力し Testを実行してください [Sheet1]のC列,D列・・・に該当する組み合わせを表示します。 Sub test()   Dim ws As Worksheet   Dim tbl As Variant   Dim ans As Long   Set ws = Worksheets("Sheet1")   '対象となる数値群   tbl = ws.Range(ws.Range("A1"), ws.Cells(ws.Rows.Count, "A").End(xlUp)).Value   '求める数値   ans = ws.Range("B1")   '表示位置クリア   ws.Range("C:Z").Clear   MsgBox Anser(1, 0, ws, 1, 3, tbl, ans) & "個の組み合わせがありました" End Sub 'srow:検索を始める行 , wtotal:現在の合計 'ws:表示するシート,wrow:表示する行 , wcolumn:表示する列 'wtbl:対象となる数値群 , wans:求める数値 '戻り値:組み合わせの個数 Function Anser(ByVal srow As Long, ByVal wtotal As Long, ByVal ws As Worksheet, ByVal wrow As Long, ByVal wcolumn As Integer, ByVal wtbl As Variant, ByVal wans As Long) As Long   Dim i As Long   Dim wcnt As Long   Dim wtl As Long   Anser = 0   For i = srow To UBound(wtbl, 1)     wtl = wtotal + wtbl(i, 1)     If (wtl = wans) Then '求める数値と同じ       ws.Cells(wrow, wcolumn) = wtbl(i, 1)       Anser = Anser + 1       wrow = wrow + 1     ElseIf (wtl < wans) Then '求める数値より少ない       wcnt = Anser(i + 1, wtl, ws, wrow, wcolumn + 1, wtbl, wans)       If (wcnt > 0) Then '求める数値になる組み合わせがある         For j = 1 To wcnt           ws.Cells(wrow, wcolumn) = wtbl(i, 1)           wrow = wrow + 1         Next j         Anser = Anser + wcnt       End If     'Else 'ソートされている場合コメントをはずす     ' Exit For'ソートされている場合コメントをはずす     End If   Next i End Function A列の数値がソートされていれば、最後のコメント(')をはずしてください わからなければ、補足してください。 (テストを少数データでしか試してませんので、  バグがあったらそちらも補足してください)

nayaminosuke
質問者

お礼

taisuke555さんのVBA動かしてみました。 たちまち、答えが出て感動ものです。 プログラムの内容は、合計値と数値のセル範囲を取得して、セル範囲の数値を順番に足していって、合計値と合うたびに、表示位置もずらして、でもって組み合わせの個数もカウントしていくということのようですが、それをプログラムしてしまうところが、凄いです。私などとてもとてもできそうにありません。でもいつかはという気持ちです。本当にどうもありがとうございました。

nayaminosuke
質問者

補足

早速ありがとうございます。 私のVBA力は、事務処理中心で手作業での反復の自動化が主なので、書いてくださったプログラムには目がくらみました。読んで、考えて、テストして、また、ご連絡します。それまで、すこし待ってください。

その他の回答 (3)

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.4

2、3、5、8の場合の例です。 B1、C1、D1、E1に使用する数 2、3、5、8を入力します。 F1に指定する数値を入力します。 数値の組み合わせの種類は=2^4-1=15 なので A2~A16に1から15の数値を入力します。(2^4の4は使う数字の個数です) B2に =INT(A2/2^3) C2に =INT(MOD(A2,2^3)/2^2) D2に =INT(MOD(A2,2^2)/2^1) E2に =INT(MOD(A2,2^1)/2^0) F2に =IF(SUMPRODUCT($B$1:$E$1,B2:E2)=F$1,"OK","") とします。3行目から16行目にこれをコピーします。   │ A│ B  C  D  E│ F ──┼──┼───────────┼────  1│  │ 2  3  5  8│10  2│ 1│ 0  0  0  1│  3│ 2│ 0  0  1  0│  4│ 3│ 0  0  1  1│  5│ 4│ 0  1  0  0│  6│ 5│ 0  1  0  1│  7│ 6│ 0  1  1  0│  8│ 7│ 0  1  1  1│  9│ 8│ 1  0  0  0│ 10│ 9│ 1  0  0  1│OK 11│10│ 1  0  1  0│ 12│11│ 1  0  1  1│ 13│12│ 1  1  0  0│ 14│13│ 1  1  0  1│ 15│14│ 1  1  1  0│OK 16│15│ 1  1  1  1│ 一致する組合せがあればF列に『OK』がでます。 組合せパターンを2進数で表し、掛算して合計を求めています。 3個の数値の場合もすぐできるでしょう。 同じ理屈で、ユーザー定義関数を作れば、単純な繰り返し演算で計算できることになります。 VBAの場合、ビット演算ができるので単純になります。 また、アドインのDEC2BIN関数を使えば、2進数文字列を作ることができます。 アドイン関数を組み込んでいないので上のような方法にしてみました。 ご参考に。

nayaminosuke
質問者

お礼

ありがとうございます。 なんといえばいいのか、逆転の発想というのか、脳味噌が洗われる思いです。 同じ理屈で、・・・以下の文はちょっと私にはむずかしすぎです。。もっと勉強します。

回答No.2

EXCELの関数での方法は、まったく思いつきません。 VBAなら全ての組み合わせを調べれば、できると思います。 必要であれば、補足してください。 VBAのプログラムを作ってみます。(書き方にはあまり自信がありませんが・・・) (VBAが良く分からなければ、修正が難しいと思いますので、その場合は、  数値:Sheet1のA列で個数は未定、ソートされている  求める数値:Sheet1のB1セル  組み合わせの表示位置:Sheet1のC列以降 のように具体的に補足してください)

nayaminosuke
質問者

お礼

いやー、作ってくださるのですか。お世話になります。 VBAは、そこそこ書けるつもりですが、わからないときには、教えてください。

  • nemaro
  • ベストアンサー率28% (40/139)
回答No.1

数学は苦手ですが参考になればうれしい。

参考URL:
http://epnas1.hp.infoseek.co.jp/backnumber/19990724.html
nayaminosuke
質問者

お礼

ありがとうございます。やはり、すべての組み合わせをやってみないとだめみたいですね。うーん。

関連するQ&A

  • 数値を複数の群に分ける最適な組み合わせを求める方法

    次のような問題をCで記述するにはどのようにすればいいでしょうか? 要素数が不定の整数値配列がある。 この配列の各要素を、与えられた個数の群に分ける。 条件として、与えられた数値列で隣り合う数値しか同じ群に含めることは出来ない。 例: 数値列は{5,2,7,12,6,15,4} 群の個数を3とする。 (1) {5,2},{7,12,6},{15,4} (2) {5},{2,7},{12,6,15,4} (3) {5,2,7},{12},{6,15,4} ・・・ と複数の組み合わせがある。 これらの組み合わせのうち、各群の合計値が最も均等になるような組み合わせを求める。最大値と最小値の差が最小となる組み合わせを最も均等と考える。 上の例であれば、各群の合計値と、合計値の最大値と最小値の差は、 (1) {5,2},{7,12,6},{15,4} ==> 7,25,19 (25-7=18) (2) {5},{2,7},{12,6,15,4} ==> 5,9,37 (37-5=32) (3) {5,2,7},{12},{6,15,4} ==> 14,12,25 (25-12=13) ☆ のようになり、この3つの中で最も均等なのは (3) {5,2,7}{12}{6,15,4} となる。 実際は、これ以外の組み合わせでより均等となるものがあるかと思います。 この問題そのものが必要なわけではなく、この結果を利用して別のある問題を解決しようとしています。 数値の数が増えると組み合わせの数も大幅に増えて計算時間に影響すると思います。 全ての組み合わせを試すことなく答えにたどり着く方法があれば、考え方だけでも提示頂ければと思います。

  • セルに入力した数値の組み合わせを抽出する方法

    セルに入力した数値の組み合わせを抽出する方法 色々探したのですが、よく分からないので教えてください。 エクセルシートのB3:E6の16個の各セルに、任意に数値を入力していきます。 その入力した数値の組み合わせを全て抽出したいと思っております。 (抽出先はどこでもいいです。) 希望としてはB3:E3の4個の数値は必ず入った組み合わせを作りたいです。 関数でもVBAでも何か方法が有れば教えてください。 宜しくお願い致します。

  • 組合せ 

    1から i番目まで、数字がランダムに並んでいます。(マイナス数値からプラス数値まで)。 これらの数値の組合せで、組合せの合計値が、ある目標値になる組合せのすべてを発見して、その組合せを1からiの番号で表示したいのです。 目標値は一個だけ定めます。 どのような論理を組めば可能でしょうか。(この論理をエクセルソフトに組み込み計算します)。

  • 複数の数字の組み合わせの中から合計がAになる組み合わせを探す方法

    例えば、1~10の数字があって、その中から合計が10になる組み合わせを探す、という計算式はExcelで作成することはできますか?(答えは[1+2+3+4][1+2+7][1+3+6][1+4+5][1+9][2+3+5][2+8][3+7][4+6]の9通り) もしくは、複数の組み合わせで計算させて、合計が10になったものを検索するという計算式は可能でしょうか? よろしくお願いします。

  • 組み合わせを選ぶためのプログラミングについて

    どなたか、こんなプログラムがエクセルなどの計算ソフトで作成できるものなのか教えてください。 例えば、1,2,3,4 という数字の因子があり、このうちのどんな組み合わせでも良いので4になる組み合わせを選び出し、答えとして「1,3」 と 「4」 を導き出すプログラムです。 よろしく御願いします。

  • Excelで数値のみ消す方法

    Excelで数値のみ消す方法 セルの計算式を残して数値だけ消す方法を教えてください。

  • EXCELで組合せのやり方を教えてください。

    EXCELで組合せのやり方を教えてください。 こんにちは!質問をお願いします。 (1) 複数ある数字からいくつか足してわかっている数字(A)と同じにする (2) それから(A)になるのに使った数字がどれか という計算をEXCELで計算方法を知りたいです。 例えば 複数ある数字(X) :24 50 77 458 550 140 わかってる数字(A):267       ↓ 267(A)になるのには(X)の中のどの数字を足せば良いか? ここでは 50 77 140がエクセルの答えとして出てきてほしい という感じです。 ただ、マクロは組めないのでできればシンプルなものでお願いします。

  • excelの組合せ計算について

    0か1かが入る組合せの全通りがわかる計算を教えてください! 具体的に言うと、3この数字の場合は000、001、010、011、111になると思うのですが、それをエクセルで自動的に全通り出す式もしくはマクロが知りたいです。 3この場合は頭で考えればできるのですが、例えば8この場合、00000000、00000001、00000010、…等をすべて出すのは大変なのでエクセルで一気に出せないかと思った次第です。 すいませんが回答お待ちしております!

  • 数値の表示方法を教えてください。

    株価の計算をしています。計算すると膨大な数値になりますので、上4桁までの表示にしたいです。例)2500円×55万円=1375000000円 セルに自動的に上○桁表示にするにはどうしたらよいのでしょうか?どうぞよろしくお願いします。

  • エクセル 数値の抽出方法

    どなたか教えて下さい エクセルで沢山の数値(同数値含む)が入っている表から同数値を除く 数字の種類を抽出したいのですが、その方法が判りません 例)   A   B   C 1 0.20 0.20  0.15 2 0.15 1.00  0.15 3 0.33 0.40  0.10 4 1.00 0.20  0.15 上記の例の場合抽出結果を 0.10 0.15 0.20 0.33 0.40 1.00 と表示させたいのですが、どなたか教えて下さい よろしくお願いします。 

専門家に質問してみよう