• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAの繰り返し処理?の方法)

VBAの繰り返し処理?の方法

このQ&Aのポイント
  • VBAを使用して繰り返し処理を行う方法について教えてください。
  • 具体的には、ある条件に基づいて発注数を計算する方法について知りたいです。
  • また、注文数は発注単位の倍数とすることが条件となります。

質問者が選んだベストアンサー

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.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

VBAbeginner
質問者

お礼

早速のご回答ありがとうございました。 エクセルも詳しくなく、CEILING関数も言われればそうかと思い出す感じです。 関数の方法で試してみます。

その他の回答 (1)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

こんな感じかな。 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マクロは元々プログラミング言語ではなく、セルの計算式では難しいような処理を力技でがりがりする用途で生まれてきた事を考えると前者のように極めて単純なアルゴリズムでがりがり計算させる方が後で見て分かりやすいかも知れないね。

VBAbeginner
質問者

お礼

早速のご回答ありがとうございました。 まだまだ勉強不足ですが、頑張ってみます!

関連するQ&A

専門家に質問してみよう