dポイントプレゼントキャンペーン実施中!

エクセルの2007を使っております
現在積み荷のバランスを数値から算出したく
試行錯誤しております、良ければアドバイスお願いします。
E F G H I J K ...
1234567
275029803650398046005980
27503650398046005980
27503650
3650
3650
このように荷物ごとの長さがございます
上記ですと2750X3 2980X1 といった形です
ポイントが何個かありましてそれに対する並び替えを
おこないたいのです
1、左右対称が望ましい(1対ずつ)
2、長さは12000まで
3、3段目まで

右側
3280036503980
2275029805980
1365036504600
左側
3280028003980
2275027505980
1365036504600

このような形になるのが望ましいのですが、
完璧とはいかないまでも近い形になればと思っております
よろしくお願いします。





 

A 回答 (5件)

Solverを使えば完全ではなくても実用的なものができると思います。


異なる長さのものを組み合わせて、12000になればいいので、そのようにVBAでプログラムします。
結果を見て、左右対称を考えるか、はじめに材料の数を2分して計算すればいいでしょう。
A列に寸法、B列に個数を入れて、下記プログラムを実行すれば、C列以下に結果が出ます。
それを見て気に入るように積めばいいでしょう。

Sub solver3()

Dim r1 As Integer, r2 As Integer, c As Integer, n As Integer, lmax As Single
Dim rm As Integer, nrm As Integer, total As Single

r1 = 2
r2 = Cells(r1, 1).End(xlDown).Row

c = 3
n = 0
lmax = 12000

Range(Cells(r1, c - 2), Cells(r2, c - 1)).Sort Key1:=Cells(r1, c - 2), Order1:=xlDescending, _
Key2:=Cells(r1, c - 1), Order2:=xlDescending

Range(Cells(r1, c + 2), Cells(r2 + 1, 256)).ClearContents
Cells(r2 + 1, c - 1).FormulaR1C1 = "=SUM(R[" & -(r2 - 1) & "]C:R[-1]C)"
total = Cells(r2 + 1, c - 1)
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, c - 1)
While nrm = 0
rm = rm + 1
nrm = Cells(rm, c - 1)
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, c - 1), Cells(r2, c - 1))
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

Range(Cells(r2 + 1, c - 1), Cells(r2 + 1, c + 1)).Copy
c = c + 3
Cells(r2 + 1, c - 1).PasteSpecial
Range(Cells(r1, c - 1), Cells(r2, c - 1)).FormulaR1C1 = "=RC[-3]-RC[-2]"

total = Cells(r2 + 1, c - 1)

SolverReset

n = n + 1

Columns(n * 3 + 2).EntireColumn.Hidden = True

Wend

Cells(r2 + 1, c) = n

End Sub
「トラックへの荷物の積みかたを算出したいの」の回答画像3
    • good
    • 0
この回答へのお礼

ありがとうございます!! 
VBAは自動記録のコードを触るぐらいしかしたことがないのですが、
がんばってみます、
残念ながらコンパイルエラーが表示されてしまい
SolverReset   SUBまたは fanctinon が定義されてません。。
という感じででるのです、
少し自分で調べてみます
ありがとうございます。

お礼日時:2009/03/13 20:53

拙作のSeek(フリー)で解くと、



9,700 ~ 2本  5,980 x 1  3,650 x 1  残=70
9,700 ~ 2本  4,600 x 1  3,980 x 1  残=1,120
9,700 ~ 1本  3,650 x 1  2,750 x 2  残=550
9,700 ~ 1本  3,650 x 1  2,980 x 1  2,750 x 1  残=320

となりますので、
同じ組み合わせのもの(2本のもの)を左右に振り分けて、
残が550の組合せを右、残が320の組合せを左に振り分けると
左右のアンバランスは 550-320=230 となり、
1%以下に収まりました。

9700で収まりますので、トレーラーでなく10tでも
運べそうです (^^;

残が小さい組み合わせを下に乗せると、さらに安定しますね。
ご安全に!

参考URL:http://supermab.com
    • good
    • 0
この回答へのお礼

ありがとうございます。
ぜひ活用させていただきます^^

お礼日時:2009/03/16 08:43

書き忘れましたが、Solverを使うには、VBの編集画面の、


ツール―参照設定
で、
SOLVERにチェックを入れてください。
そうすれば、
>残念ながらコンパイルエラーが表示されてしまい
>SolverReset   SUBまたは fanctinon が定義されてません。
は、
出ないと思います。
    • good
    • 0

少なくともExcelで計算するのは諦めてください。



この問題は「計画問題」という分野になり、超
難解問題の1つに入ります。もっとも積荷の数に
難解さは決定されますが。

具体的な数値が固定であれば、人間が時間をかけ
て計算するのが一番でしょう。まあ、そんなこと
は無いでしょうが。

Lispでプログラムを作るのが一番早く実現できる
と思います。
C++やPHPでも出来るでしょう。

ただ、この手の問題を理解できる人はプログラマ
でも限られます。私の経験上、100人に1人いるか
どうか。この問題を抱えている人でも、実業務を
していない人は、まず理解できません。

一見単純に思えて泥沼化して、何も進まないうちに
予算を食いつぶして泣きつく、が一般的なパターン
です。
    • good
    • 0
この回答へのお礼

やはりエクセルで難しいのですね、
特定の条件の振り分け位に限定しての作業をやってみたいと思います。
回答ありがとうございます

お礼日時:2009/03/13 15:41

とりあえず計算式 (振り分けロジック) が良くわからないのと、どこまで出来て何に困っているのか書いていただかないと、あなたの代わりに仕事することにしかならないと思うのですけど。



例えば、、
「対称」とは何が対称なのか?
12000までの制限とは、何の制限なのか?
左端の3...2...1は何を表してるのか?

この回答への補足

ごもっともでございます。
現場の状態が解らないかぎり答えようがありませんでしたね
現状の問題に特化してご質問させていただくことにします、
左端の321は高さを表しまして
1段目2段目3段目となっております
12000までの制限とは、
縦につなぐ際12000までの制限となっているとゆうことです
1段目最大 3000+3000+3000+3000
対象とは左と右部分で分かれてますので、同じ長さのものを左、右に振り分けるという意味でございました。
なかなか伝わりにくいかとおもいますが、お願いします、
とりあえずしたいことをいいます
まず自動でコピー&ペーストを行うことは可能でしょうか?
A1にある数値を任意の場所に移動
例 A1にある数値をクリック、、そのつぎクリックするセルにその値を
移動(コピーでない)
以上お願いします

補足日時:2009/03/13 15:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!