• 締切済み

組み合わせを上手に選ぶ(内容を変えて再投稿)

手元のExcelデータには、A列に商品名、B列に値段が入力されています。 ここでC列に1以上の整数を1・2・3・・・と順に、以下の条件に合うように自動的に入力したいです。 条件とは、C列に同じ数値が入った行のB列セルの合計が、(全てのC列の数値において)10000以上になるように、そのうえでC列の最大値がより大きくなるようにすることです。 商品の内容(値段)によっては、全て10000以上になる組み合わせ方が複数存在することもありますが、任意の1種類だけC列に自動入力できれば良いです。 但し、A・B列への入力が今後増えていくので、その都度C列の自動入力をし直せるものがよいです。 以上の内容で、Excelを上手に使うアイデアを紹介していただければと思います。

みんなの回答

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.10

未解決終了したものを追いかけるような感じになりますが。カテゴリをエクセルではなく数学にして 一定数の価格の違う商品を袋に一定額(例えば10000円)以上詰め込み、袋の数をなるべく多くしたい(金額の増加単位が10円単位とか、最低価格と最高価格も記載すれば範囲が絞れます)その時に、各々の袋に入る商品がわかる という問題が数学的に解決できるのか、そのようなアルゴリズムがあるのかどうかを確認してみてはいかがでしょう。袋の数が増えれば1個の袋の金額は10000円に限りなく収束していくと思いますので、この部分に関しては何がしかの数学的解法があるような気がします。そこに「各々の袋に入る商品がわかる」の部分を加えた数学的解法があるのかは疑問なところではありますが。 アルゴリズムのカテゴリがないので数学ではなければプログラム系でもいいかもしれません。エクセルのマクロに応用することを考えたらVisual Basicが移行しやすいでしょう。

ao-b
質問者

お礼

わざわざありがとうございます。質問を終了させていただいたのは、(これ以上前に進みそうにないから、というのもありましたが、)実際にまとめなければいけない期限が来てしまったからです。ですので、もう解決すべきお題はありません。 ちなみにですが、結局以下の手順で、半分人力で解決しました。 1.合計金額から作れる袋の最大数を予想する。 2.各商品にランダムに袋の番号を振る。(番号は1から上記の最大数まで当てるように。) 3.同じ袋の番号がついた商品の合計金額が、その袋の金額である。 4.全ての袋の金額を参考にして、任意の2個の商品を入れ替える。 5.手順4を繰り返せば、いつかは全ての袋の金額が一定額以上になるかもしれない。 「予想」「参考」という言葉を用いたように、結局この部分はヒューリスティックでしたね。 しかも手順1で予想した最大数が誤っているかもしれないのが欠点でした。

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.9

> 、「C列のセルにどのように1および2を入れても >『C=1の行のB列の値の合計もC=2の行のB列の値の合計も10000以上』にならないこと」を証明したいです ちなみに、B列の値の合計が10000を超える場合、上記の条件に合致することは絶対にありえません。 また、10000以下の組み合わせがあるかないかを2個ずつ総当たりで加算して調べると書きましたが、過去の補足の例を見ると1個でも組み合わせと考えるみたいなので、取り下げです。実は総当たりでなくても、B列を昇順に並び替えて小さい方から調べたら即わかることでした。 とりあえず、その結果をもって結局何がしたいのかいまだ理解できません。

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.8

皆さんからの回答は、おそらく、ao-bさんのご希望の処理と違った方向になっているように思いますので、ご希望の回答ではないかもしれませんが、あえてコメントします。 まず、前回の質問と関連する質問の場合は(経過を見ていると全く同じ質問をしているように思います)、以下のように前回の質問のリンクを付けて、これまでの経過をわかるようにして、回答者に無駄な回答をさせないようにしましょう。 http://questionbox.jp.msn.com/qa8712221.html これまでの経過を見ていると、質問者のご希望の処理は、B列にバラバラの数字が入力されていて、これらの数字の中からいくつか適当に組み合わせて10000を超える組み合わせをできる限りたくさん作成したいということではないでしょうか(A列やC列の説明が質問内容をわかりにくくしているように思います)。 この場合は、私がすでに回答したように、Excelで用意されている最良な方法はソルバーの機能を利用することになりますが、この場合でも一度にすべての組み合わせを提示させることはできません。 また、試行錯誤的に計算をするソルバーを利用する場合でも、当然のことですが、Excelが計算するための基準が必要です。 すなわち前回も回答したように、たとえばすべての数字の組み合わせの中で合計値が10000に最も近い数字を選ぶなどの計算の基準が必要となるわけです。 なお、今回のご質問では、このような基準がないので、ソルバーを利用した場合でも解を求めることができません。 ちなみに、200個ぐらいの数字で、計算の基準がなく単純に1~200個の数字の可能な組み合わせをすべて計算するようなプログラムを組んだとしても、計算回数が天文学的数字になるので、おそらくその計算に何時間もかかるのではないかと思います。

ao-b
質問者

お礼

分かりました。この題材で別に求めたいものができましたので、ここの質問は未解決終了にします。

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.7

> ですからそれは、「C列に1および2の数値を適切に入れれば『C=1の行のB列の値の合計もC=2の行のB列の値の合計も10000以上』になる(ことが、コンピュータを介さなくても明らかである)にもかかわらず、C列の全ての有効セルに1を入れただけで探索を止めてしまっている」点が不都合なのです。 だからこそ、「C列のセルにどのように1および2を入れても >『C=1の行のB列の値の合計もC=2の行のB列の値の合計も10000以上』にならないこと」を証明したいです なのです。 10000以上で、個数は問わない組み合わせが最大何通りになるのかというのを求めて(求めなくても)、その組み合わせがどれになるのかを知りたいために、同じ組み合わせのものにたいしC列に同じ数値を振りたいということでしょうか。 で、組み合わせで10000以下になるとダメなので、まずそれを確かめたい(10000以上にならないことを証明というか確認になりますが)でしたら、単にB列の2個の全ての組み合わせでその2個の値を足して10000以下にならないことを確かめるということになりますが…。 1で止めたらダメということと、10000以上にならないことの証明との因果関係がそのようなことくらいしか思い浮かびません。

ao-b
質問者

お礼

何度も回答していただき、ありがとうございました。しかしNo.8様から「不可能」とのお答えを(二度も)いただきましたので、この質問は未解決終了とさせていただきます。尚、No.9へのお返事は省略させていただきます。

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.6

> 『C=1の行のB列の値の合計もC=2の行のB列の値の合計も10000以上』にならないこと」を証明したいです というのは「以下」だと思いますが… 条件がいまいち不明なので数式は適当に考えただけですので、間違っていて当然と言えば当然です(笑) 条件が以下となったり以上となったり理解できませんが、とりあえず以上としたら かなり元に戻ってのあなたの例をもとにお聞きしますが B列/C列 2000/1 3000/2 4000/3 5000/4← 6000/4← 7000/3 8000/2 9000/1 この例だと組み合わせはB列の2個のデータの組み合わせが10000以上でC列の数値を割り振っていますが、2個限定にするとB列が奇数の場合1個余りますよね。で、その1個が10000以下だとどうするのでしょう。 B列/C列 2000/1 3000/2 4000/3 5000/4 5000/? 6000/4 7000/3 8000/2 9000/1 で、組み合わせが2個以上でも10000以上になればいいということにすると B列/C列 2000/1 3000/1 4000/1 5000/1 6000/1 7000/1 8000/1 9000/1 で、いいわけですよね。 組み合わせが2個以上で10000以上になればそこでその組み合わせは終わる? B列/C列 2000/1 3000/2 4000/3 5000/4 5000/4 6000/4 7000/3 8000/2 9000/1 こんな感じ? もしかして B列の値を組み合わせてその合計が10000以上になれば次の組み合わせを探し、その合計が10000以上になれば次の組み合わせを探すというように次々と組み合わせを探していき、最後に10000以下の値が出現することを証明したいということですか。となれば最初の?の例で証明できたという結果になるのでしょうか。 とすればNo1さんの補足に書かれている > もしC列=1と2のどちらかでもB列のセル値の合計が10000未満であれば、C列への1,2の入力をやり直す とかNo4の補足 > 『C=1の行のB列の値の合計もC=2の行のB列の値の合計も10000以上』にならないこと」を証明したいです という条件が合致しなくなりますよね…。 条件に矛盾がありそうでとりあえず理解できません。

ao-b
質問者

お礼

>2個限定にするとB列が奇数の場合1個余りますよね。で、その1個が10000以下だとどうするのでしょう 2個限定という条件はありませんので、考慮不要です。(私の示した具体例がたまたま2個ずつだっただけですが、具体例を出すと意図しない情報が伝わってしまうのはよくあることですね。) >で、組み合わせが2個以上でも10000以上になればいいということにすると(中略)で、いいわけですよね。 ですからそれは、「C列に1および2の数値を適切に入れれば『C=1の行のB列の値の合計もC=2の行のB列の値の合計も10000以上』になる(ことが、コンピュータを介さなくても明らかである)にもかかわらず、C列の全ての有効セルに1を入れただけで探索を止めてしまっている」点が不都合なのです。 だからこそ、「C列のセルにどのように1および2を入れても >『C=1の行のB列の値の合計もC=2の行のB列の値の合計も10000以上』にならないこと」を証明したいです なのです。 私はCが最大になるようにと書いているのですが、どうも回答者様はCを最小にしたいと思われているような気がするのですが・・・(そのせいで話がすれ違っているのではないかと思うのですが)いかがでしょうか。

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.5

> 以上が、私の求めるところです。いかがでしょうか。 単純な話、B列の値段が10000以下になる組み合わせ(組み合わせじゃなく単体でよければC列の最大値は商品数分になりますから)が最低何通りあるかという話ですか。で、組み合わせは2個でもいいとか、2個以上で10000に近い数値になる組み合わせとかですか。 以下のような感じの事なら数学の問題になりそうですけど。 http://www.albert2005.co.jp/technology/OPT/OPTproblem.html とりあえず、違うかもしれないけど(あくまでも違うかもですよ) 10000に近い数値になる組み合わせなら、int(B列の値の総数/10000)+1でよさそうな気がするけど、違うかもしれない。 2個でもいいならIF(商品数/2<10000,1,int(商品数/2)+1)でよさそうな気もするけど、これも違うかもしれない。

ao-b
質問者

お礼

どうも混乱させてしまったようです。>B列の値段が10000以下 ではなく10000「以上」ですので。 リンク先も拝見しましたが、「・・・以下」「・・・以内」とあり、これはちょっと、私の場合の問題につなげられるようなところが見つかりません。あるいは、どのように応用できるのか、もう少し詳しく説明していただけないでしょうか。 ・「B列の値段の合計を10000で割った整数部分に1を足す」 最後の+1は書き間違いだと思うので無視しますが、これは私もすぐに思いつきました。しかし、例えば、「8000円の商品3個だけ」という場合、示していただいた式だと2となりますが、 8000/1 8000/1 8000/2 あるいは 8000/1 8000/2 8000/2 とするしかなく、これでは、C列=2(あるいは1)の行のB列の値の合計が8000となってしまうので、題意に合いません。 ・「商品数が19999以下ならば1であり、商品数が20000以上ならば商品数を2で割った整数部分に1を足す」 これは私がお示ししたC列=<4の例に反するので明らかに間違いなのですが・・・何と書き間違えられたのかもわかりません。 しかしかなり前進したような気がします。

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.4

> ちょっと待ってください、今回の問題において、C列で扱える最大値が3であることを知りませんでした。 「たとえば3までだとしたら」で3と書いているだけで、誰も最大値は3だとは言ってません。また、「最大値を決めないならエクセルで扱える最大数です」と書いています。 あなたの書いた条件は B列の合計が10000以上でC列の最大値がより大きくなるように で、よろしいのでしょうか? > 既にA,B列に入力された行のうちいくつか行を適当に選びC列セルに1 を実行してみましょう。以下にあなたの示した例があります。C列はまだ入力されていない状態です。 B列/C列 2000/ 3000/ 4000/ 5000/ 6000/ 7000/ 8000/ 9000/ さて、ここで適当に8行選びC列に1を入力します。 B列/C列 2000/1 3000/1 4000/1 5000/1 6000/1 7000/1 8000/1 9000/1 B列の合計は10000以上ですからこれで作業が終了しました。このあと何も起こりません。 この動作で、あなたの条件と不一致なところがありますか?

ao-b
質問者

補足

分かりました、やっと一歩進んだ感じがします。 No.1様へのお礼の2に長々と書き続けてしまったことですが、例示においてB列の合計が10000以上だということになったら、次は「C列のうちの適当なセルの1を2に変えるとなると、どのように変えても、『C=1の行のB列の値の合計もC=2の行のB列の値の合計も10000以上』にならないこと」を証明したいです。今回の場合は、8000/2・9000/2に変えるとC=1の行のB列の値の合計は27000、C=2では17000となり反証されます。 ということは、「この場合、Cの最大値は2かもしれないが、1ということはない」と言えるわけです。 そして「C列のうちの適当なセルの値に1,2,3を入れると・・・」と続いていくことになります。 以上が、私の求めるところです。いかがでしょうか。

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.3

回答した例示に難癖つけても(そもそも違うんだろうなぁと言ってるわけですから)、具体的に、どのような状態を想定してるのか例示していただかないと…申し訳ありませんが理解不能です。 バラバラであったとしても、条件が「B列の合計が10000以上でC列の最大値がより大きくなるように」ですので、C列に入れる数値の最大値が3までとしたら(最大値を決めないならエクセルで扱える最大数です) B列 C列 1000 3 2000 3 3000 3 4000 3 5000 3 とか B列 C列 6000 3 7000 3 8000 3 9000 3 と考えますが。

ao-b
質問者

補足

ちょっと待ってください、今回の問題において、C列で扱える最大値が3であることを知りませんでした。 例えば、 B列/C列 2000/1 3000/2 4000/3 5000/4← 6000/4← 7000/3 8000/2 9000/1 という風にC列に自動入力することはできないのでしょうか?できないのであれば今回の質問は終了します。

  • kkkkkm
  • ベストアンサー率66% (1734/2604)
回答No.2

C列の同じ数値の行のB列の合計が10000以上になるようにということでしょうか B列 C列 5000 1 5000 1 5000 2 5000 2 みたいなことになるようにC列に自動で数値を入れたいということなのかなぁと思ったけど、C列に同じ数値が入った行のB列の合計が10000以上でC列の最大値がより大きくなるようにだから、C列に入れる数値の最大値がわからないけど3までとしたら B列 C列 5000 3 5000 3 5000 3 5000 3 以下の行すべてC列は3 の状態でも正解になるので、C列はすべて同じ数値でオッケーなことになるから違うような…。 具体的に、どのような状態を想定してるのでしょうか。

ao-b
質問者

補足

例示いただいた「B列に5000が4つ」であれば、C列に1,2,3まで入力しようとするとどうしても(C列の値が同じ行の)B列の合計に10000未満のものができてしまうことが、自分であればコンピュータを介さなくてもすぐに分かります。 問題はB列の各値がまるでバラバラであることで、そのためC列に1から順に数値を入力しようとした場合どこまで増やせるかがすぐに掴めないのです。

  • usami33
  • ベストアンサー率36% (808/2210)
回答No.1

たぶん、貴方の説明だと、永遠に回答は得られないかと キチンと読み直しして、読み手が処理を連想できる質問にしないと・・・ 今の文章だとLookupの組み合わせで出来そうな気もするし、 VBAでトリガーを含む機能にすべきか判断付きません ※ちょっと拝見しただけでも、↓こんな感じですよ > C列に同じ数値が入った行のB列セルの合計が、 セル数なのか、セルの値なのか判りませんよね > C列に1以上の整数を1・2・3・・・と順に >(全てのC列の数値において)10000以上になるように、 1,2,3なのか10000以上なのか判らん > そのうえでC列の最大値がより大きくなるようにすることです。 C列の最大値が何より大きくなるの? C列の値なら、既に最大値とご自分で書いてますよね > 商品の内容(値段)によっては、 > 全て10000以上になる組み合わせ また10000が出たけど、これもC列なの、それとも今度は値段のB列 > A・B列への入力が今後増えていくので 末尾に足されるの、それとも行間に挿入されるの

ao-b
質問者

補足

なかなか難しいですね。 1.「C列に同じ数値が入った行のB列セルの「値の」合計が」です。 2.試行錯誤のような書き方をした方が良いならば、以下でいかがでしょうか。 「既にA,B列に入力された行のうちいくつか行を適当に選びC列セルに1と、残りの行のC列セルに2と入力していき、C列=1であるB列のセル値の合計もC列=2であるB列のセル値の合計も10000以上になればよい。もしC列=1と2のどちらかでもB列のセル値の合計が10000未満であれば、C列への1,2の入力をやり直す(行を選択し直す)。全てのC列=1,2入力パターンにおいてもB列のセル値の合計が10000未満のものができてしまうならば、全てのC列に1を入力して終了。またC列=1と2の両方のB列のセル値の合計が10000以上になる入力パターンが見つかったら、「いくつか行を適当に選びC列セルに1と、残りの行のうちいくつかに2と、残りに3と入力した場合、全てのC列=1,2,3入力パターンにおいてB列のセル値の合計が10000未満のものができてしまう」ことを証明しなければいけない。証明できたらそこで終了。反証できてしまったら「(一部略)C列=1,2,3,4・・・」で同様に入力パターンを探る。 以上ですがいかがでしょうか。 これで2・3・4番目の回答に変えます。 3.入力位置はどこでもよいのですが、末尾の方が楽と言えば楽です。が、意図をもって途中に入力する方が都合のよい方法を紹介していただけるのであればそれでも良いです。

関連するQ&A

専門家に質問してみよう