- ベストアンサー
VBAの繰り返し処理?の方法
- VBAを使用して繰り返し処理を行う方法について教えてください。
- 具体的には、ある条件に基づいて発注数を計算する方法について知りたいです。
- また、注文数は発注単位の倍数とすることが条件となります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問の意図がよく分からないのですが、この条件なら算式で直接計算できます。 セルD2: =MAX(CEILING(F2-(B2-C2),A2),0) モジュールを書くとcalcCyumon1のようになりますが、わざわざ分かりにくくしたようです。ユーザー定義関数にするのも何か間が抜けた感じです。(関数で計算できるので) シートのコードウィンドウに貼り付けています。 '// 直接計算 Sub calcCyumon1() Dim rw As Long '行カウンタ rw = 1 With Range("A1") While .Offset(rw, 0) <> "" .Offset(rw, 3) = Application.Max(Application.Ceiling( _ .Offset(rw, 5) - (.Offset(rw, 1) - .Offset(rw, 2)), _ .Offset(rw, 0)), 0) rw = rw + 1 Wend End With End Sub 発注単位を条件を満たすまで追加するなら下のようになります。 マクロは実行する必要があるわけで、作り方によっては1件の再計算のために全件計算することになることもあります。この事例の場合は関数が便利に思えます。VBAの勉強のための事例ならまた別の話ですね。 '// 発注単位を追加 Sub calcCyumon2() Dim rw As Long '行カウンタ Dim Zaiko As Double '在庫 Dim Cyumon As Double '注文数 rw = 1 With Range("A1") While .Offset(rw, 0) <> "" Cyumon = 0 Zaiko = .Offset(rw, 1) - .Offset(rw, 2) While Zaiko < .Offset(rw, 5) '安全在庫未満 Cyumon = Cyumon + .Offset(rw, 0) Zaiko = Zaiko + .Offset(rw, 0) Wend .Offset(rw, 3) = Cyumon rw = rw + 1 Wend End With End Sub
その他の回答 (1)
- anmochi
- ベストアンサー率65% (1332/2045)
こんな感じかな。 Public Sub KeisanChumonSu() Dim y As Long y = 2 Do While Me.Range("A" & CStr(y)).Value <> "" Me.Range("D" & CStr(y)).Value = 0 Do While Me.Range("E" & CStr(y)).Value < Me.Range("F" & CStr(y)).Value Me.Range("D" & CStr(y)).Value = Me.Range("D" & CStr(y)).Value + Me.Range("A" & CStr(y)).Value Loop y = y + 1 Loop End Sub 各行を読んでもらえれば解説も要らないレベルだと思う。A列が0だと無限ループになるので対策を。 ByRef sht As Excel.Sheetを引数にしてMeをshtに変えれば同じフォーマットの複数シートで汎用的に使えそう。 Do While ~ Loopを使うのは当方の好みなのでWhile ~ WEndでもDo Until ~ Loopでもお好きなものを使ってください。 Excel VBAではセルの値の参照や設定って実は割りとコストが高い処理なのでこのマクロは結構時間がかかると思う。 改良するとしたら以下のような感じか。こちらはA列が0だとエラー停止するので勝手に1にするようにした。 Public Sub KeisanChumonSuSpeedy() Dim y As Long Dim tani As Long Dim chumon As Long Dim amari As Long y = 2 Do While Me.Range("A" & CStr(y)).Value <> "" tani = Me.Range("A" & CStr(y)).Value If tani <= 0 Then tani = 1 End If chumon = Me.Range("F" & CStr(y)).Value - Me.Range("B" & CStr(y)).Value + Me.Range("C" & CStr(y)).Value If chumon < 0 Then chumon = 0 End If amari = chumon Mod tani If amari > 0 Then chumon = chumon + tani End If Me.Range("D" & CStr(y)).Value = chumon - amari y = y + 1 Loop End Sub VBAマクロは元々プログラミング言語ではなく、セルの計算式では難しいような処理を力技でがりがりする用途で生まれてきた事を考えると前者のように極めて単純なアルゴリズムでがりがり計算させる方が後で見て分かりやすいかも知れないね。
お礼
早速のご回答ありがとうございました。 まだまだ勉強不足ですが、頑張ってみます!
お礼
早速のご回答ありがとうございました。 エクセルも詳しくなく、CEILING関数も言われればそうかと思い出す感じです。 関数の方法で試してみます。