• ベストアンサー

エクセルで集計

こんにちは エクセルでの集計でよい方法があれば教えてください。 乗車定員が9人の車で、何組かの団体がいます。 同じ団体は同じ車に乗ることが絶対条件で、最小で何台の車が必要か台数が簡単に出せるような関数があれば教えてください。また、その組み合わせを表示するようにすることは可能でしょうか? (別のセルに組み合わせを表示できるようにすることは) (例) 4人 2人 5人 3人 2人 4人 5人 2人 4人  合計31人  台数 31÷9で4台で全員乗ることができますが同じ団体は分かれて乗車することになりかねないです。(この場合は分かれて乗ることにはなりませんが・・・) もっと数が多い場合や毎回組み合わせを考えるのが面倒なので、 組み合わせや台数を関数で計算できればとても助かります。 こんなことは可能でしょうか? 宜しくお願いします。

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

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

VBAエディタ画面で、ツール―参照設定 で、SOLVERにチェックを入れてSOLVERを使えるようにしてください。 添付図のピンク部分を入力し、黄色部分にデータを入れます。 図では降順に入力されていますが、コードで並べ替えますから、順番はどうでもいいです。 黄色部分の下は何も入力しないでください。 下記プログラムを実行してください。 添付図のような結果が得られるでしょう。 Sub solver3() Dim r1 As Integer, r2 As Integer, c0 As Integer, c1 As Integer, c As Integer Dim n As Integer, lmax As Single, nin As Integer Dim rm As Integer, nrm As Integer, total As Single, r As Integer, col As Integer c0 = 2 c1 = 3 r1 = 3 c = 4 n = 0 lmax = Cells(1, 2) r2 = Cells(r1, 1).End(xlDown).Row Range(Cells(r1, c - 1), Cells(r2 + 1, 256)).ClearContents Range(Cells(r2 + 1, c1), Cells(r2 + 100, 256)).ClearContents Range(Cells(r1, c - 3), Cells(r2, c - 2)).Sort Key1:=Cells(r1, c - 3), Order1:=xlDescending, _ Key2:=Cells(r1, c - 2), Order2:=xlDescending Cells(r2 + 1, c - 2).FormulaR1C1 = "=SUM(R[" & -(r2 - 1) & "]C:R[-1]C)" total = Cells(r2 + 1, c - 2) Range(Cells(r1, c0), Cells(r2, c0)).Copy Cells(r1, c1).PasteSpecial SolverReset While total > 0 Range(Cells(r1, c + 1), Cells(r2, c + 1)).FormulaR1C1 = "=RC1*RC[-1]" Range(Cells(r1, c), Cells(r2, c)) = 1 Range(Cells(r2 + 1, c - 1), Cells(r2 + 1, c + 1)).FormulaR1C1 = "=SUM(R[" & -(r2 - 1) & "]C:R[-1]C)" rm = r1 nrm = Cells(rm, c1) While nrm = 0 rm = rm + 1 nrm = Cells(rm, c1) Wend SolverAdd CellRef:=Cells(rm, c), Relation:=3, FormulaText:="1" SolverOk SetCell:=Cells(r2 + 1, c + 1), MaxMinVal:=1, ValueOf:=lmax, ByChange:=Range(Cells(r1, c), Cells(r2, c)) SolverAdd CellRef:=Range(Cells(r1, c), Cells(r2, c)), Relation:=1, FormulaText:=Range(Cells(r1, c1), Cells(r2, c1)) SolverAdd CellRef:=Range(Cells(r1, c), Cells(r2, c)), Relation:=3, FormulaText:="0" SolverAdd CellRef:=Range(Cells(r1, c), Cells(r2, c)), Relation:=4, FormulaText:="整数" SolverAdd CellRef:=Cells(r2 + 1, c + 1), Relation:=1, FormulaText:=Format(lmax) SolverSolve userfinish:=True For r = r1 To r2 Cells(r, c1) = Cells(r, c1) - Cells(r, c) Next Range(Cells(r2 + 1, c), Cells(r2 + 1, c + 1)).Copy c = c + 2 Cells(r2 + 1, c).PasteSpecial total = Cells(r2 + 1, c1) SolverReset n = n + 1 Wend Cells(r2, c) = "総車数" Cells(r2 + 1, c) = n Cells(r2, c + 1) = "総人数" nin = 0 For col = c1 + 2 To c - 1 Step 2 nin = nin + Cells(r2 + 1, col) Next Cells(r2 + 1, c + 1) = nin Cells(r2 + 1, 1) = "計" End Sub

kurosuke01
質問者

お礼

同じ表を作成して、VBAのプログラムをコピーして実行してみました。 しかし、「ソルバー:内部エラーまたはメモリ不足です」という表示がでて計算結果が下のようになりました。 乗車定員9             1号車 人数  組数   作業列   組    人 計    1              #VALUE! 5     2     2    1     5 4    3      3     1    4 3    1      1     1    3 2    3      3     1    2      9       9     5    #VALUE! (ちょっとずれてしまいましたが・・・) 2号車以降は何も出力されませんでした。 どこがおかしいのでしょうか? ちなみにPCのスペックは、 ウィンドウズXP メモリは500MBでエクセル2003です。 それから、これはR1C1参照形式でしかできないのでしょうか? 試しに変更してみましたがやっぱりうまくできませんでした。

kurosuke01
質問者

補足

丁寧なお返事ありがとうございます。 質問ですが、 この画像の表を新規のシートに作ってからVBAをコピーすればいいのですか? また、プログラムを挿入するのはどのプロジェクトまたはモジュールにコピーすればいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.5

>ついでで申し訳ないんですが、 「黄色部分の下は何も入力しないでください。」 というのは、何人でも何組でも定員が何人でも対応できるようにしているためです。 必要な人数と組数をA列とB列に入れればいいです。

kurosuke01
質問者

お礼

確かにできました。 本当にすごいですね、感動しました。 ありがとうございました。 VBAの本で初歩的なレベルから読むのにいい本をご存知でしたら、 ぜひ教えてもらえませんか?

全文を見る
すると、全ての回答が全文表示されます。
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.4

#2,#3です。 #3で、 「黄色部分の下は何も入力しないでください。」 と書いていますが。 「計」とか入力したんじゃないですか。

kurosuke01
質問者

お礼

まさにそのとおりでした。 おみそれいたしました・・・。 すごいですね、こんなことができるなんて。ありがとうございました。 ついでで申し訳ないんですが、 A列の人数を1から9人まで増やして、組数もそれに対応して同じだけ増やすにはどこのパラメーターを変更すればいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

理論的に完全かどうかはわかりませんが、ExcelのSolverを使えば十分実用になるものができます。手動でもできますが、操作が面倒なのと、ここで説明するのが面倒なので、VBAでやることになりますが、VBAでも大丈夫ですか。

kurosuke01
質問者

補足

お返事ありがとうございます。 ExcelのSolverは聞いたことがありますが使ったことはありません。 少し勉強してみます。 VBAは初歩的なものなら少しは分かりますがあまり自信はありません。 でも、ぜひ良かったら教えてください。

全文を見る
すると、全ての回答が全文表示されます。
  • Be_DaMa
  • ベストアンサー率33% (2/6)
回答No.1

ご質問内容は、「ビンパッキング問題」といわれているものですね。 求め方は何通りも考案されていますので、まず、どういった方法で車の最小台数を 求めるかを考える必要があると思います。 しかし、あらゆる場合の最小数を効率的に見つけることができるような万能な方法はありません。 簡単な方法の例 団体を空いている人数の少ない車に乗せる→乗れないときは 次に空いている人数の少ない車に乗せる・・・・→ 乗せる車がないときは新しい車に乗せる これらを関数を使って計算するのは、私は無理なように思います。

参考URL:
http://ja.wikipedia.org/wiki/%E3%83%93%E3%83%B3%E3%83%91%E3%83%83%E3%82%AD%E3%83%B3%E3%82%B0%E5%95%8F%E9%A1%8C
kurosuke01
質問者

お礼

早速お返事ありがとうございます。 「ビンパッキング問題」ですか。 調べてみます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excelシートでの集計

    エクセルを使って、2~4万件のデータ集計作業で困っています。 概要は下記のとおりなのですが、これらを集計する方法はありますでしょうか? If関数を使っていましたが、ファイル容量が大きくなりすぎて使えなくなりました。 ・Excel2002を使っています。(会社の仕様なので、2003は使えません) ・シートは1枚を使っています。 ・2~4万のデータが50のファイル分あります。(合計180万データ) ・構成要素は、3つです。(年式、型番、台数) ・同じ型番で、違う年式のものが1~数十台発生します。 ・年式は18種類(1988以前~2005)あります。 ・型番は数百種類あります。  これらのデータを、同じ型番の台数が何台になるかを集計したいのですが、うまく出来ません。  同じような型番が多いので、ソートをかけても正しく集計されているか自分で判断できません。(抜けが多くて分からなくなる)  同じ情報のセルを探して、任意のセルの数字を合計するような命令はありますでしょうか?  やはりマクロの世界に入らないと解決しないのでしょうか。 (データ例) 1990年式 KE-PIO202SGW 3(台) 1991   KE-PIO202SGW 1 1992   KE-PIO202SGW 11 1989   KE-PIO202SGV 1 1991   KE-PIO202SGV 5 1993   GG-WER2033  3 1994   GG-WER2033  4 1994   GG-WER2034  15 1994   PPD-12DEFG  4 というようなデータです。   

  • エクセル集計関数について

    よろしくお願いいたします。 エクセル2003にて下記のような感じで集計を行いたいと考えております。   A  B 1 ○  ○ 2 ○  ○ 3 ○ 4    ○   …  … この○印を集計する際に、A・B共に○印が付いている場合は1日、 どちらか一方のみの場合は1回として集計したいのです。 (上記例の場合はAの最終欄に2日と表示し、Bの最終欄に2回と表示したい。) このような集計を行える関数はありますか? 稚拙な質問と思いますが、何卒よろしくお願いいたします。

  • エクセルの集計機能について

    エクセルの集計機能を使う事を最近知りました。 そこで質問なのですが、集計機能で抽出する「集計の方法」があるのですが、抽出するデータの「合計・データの個数・平均・最大値・最小値」をすべて表示させたいのですが、そのような方法はあるのでしょうか? <例> 集計→集計の方法(合計)の場合の表記です。 店名 商品名 数量 1 サティ G社 30 1 サティ G社 1 サティ 計 31 2 ビブレ C社 5 ビブレ 計 5 3 ジャスコ M社 6 3 ジャスコ M社 2 ジャスコ 計 8 総計 44 上記の例では、合計しか抽出されていないのですが、サティでの「合計・データの個数・平均・最大値・最小値」を表示させたいということです。

  • EXCELの集計で悩んでいます

    EXCEL2003で、 ・商品ID ・商品名 ・支店 ・在庫数 ・在庫金額 ・販売開始日 を商品IDごとに在庫数と在庫金額の集計を行いました。 行数は約1万、集計行は約1千あります。 ここまでは問題なく出来たのですが、 集計行には、商品ID集計として、在庫数と在庫金額の合計しかなく、 集計行のみにした場合、商品名と販売開始日が表示されません。 集計行に、商品名と販売開始日を追記するマクロを書きたいのですが (関数でもかまいません)、どなたかお知恵をお借りできませんでしょうか。 よろしくお願いいたします。

  • 乗車定員5人 大人4人+子供2人って?

    タイトル通り、乗車定員5人のセダンに 大人4人と、子供(3歳)2人というのは、定員オ-バ-になりダメですか? 又、チャイルドシ-トの使用の義務が免除される場合の、道交法第26条の3の2の第4項の2に『定員内の乗車で、乗車人員が多人数のため乗車する幼児全員にチャイルドシ-トを使用すると全員が乗車できなるなるとき』ってあるみたいですが、私たちの場合、チャイルドシ-ト義務違反になりますか? 宜しくお願い致します。

  • Excelで集計を出すには

    添付した画像についてです。 左には、集計した表、右にはその結果を自動で出したいと考えています。 例えば、3行目は左の表に「2」と「3」が入っています。よって、その結果を右の表のE列に1、F列に1と手動で入力しています。4行目~8行目も同様です。 ここで質問ですが、9行目の左の表に「3」、「3」と入っている場合、どのような数式か関数を使えば、右の表のF9に「2」と自動で表示させる事が出来るのでしょうか? 詳しい方がいましたら、よろしくお願いします。

  • エクセルのリストで表示されてるものだけの集計

    エクセルのリストを使ってフィールドで表示を選択して絞り込んだ時に表示されているものだけのの集計って出来ますか?出来れば、ユーザー定義関数(VBA)でもかまいません! 例 いぬ  5 ねこ  3 とり  2 いぬ  3 かえる 1 いぬ  2 と、リストがある場合にいぬだけを表示させて合計10を得たいとおもいます。 どなたか詳しい方いらっしゃいましたら教えてください。 宜しくお願いいたします。

  • エクセル 異なる範囲の集計(合計)

    誰かアドバイスをお願いします。 エクセルで下記の様な異なる行数(範囲)を自動集計させたい場合はどうすればよろしいでしょうか?       A      B      C     D        E      日付    注文NO  金額   注文金額計  日別注文金額合計 1   5月1日     1     50     150       250 2                  50       3                  50                4             2    50     100 5                  50                    6   5月2日     3     50     50        150 7             4     50    100 8                   50                                            やりたい事は、D列へ注文金額計に注文NO別の合計金額を集計させる事(注文NOごとの一番上の行のみです。)  と E列へ日別の注文金額合計を集計させる事です。(日別の一番上の行のみに表示)   sumif関数を使えばうまく行きそうなのですが、問題が2つあります。 (1)集計条件の日付や注文NOは、重複している場合は、一行のみ表示の仕様です。(他ファイルからデータを貼りける為、その様な仕様になり、極力入力する事は避けたいです。) (2)合計範囲の行数が一定ではないので出来ればEやD列の全てのセルに関数なりを設置し、一番最上行のみに結果を表字したい。例えばsumif関数をE,D列全ての行に設定してしまうと同じ集計結果が何行にも渡って表示されてしまうのは避けたい。(上の例でいえばE列に150が何行も表示されてしまう。 かといって重複行の最上行のみに関数を設定するのは、一行ずつの作業になってしまう為、避けたい。 何かいい方法がないでしょうか?   個人的には、関数の方がやりやすいのでいいのですが、マクロやVBEでもあれば教えて頂けますでしょうか?

  • エクセル2003ですが、集計でわかりません

    エクセル2003ですが、集計でわかりません。 セルA1からA10までで、H18(といる指定英数字)に該当、セルB1からB10までで、(数値)3に該当、そして、セルC1からC10までの間で、この両者を満たすセルの数値(セルC1からC10までの間でこれに該当するものが複数ある場合は、それらの合計の数値)を、指定したセルD1に表示したい場合、セルD1へ入れる、関数式はどうなるのでしょうか? 仕事上必要になりました。 どなたか、教えていただけないでしょか?(急ぎます) ごめんなさい。

  • エクセルの関数複数条件にあう集計のしかた

    困っております。。教えてください。 アンケートの集計表を作りたいのです。 例えば、下記のようなアンケート結果がありまして 10代満足は1、10代その他は1といったような集計ができる関数を作りたいのですが SUMPRODUCT=((A1:A4=”10代”)*(B1:B4=”満足”)) といったような式をつくりました。ですが、B列の回答が複数ある場合 30代満足は1、30代その他は1と集計したいのですが 上記関数では集計できません。回答結果は複数の組み合わせがあり2つだったり、3つだったりもします。(1つのセルの入力されています。) 回答結果を1つ1つのセルにわけないとダメでしょうか? 分ける場合はまたよい方法はありますでしょうか? わかりにく説明で申し訳ないのですが、どなたかご教示いただけると幸いです。。 よろしくお願いいたします。     A  B 1 10代 満足 2 20代 不満 3 10代 その他 4 30代 満足、その他

庭木が勝手に切られました
このQ&Aのポイント
  • 隣家に訪れたシルバー人材センターが勝手に私の庭木を剪定していました。
  • 私の庭に植えてあった山椒の木が急に切り落とされていました。
  • 証拠がないため、シルバー人材センターへの連絡も効果がないと思われます。
回答を見る

専門家に質問してみよう