エクセルで最小の残額を選び出す方法

このQ&Aのポイント
  • エクセルで手形の組み合わせを計算することで、最小の現金支払額を選び出す方法について説明します。
  • 手形を裏書譲渡することで現金支払額を減らす方法をエクセルを利用して自動的に選び出すことができます。
  • 検索や統計を用いて最適な手形の組み合わせを見つける方法についても解説します。エクセルの数式を使って計算することも可能です。
回答を見る
  • ベストアンサー

エクセルで残額が最小となるように選び出したい

手形が50枚ほどあり、それを一部仕入先に裏書譲渡し、残額は現金で支払います。 現金で支払う額を少なくするように手形(何枚でも可)を自動的に選び出せるようにしたいのですが、計算式など 方法はありますでしょうか? 例 手持ちの手形金額50,000、200,000、300,000、400,000、500,000 支払価額 630,000【裏書譲渡(200,000+400,000)+現金30,000】 実際には数字はもっと細かくてこの方法の支払先が10社ほどあり、いつも最適な組み合わせを考えなければならずどの手形の組み合わせで現金支払が最小で済むのか悩んでいます。検索?や統計?で一気に探せたらと思うのですが、もし方法がありましたら、教えてください。 エクセルの数式は結構好きなので、できればうれしいのですが。  

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

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.6

続きです。 金額が最適なものを選んでくれるのは良いのですが、特定の手形を除外せずに使いたい場合は、 手形1~10を必ず使いたいとき s.t. seiyaku7{t in {1..10}}: sum{s in Shiharaisaki}tegata_shiharai_maisuu[t, s]=1; 逆に除外したいとき s.t. seiyaku8{t in {1..10}}: sum{s in Shiharaisaki}tegata_shiharai_maisuu[t, s]=0; を追加します。 いろいろと条件を付けられそうです。 制限を加えると多分手形での支払い金額は減ってくると思いますので、適宜使用者が判断するのが良いように思います。 さて、計算結果をエクセルに戻したい時には出力をタブ区切りで出した方が便利なように思います。 やり方は分かりますか?

tinauto263
質問者

お礼

親切に色々教えてくださってありがとうございました。 家のPCではうまく起動したのですが、会社のPCでは上手く起動しませんでした(セキュリティとか色々入れられているからかもしれません) 教えていただいた方法は私には難しいのでこれをヒントに違う方法を考えたいと思います。 今回は「コマンドプロンプト」が初体験でワクワクしましたしとても勉強になりました。 (私も自分でプログラムできたらいいなと思いました) 貴重なお時間を割いて色々お考え頂きありがとうございました。

その他の回答 (5)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.5

手形をまとめる方法を考えてみましたが、手動でやるのが良いように思います。 やり方ですが、 まず全部の手形リストを作って計算します。その答えが一番現金を少なくする分け方です (同じ金額の他の分け方があるかもしれませんが、金額は最適条件です) 一つの方法としては、excelでまとめた金額の表を作り直してもう一度計算し直すというのもあります。 手形には1から番号を振っていますが、アルファベットが混ざっていてもよいし番号順になっていなくても良いです。 別の方法として、制約条件を加えていく方法があります。こちらの方が簡単かもしれません。 プログラムにs.t.から始まる行がありますが、その下あたり(solve;の前まで)に追加します。 例えば手形2と3を同じ取引先にしたい場合は次の行を追加します。 s.t. seiyaku4{s in Shiharaisaki}: tegata_shiharai_maisuu[2, s]=tegata_shiharai_maisuu[3, s]; 2と3~5までを同じにしたい場合には s.t. seiyaku5{s in Shiharaisaki, t in {3..5}}: tegata_shiharai_maisuu[2, s]=tegata_shiharai_maisuu[t, s]; のような書き方も出来ますし、数字が飛んでいる場合には s.t. seiyaku6{s in Shiharaisaki, t in {3,4,5,9}}: tegata_shiharai_maisuu[2, s]=tegata_shiharai_maisuu[t, s]; のような書き方も出来ます。 制約条件は他にも使い道があって、手形1をDに割り当てたい場合は(数字はそのまま入れるが、文字は""で囲むこと) s.t. seiyaku1: tegata_shiharai_maisuu[1, "D"]=1; 逆に手形2をDに割り当てたくない場合は s.t. seiyaku2: tegata_shiharai_maisuu[2, "D"]=0; とします。 それと、s.t. seiyaku1のようにs.t.の後のラベルseiyaku1が他の条件のラベルと同じになっていたらエラーになりますので、適当に変えてください。 もう一つ、行の始めに#をつけるとコメントになりますので、適宜追加して分かりやすくしてみてください。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

補足欄からすると、まとめたい特定の手形があるのではなく、小額のものはなるべくまとめたいということでしょうか。 特定の手形があるのかと思っていました。もう少し考えてみます。 入力方法を少し改良したものを載せておきます。 paramと重なっていた set Tegata:= set Shiharaisaki:= A B C D; の部分がなくなりました。 データ部分はエクセルからそのままコピーしてみてください。できるはずです。 set Tegata; param tegata_kingaku{Tegata}; set Shiharaisaki; param shiharaigaku{Shiharaisaki}; var tegata_shiharai_maisuu{Tegata, Shiharaisaki} ,binary; maximize TegataTotal: sum{s in Shiharaisaki, t in Tegata}tegata_kingaku[t]*tegata_shiharai_maisuu[t, s]; s.t. TegataShiharai{s in Shiharaisaki}: sum{t in Tegata}tegata_kingaku[t]*tegata_shiharai_maisuu[t, s]<= shiharaigaku[s]; s.t. uniq{t in Tegata}: sum{s in Shiharaisaki}tegata_shiharai_maisuu[t, s]<=1; solve; # Output printf " Tegata Kingaku"; for {s in Shiharaisaki} {printf "%5s", s;} printf "\n"; for {t in Tegata} { printf "%5s %10d ", t, tegata_kingaku[t]; for {s in Shiharaisaki} { printf " %3s ", tegata_shiharai_maisuu[t, s]; } printf "\n"; } printf "\n"; printf "Tegata shiharai total: %d\n", sum{t in Tegata, s in Shiharaisaki}tegata_kingaku[t]*tegata_shiharai_maisuu[t, s]; printf "Shiharaisaki betu\n"; for {s in Shiharaisaki} { printf "%5s %10s\n",s ,sum{t in Tegata}tegata_kingaku[t]*tegata_shiharai_maisuu[t, s]; } data; param : Tegata : tegata_kingaku:= 1 50000 2 200000 3 300000 4 400000 5 500000 6 20000 7 1200000 ; param : Shiharaisaki : shiharaigaku:= A 630000 B 1250000 C 20000 D 0 ; end;

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

>貴重なお時間を割いて教えてくださってありがとうございます。 いえいえ気にしなくて結構です。すこし難しそうな質問でしたので、パズル解きのようなつもりで楽しんでやってます。 フォルダはw32でした。すみません。w32がありますので解凍は終わっています。 普段はほとんどWindowsを使っていませんので、適切な説明ができないかも知れませんが、XPでは次のようにすれば計算できます。 まずは、正常に動くか確認してください。 No.2の下のプログラム部分を「メモ帳」などのソフトにコピーして、w32フォルダにtagata.modの名前で保存してください。 アクセサリの中に「コマンドプロンプト」のソフトがありますので起動してください。 黒いWindowがでますので、キーボードからCDに続けてスペースを入れ、マウスでw32フォルダを文字を入れた黒いウインドウ上にドラッグしてボタンを離してください。そうすると1行程度の文字列が入るはずです。改行キーを押して、 glpsol.exe -m tagata.mod(改行キー)と入れてください。 直ぐに答えが返ってくるはずです。手形の使用合計金額は同じになるはずですが、割り振りは少し違う結果になるかもしれません。 手形のことはほとんど分からないので、質問ですが、 >例:5万の手形が10枚あっても10社にバラして使うのではなく何社かにまとめて使い、裏書先を少なくする 同じ金額が複数枚あるのでしょうか、それとも金額が違う場合が多いのでしょうか? >手持手形は80枚程度ある この場合、上の10枚は出来るだけバラしたくはないが10枚と数えて80枚程度なのでしょうか。それともとりあえずバラしたくないので1枚と数えた数字なのでしょうか? (80種類の手形があるとするのか、まとめたいのでもっと少ないとして処理するのか) >1回使った手形は他の支払先には使えない 既に支払いにあてた手形は使えないということですよね。普通のお金と一緒の考えですよね。 それとも上の出来るだけまとめたいということと関係あるのでしょうか? 5万の手形が10枚まとめてあって、そのうち8枚を支払いに使ってしまった場合に、残りの2枚は裏書きには使えないという意味ではないですよね。裏書きの手間さえ厭わなければ2枚も使えますよね。 このように10枚まとめてあったときにはどのような形で裏書きをするのでしょうか?一枚ずつ分かれていなくて、つながったような形をしているのでしょうか?(素人ですみません、興味本位ですが) 少し考えてみます。できそうな気がしますので。 通勤時間の暇つぶしにちょうどいいのです。

tinauto263
質問者

補足

早速のお返事ありがとうございます。助かります。 計算結果は Tegata Kingaku A B C D 1 50000 0 1 0 0 2 200000 1 0 0 0 3 300000 0 0 0 0 4 400000 1 0 0 0 5 500000 0 0 0 0 6 20000 1 0 0 0 7 1200000 0 1 0 0 (空白が無くなって見にくいですが、実際の出力は見やすいです) Shiharaisaki betu A 620000 B 1250000 C 0 D 0 ↑この様に出ました。ご丁寧に説明していただいてありがとうございます。 実際数字を入力して確かめてみます。 同じ金額が複数枚あるのでしょうか、それとも金額が違う場合が多いのでしょうか?→金額が違うものが80枚(80種類)です。(同じ金額のものは2-3枚ありますが現状況では無視していいと思います。)5万の手形が10枚ということは現実にはありませんが、それくらい少ない金額のものが多数あれば、支払先すべてにバラまくのではなくできるだけ支払先をまとめたいという意味です。 既に支払いにあてた手形は使えないということですよね。普通のお金と一緒の考えですよね。→そうです。 それとも上の出来るだけまとめたいということと関係あるのでしょうか? →関係ありません。たとえばエクセルで「この中から残金額が最小のものを選ぶ」と条件指定した場合、同じ手形があちこちに使われる可能性があると思い ルールに入れました。 5万の手形が10枚まとめてあって、そのうち8枚を支払いに使ってしまった場合に、残りの2枚は裏書きには使えないという意味ではないですよね。裏書きの手間さえ厭わなければ2枚も使えますよね。→ 手形で支払いが出来る先は10社程度なので 支払い金額が少なくて今月は8枚しか使えず、来月以降残り2枚は使えます。 急いで全部使う必要はありません。 10社の支払いに80枚の手形の中から使えるものを使う、残りの手形は 別の用途で使えます。 このように10枚まとめてあったときにはどのような形で裏書きをするのでしょうか?一枚ずつ分かれていなくて、つながったような形をしているのでしょうか?→手形は金額の書かれた紙1枚なので裏に銀行印を押して支払先に送ります。10枚の手形の裏に印を押して送ります。 つながっていません。バラバラの紙です。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

No.1です。 >実際には数字はもっと細かくてこの方法の支払先が10社ほどあり、 10社程度を全体を見ながら割り振りたいということでしょうか? 先に紹介しましたExcelによる方法ですが、できないことは無いでしょうが、一遍にやってしますのは結構大変だと思います。やられるのでしたらまず一社ずつ順番に処理していくようにして、仕組み自体を理解した後で、一気にやってしまう方法を考えた方が良いように思います。少し考えてみたのですがExcelでやるのは結構大変なように思います。私の頭ではコンガラガってしまいました。 glpkでやる方法を紹介しておきます。基本的には何社でも処理できます。 Windowsのようですので http://sourceforge.jp/projects/sfnet_winglpk/ からwinglpk-4.47.1.zip(今日時点)をダウンロードして解凍してください。中にwin32というフォルダがありますので、そこにプログラムが入っています。 glpsol.exe -m tagata.mod をコマンドプロンプトで実行すれば計算できます。こちらはXPで確認しました。 計算結果は Tegata Kingaku A B C D 1 50000 0 1 0 0 2 200000 1 0 0 0 3 300000 0 0 0 0 4 400000 1 0 0 0 5 500000 0 0 0 0 6 20000 1 0 0 0 7 1200000 0 1 0 0 (空白が無くなって見にくいですが、実際の出力は見やすいです) Shiharaisaki betu A 620000 B 1250000 C 0 D 0 プログラムは下記のとおりです data;より下に計算するためのデータを入れてください。(それより上は変えないように) set Tegata:=からは手形の名前(とりあえず数字にしています) param tegata_kingaku:=からは手形の名前と金額 set Shiharaisaki:= A B C D;支払い先の名称(とりあえずアルファベットに) param shiharaigaku:=からは支払い先の名称と支払い金額です。 それぞれ空白か改行で区切ればよいので、入力しやすいように入れてください。Excelなどからコピーして方が良いように思います。 そうそうデータの塊の最後のセミコロン(;)は忘れないように。 支払先ごとに上限金額や上限枚数などの条件も簡単に追加できます。 もし分からないことがありましたら、書き込んでください。 #-----------次の行からtagata.modのファイル名で保存 set Tegata; set Shiharaisaki; param tegata_kingaku{Tegata}; param shiharaigaku{Shiharaisaki}; var tegata_shiharai_maisuu{Tegata, Shiharaisaki} ,binary; maximize TegataTotal: sum{s in Shiharaisaki, t in Tegata}tegata_kingaku[t]*tegata_shiharai_maisuu[t, s]; s.t. TegataShiharai{s in Shiharaisaki}: sum{t in Tegata}tegata_kingaku[t]*tegata_shiharai_maisuu[t, s]<= shiharaigaku[s]; s.t. uniq{t in Tegata}: sum{s in Shiharaisaki}tegata_shiharai_maisuu[t, s]<=1; solve; # Output printf " Tegata Kingaku "; for {s in Shiharaisaki} { printf "%5s", s; } printf "\n"; for {t in Tegata} { printf "%10s %10d ", t, tegata_kingaku[t]; for {s in Shiharaisaki} { printf " %3s ", tegata_shiharai_maisuu[t, s]; } printf "\n"; } printf "\n"; printf "Shiharaisaki betu\n"; for {s in Shiharaisaki} { printf "%5s %10s\n",s ,sum{t in Tegata}tegata_kingaku[t]*tegata_shiharai_maisuu[t, s]; } data; set Tegata:= 1 2 3 4 5 6 7; param tegata_kingaku:= 1 50000 2 200000 3 300000 4 400000 5 500000 6 20000 7 1200000; set Shiharaisaki:= A B C D; param shiharaigaku:= A 630000 B 1250000 C 20000 D 0; end;

tinauto263
質問者

補足

貴重なお時間を割いて教えてくださってありがとうございます。 私はPCに詳しくありませんので手間取っていまして >からwinglpk-4.47.1.zip(今日時点)をダウンロードして解凍してください。中にwin32というフォルダがありますので、そこにプログラムが入っています。 のwin32が見つかりません。W32でしたらありましたがこれでしょうか? 申し訳ないのですが解凍の方法も教えてください。 10社程度を全体を見ながら割り振りたいということでしょうか→そうなんです。 自動的に条件に合う組合せを抽出できるようにしたいのですができますでしょうか? ルールはまとめると、 支払先に手形の裏書譲渡をする。端数は現金(小切手)で支払う。 手形は何枚使ってもよい 現金の支払が一番少なくなるように手形を選ぶ 1回使った手形は他の支払先には使えない 手持手形は80枚程度ある、裏書先は10社程度 該当の裏書手形がない場合は振込にしている 裏書先はまとめる(裏書の準備が手間なので) 例:5万の手形が10枚あっても10社にバラして使うのではなく何社かにまとめて使い、裏書先を少なくする A社 1,831,200 例⇒手形 \942,069と\886,897 残額2,234(現金) B社 2,062,200 例⇒手形 \463,776と \608,929と\970,000 残額19,495(現金) ・ ・ ・ ・ となります。(ややこしくてすいません)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

こういう場合には整数計画ソルバー(線形計画ソルバー)を使います。実際にはExcelでやったことは無いのですが、次のものを見る限り可能な様です。 http://lab.mgmt.waseda.ac.jp/intro_a/logistics/how2solver.pdf Excelが得意なようですので、ヒントだけにしておきます。 まず、手形の金額の表をつくります。 目的セル 現金の支払額の計算値(支払額-支払いに使う手形総額) 目標値は現金の支払額ですので最小にする 制約条件は現金がマイナスになってはいけませんので、現金の支払額の計算値が0か正になるようにします。 もうひとつ大事なことですが、各手形に対してそれを使うか使わないかを示すセルが必要ですので、そこに0または1に制限されるようにします。 ご参考に 私自身はglpkという専用のフリーソフトでやりました。きれいに解けますよ。 ただし、答えは最小の組み合わせが複数有っても1つしか返ってきませんので

関連するQ&A

  • 為替手形の裏書譲渡について

    得意先札幌商店に商品400,000円を販売し、代金のうち150,000円は札幌商店振出し、函館商店引き受け済みの為替手形を受け取るとともに、仕入先津軽商店振出し、当店引き受け済みの為替手形100,000円の裏書譲渡を受け、残額は翌月末に受け取ることとした。なお、当店負担の発送運賃6,500円を現金で支払った。 この問題の仕訳は下記のようになりますが、何故、当店引き受け済みの為替手形を裏書譲渡を受けると借方・支払手形になるのですか? 受取手形 150,000 売上 400,000 支払手形 100,000 現金 6,500 売掛金 150,000 発送費 6,500

  • 為替手形の裏書譲渡について教えてください。

    為替手形の裏書譲渡について教えてください。 簿記3級の勉強をしていてわからないところがあったので、どなたか解説いただけるとありがたいです。 問題 A商店から商品111,000円を仕入れ、代金のうち60,000円についてはB商店振出し、当店あての為替手形を裏書譲渡し、残額を掛けとした。なお、引取運賃1,200円については現金で支払った。 解答の仕分け 仕入 112,200 受取手形 60,000 買掛金  51,000 現金   1,200 となっています。 当店あての為替手形=支払手形ではないのですか? わかる方、解説お願いします。     

  • 回り手形の振出人が倒産

    会社で経理、財務を担当しておりますが、最近の不況で自己手振出より受取手形に裏書し支払いにまわしておりましたところ、手形の振出人が倒産した旨新聞で知りあわてて確認しましたら当方買掛金の 支払いに使っている物が数百万あることがわかりました。(振出人→裏書人(売掛金回収)→当社裏書(買掛金支払)→支払い先) 以前にもこうゆうことがあったとき(売掛金回収→手形割引)は直接の裏書譲渡先より申し入れがあり 期日に現金を回収。そのときは当社が割引に出しておりましたので戻された手形を先方に返し一件落着しましたが今回の場合支払期日はまだ先であり、直接の裏書人(売掛金回収先)の経理からも何の連絡もなくこちらから言うべき物か困っております。 支払い先とは当方から渡した手形の振出人が自己破産した旨伝えております。期日前とゆうこともありまだ連絡はありません。どなたか教えてください。

  • 会計処理

    無知なもので・・・教えて下さい。 受取手形を支払先に譲渡手形(裏書手形)として支払ました。 しかし、その手形が不渡りになり戻ってきました。 支払先にはその手形分として小切手で支払ました。 「譲渡手形を売掛金に戻し、譲渡手形分の小切手を当座より譲渡手形で出して」と言われたのですが、会計処理(振替え)がわかりません・・・(泣) どのように振替え伝票を打てばいいのでしょうか?

  • 日商簿記3級の問題

    問題集に載っていた、手形の裏書譲渡の問題が理解できません。 問)A商店に商品¥300,000を売上げ、代金のうち¥200,000については当店振り出し、B商店宛ての約束手形を裏書譲渡され、残額は月末に受け取ることにした。なおその際、発送運賃(A商店負担)¥9,000を小切手を振り出して支払った。 答えは  支払手形  200,000    売上 300,000       売掛金    109,000   当座預金 9000  解説に、自己振り出しの約束手形の回収という事で、当店が振り出した約束手形(支払手形)が、裏書譲渡されて戻ってきているので、支払手形(負債)の減少で処理する。とあります。 ここまでの理屈は分かりますが、なぜB商店に振り出した約束手形なのに、なぜA商店が所有していたか、為替手形で裏書譲渡なら分かりますが・・・ 勉強中です。誰か教えてください。

  • 電子記録債権(でんさい)について

    うちの会社では、顧客からもらった約束手形に裏書して支払先に回すことが多くあります。 近い将来でんさいを利用して支払いを受けるようになりますが、こちらの支払先のほうがでんさいの準備をしていない場合、裏書手形での支払いは出来なくなるのでしょうか。 よろしくお願いいたします。

  • 簿記問題について(仕訳)

    この問題の解答を教えて頂けますでしょうか。 問:次の取引について仕訳せよ。 勘定科目は、次の中から選ぶこと。 現金、当座預金、受取手形、売掛金、売買目的有価証券、立替金、支払手形、買掛金、仮受金、前受金、当座借越、売上、仕入、消耗品費、旅費交通費、通信費 仕入先A商店から商品600,000を仕入れ、代金のうち¥300,000については、同点宛の約束手形を振出し、¥200,000については宮崎商店振出し、当店宛の約束手形を裏書譲渡し、残額は翌月末に支払うことにした。なお、この商店を引き取る際に生じた運賃¥20,000を現金で支払った。

  • 手形について(初心者です)

    夫が個人事業主で、私が経理をしています。来月取引先A社から手形を受け取り、裏書をしてその手形で仕入先に買掛金の支払いをします。(手形の支払いでOKと了承を得ています)A社もその手形はどこかの会社からまわってきた手形のようです。 そのときの仕訳は受取手形/売上で仕入先にまわしたときは買掛金/受取手形でOKですか?手形を受け取った時の領収書に貼る収入印紙代は租税公課でいいのでしょうか?そして、手形はすぐ仕入先にまわしてしまうので、うちとしてはまわした時点で現金のように買掛金は支払った、という感覚でいていいのでしょうか?それとも、まわして手元になくても裏書をした場合は仕入先が手形を現金化するまで、こちらも責任があるのでしょうか? はじめての初心者で手形とは怖いイメージがあり夫にも、取り扱わないようにお願いしてきましたが、今回どうしてもとのことでパニックってます。 こういう場合、どこかに相談に行くべきでしょうか?たいした売上もないのに専門家のところへ行くのは少し恥ずかしくて躊躇してしまいます。長文になりましたが、どなたかお知恵をお貸しください。お願いいたします。          

  • 簿記二級  手形の裏書・割引

    手形の裏書譲渡と、手形の割引譲渡の違いってなんでしょうか? 手形の裏書・・買掛金などの支払いをする代わりに、受取手形を譲渡することで、これに対して、手形の割引譲渡はお役所を通すので手形売却損が発生するという違いがある、ということかな?と個人的には理解しているのですが、間違ってるんでしょうか? それから、対照勘定法、評価勘定法ってなんでしょうか? 手形の裏書譲渡・割引を二つの方法でした場合、 どうしてこんなに違ってくるのか理解できません。

  • 受取手形が不渡りになったらどのように対応したらいいか

    質問します。 振出人→当社→A社(仕入先) 当社は、1番裏書人です。 当社は、支払先に買掛金の一部として手形を支払先に渡しました。3/31期日に手形が決裁されなかったと支払先より連絡がありその事実を初めて知りました。4/1取り戻ししたので支払をして欲しいとのことで小切手を支払ますがその時は、領収書等は、どうしたらいいのか又戻ってきた手形は、どのように扱えばいいのか?手形と引換えに支払したほうがいいのか・・・ 当社は、振出人に対してどうしたらいいのか?不渡になった分の請求は、すぐした方いいのか…こちらから連絡した以外振出人からは、何の回答もなく現在どの様に進めるか検討中とのこと倒産などは、現在考えていないそうなのですが待つしかないのでしょうか・・・ 初めての出来事なのでその不渡りになった手形・回収出来なかった代金は、どうなるのでしょうか対応がわかりません。 お手数ですが教えてくださいお願いします。