• 締切済み

excelでの組み合わせマクロについて

現在マクロで作成しようとしているのが、材木の本数を割り出すマクロです。 例 1mが3本 2mが1本 2.5mが4本 の場合4mの木材を何本注文すれば一番効率が良いかというものです。 ※1m、2m、2.5mは変更可能なこと  すでに1m、2m、2.5mは余分に見てあるので最小本数でよいこと このような条件でマクロを組むとしたらどのようなマクロになりますか? いままでマクロを組んだのですがこのような複雑なのは組んだのがないので検討もつきません。 よろしくお願いします。

みんなの回答

noname#52504
noname#52504
回答No.2

1.  >>マルチポストは違反行為です!<< 他のサイトで同じ質問をされるのなら、こちらの質問は締切るのがマナーです。 2. ご質問の内容はVBAのコーディング技術以前の問題のように思われます。 数学カテ等で、 「プログラミング可能な程度に簡潔なアルゴリズムが存在するか」 質問された方が良いかと思います。 コーディングを考えるのは仕様要件アルゴリズムが確定してからです。 3. 「長いものから順に取っていく」という素朴なアルゴリズムでも良ければ、 下記のようなコードで一応の数字は出ます。 あからさまなやっつけですが悪しからず。 (他所で解決してれば無駄になりますので) ********************************************************************************* ●アクティブシート左上隅に、長さと本数の見出し行付き表があり、“長い順に”並んでいるとします。 (並べ替えるのが手間でしたら、並べ替え処理をコードに書き足して下さい。) A  B 長さ 本数 2.5  4 2.0  1 1.0  3 ●D1セルに木材の長さ(質問文では4)が入力されているものとします。 ●結果はE1セルに吐きます。 Sub さんぷる() Dim 製材でーた As Variant Dim 木材の長さ As Long Dim 結果でーた() As Long Dim i As Integer '製材長さカウンタ Dim j As Integer '製材本数カウンタ Dim k As Integer '木材カウンタ Dim f As Boolean '木材追加フラグ 製材でーた = ActiveSheet.Range("A1").CurrentRegion.Value 木材の長さ = ActiveSheet.Range("D1").Value * 1000 ReDim 結果でーた(1 To 1) 結果でーた(1) = 木材の長さ For i = 2 To UBound(製材でーた, 1)  製材でーた(i, 1) = 製材でーた(i, 1) * 1000 Next i For i = 2 To UBound(製材でーた, 1)  For j = 1 To 製材でーた(i, 2)   f = True   For k = 1 To UBound(結果でーた)    If 製材でーた(i, 1) > 木材の長さ Then     MsgBox 木材の長さ / 1000 & "mの木材から" & 製材でーた(i, 1) / 1000 & "mの木材を切り出すのは無理だと思う"     Exit Sub    End If    If 製材でーた(i, 1) <= 結果でーた(k) Then     結果でーた(k) = 結果でーた(k) - 製材でーた(i, 1)     f = False     Exit For    End If   Next k   If f Then    ReDim Preserve 結果でーた(1 To UBound(結果でーた) + 1)    結果でーた(UBound(結果でーた)) = 木材の長さ - 製材でーた(i, 1)   End If  Next j Next i ActiveSheet.Range("E1").Value = UBound(結果でーた) End Sub (Excel2003で動作確認) ********************************************************************************* ※注意※ ★日本語変数その他バカっぽい書き方は仕様です(ぉ ★ミリ単位で計算しているのは演算誤差を回避するためです。 ★4mの木材から、2.4m×1本,1.4m×1本,1.0m×1本,0.8m×4本をとるとき、  最適解は【2.4m+0.8m+0.8m】,【1.4m+1.0m+0.8m+0.8m】で2本ですが、  このアルゴリズムでは【2.4m+1.4m】を先に取ってしまうので、  【2.4m+1.4m】,【1.0m+0.8m+0.8m+0.8m】,【0.8m】となり3本を返します。  もっとも、最適解をもとに最小限の材料を仕入れた場合、切り方を一つ間違えるとアウトですから、  実用上どちらが良いかはまた別の問題になります。

回答No.1

excelのマクロの質問はmougで聞いたほうが いいですよ。あちらには、スペシャリストが たくさんいらっしゃいますので。 http://www2.moug.net/bbs/exvba/thread000001.htm で、同じような質問がありました。 http://www2.moug.net/bbs/exvba/20070609000017.htm (理解できないのなら、やらない方がいいです。)

関連するQ&A

専門家に質問してみよう