
独学でエクセル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
No.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文で追加する方法もあります。
これが意外と後から見直しても、ほかの人が見ても結構わかりやすい書き方だと思います。
回答ありがとうございます。
If i = 3 Then Exit Doをつけたら抜けることができました。ありがとうございます。
いろんなサイト見てみても解決できずに完全に行き詰まっていたのに一発で解決頂きありがとうございます。
目から鱗です。
ありがとうございました。
No.2
- 回答日時:
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
回答ありがとうございます。
コードまで書いていただきありがとうございます。
今はまだ全部は理解できませんが、貼り付けて実行したところ私のやりたかった通りになりました。
これから勉強して理解に努めたいと思います。ありがとうございました。
No.1
- 回答日時:
> 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
ご指摘された所ようにセルを指定してもダメ、括弧でかこってもダメ、もしかして++かな?とやってもダメ
でした。考え付くことはやってみましたがダメでした。どうかよろしくご教授ください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
血液検査報告書の「弱乳び」
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
2つの数値のうち、数値が小さい...
-
血液検査の結果が悪くefgrの値...
-
風俗店へ行く前のご飯
-
病院側から早く来てくださいと...
-
小数点以下を繰り上げたものを...
-
excel関数で TRUEやFALSEについて
-
検査結果について電話連絡って...
-
値が入っているときだけ計算結...
-
勃起する時って痛いんですか? ...
-
テスターで断線を調べる方法教...
-
男性に質問 お尻の穴を見せた...
-
検便を取ったのですが、棒から...
-
Excel条件付書式(残業45時間以...
-
MIN関数で空白セルを無視したい...
-
急いでます!病院から患者様へ...
-
Excel 0目標に対して数字があ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
アトピー性皮膚炎
-
コロナになるのが死ぬほど怖い...
-
検便についてです。 便は取れた...
-
24歳、女性です。性欲が強すぎ...
-
未成年の従姉妹が自分の真似絵...
-
頭痛に関する質問です。現在高...
-
血液検査の結果が悪くefgrの値...
-
肝臓がんになりたいです。肝機...
-
何故 削除され続けるか、
-
◎敢えてノンジャンルカテゴリー...
-
彼女のことが好きすぎて彼女の...
-
腕を見たら黄色くなってる部分...
-
風俗店へ行く前のご飯
-
2つの数値のうち、数値が小さい...
-
病院側から早く来てくださいと...
-
EXCELで条件付き書式で空白セル...
-
Excel 数値の前の「 ' 」を一括...
-
リンク先のファイルを開かなく...
-
値が入っているときだけ計算結...
おすすめ情報