プロが教えるわが家の防犯対策術!

独学でエクセルVBAの初心者です。


定尺の鋼材から一定の長さのものが何本切り出せるかを調べるプログラムを作りたいです。

ネットで調べたところカッティングストック問題というものすごい難しいサイトに当たりましたが、

そのような難しいものではなく単純に同じ長さのものを切っていき、必要本数が取れたら次の長さを

切っていくというものを作りたいと思います(最終的に定尺何本必要か知りたい)。

まだまだ始めたばかりなのですが、do while文でorを使ったのですが反映されません。

なぜなのでしょうか? iが3になった時点で引くのを止めたいのですが止まりません教えてください。

Sub Test()

Worksheets("Sheet1").Cells(1, 2).Value = 5500

Worksheets("Sheet1").Cells(2, 2).Value = 1000

Worksheets("Sheet1").Cells(3, 2).Value = Range("B1").Value

Dim i

i = 0

Do While Range("B3").Value > Range("B2").Value Or Range("B4").Value = 3

i = i + 1                           ↑この部分

Range("B3").Value = Range("B3").Value - Range("B2").Value

Loop

Worksheets("Sheet1").Cells(3, 2).Value = Range("B3").Value

Worksheets("Sheet1").Cells(4, 2).Value = i

End Sub

A 回答 (3件)

Do While Range("B3").Value > Range("B2").Value Or Range("B4").Value = 3


の部分を日本語にすると
B3の値がB2の値より大きい 或いは B4の値が 3 の間は繰り返して処理を行う
という事ですが、これがご希望ではないですよね。
B3の値がB2の値より大きく かつ iの値が 3 より小さい時だけ繰り返して処理を行う
Do While Range("B3").Value > Range("B2").Value And i < 3
ではないでしょうか。

複数の条件を1行のコードにまとめるのは、なかなか頭の整理がつきにくいものです。
Do While Range("B3").Value > Range("B2").Value
If i = 3 Then Exit Do
といったように、条件を一つにして、その下に
繰り返しを抜ける処理を IF文で追加する方法もあります。
これが意外と後から見直しても、ほかの人が見ても結構わかりやすい書き方だと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

If i = 3 Then Exit Doをつけたら抜けることができました。ありがとうございます。

いろんなサイト見てみても解決できずに完全に行き詰まっていたのに一発で解決頂きありがとうございます。

目から鱗です。

ありがとうございました。

お礼日時:2012/01/01 00:27

3本以上取れる場合は、


3本で処理をやめたいのですね?


判定条件の基礎となっている、B4セルの値ですが

Worksheets("Sheet1").Cells(4, 2).Value = i

の段階で初めてB4に値が入力されます。

この行はループの後ろにありますので、
いつまでもB4が空白のままでかわらず、
3にならないため判定条件にかかりません。


ちなみに、エラーの原因を突き止める場合は、
VBEのステップイン機能などを使って、
一行ずつ状態を目で追っていくといいですよ。
また、同じくVBEに「ローカルウインドウ」を表示させると、
実行中の変数の値の変化も目で確認できます。

サンプルを書いておきます。
-------------
Sub sample()

Const zencho As Long = 5500 '全長
Const ippon As Long = 500 '1本の長さ
Dim nokori As Long '残りの長さ

Const iMAX As Integer = 3 '指定本数
Dim i As Integer

'初期設定
nokori = zencho


'切り出し作業
For i = 1 To iMAX 'i = 3になるまでループ
If nokori >= ippon Then
nokori = nokori - ippon '引き算して続行
Else
Exit For '残りが1本分に満たない場合は引き算しないでループ終了
End If
Next i

'結果発表(ループ終了時、iが切り出した数より1多くなるため1を引く)
MsgBox i - 1 & "本" & Chr(13) & nokori & "残り"

End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

コードまで書いていただきありがとうございます。

今はまだ全部は理解できませんが、貼り付けて実行したところ私のやりたかった通りになりました。

これから勉強して理解に努めたいと思います。ありがとうございました。

お礼日時:2012/01/01 00:13

> iが3になった時点で引くのを止めたいのですが止まりません教えてください。



というのであれば,判定条件でiを使わなければ話になりません。
ところが,
Range("B3").Value > Range("B2").Value
または
Range("B4").Value = 3
を条件にしていて,iはどこにも出てきません。どうして?

この回答への補足

ご回答ありがとうございます。

すいません。最初iだったんですがいろいろ触って変わってしまいました。

最初のコードはこれです。

Sub Test()

Worksheets("Sheet1").Cells(1, 2).Value = 5500

Worksheets("Sheet1").Cells(2, 2).Value = 1000

Worksheets("Sheet1").Cells(3, 2).Value = Range("B1").Value

Dim i

i = 0

Do While Range("B3").Value > Range("B2").Value Or i = 3

i = i + 1                       ↑ここです

Range("B3").Value = Range("B3").Value - Range("B2").Value

Loop

Worksheets("Sheet1").Cells(3, 2).Value = Range("B3").Value

Worksheets("Sheet1").Cells(4, 2).Value = i

End Sub

ご指摘された所ようにセルを指定してもダメ、括弧でかこってもダメ、もしかして++かな?とやってもダメ
でした。考え付くことはやってみましたがダメでした。どうかよろしくご教授ください。

補足日時:2011/12/31 23:59
    • good
    • 0

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