- ベストアンサー
エクセルVBAで分岐処理がうまくできない原因とは?
- エクセルVBAで分岐処理がうまくできない場合、条件式の記述や変数の取得方法などが原因として考えられます。クリアすべきポイントをまとめます。
- A、B、Cのリンゴとみかんの仕入れパターンの適正値算出がうまく行かない場合、条件式の組み合わせや変数の取得方法を再確認する必要があります。
- エクセルVBAでの分岐処理において、条件式の演算子や優先順位に注意する必要があります。また、変数の値の取得方法が正しくない場合も分岐処理がうまく行かない原因となります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 ご相談では、間違った結果を掲示しても意味がありません。「ホントはこういう結果になって欲しい姿」をキチンと情報提供してみるといいですよ。 ご相談に書かれているCの結果も、いくつか適正じゃないハズです。 標準モジュールに登録: sub macro1() dim r as long for r = 2 to range("A65536").end(xlup).row cells(r, "D") = 仕入(cells(r, "A"), cells(r, "B")) cells(r, "E") = 仕入(cells(r, "A"), cells(r, "C")) next r end sub public function 仕入(id, 個数) dim a,b select case id case "A" a = 500 b = 1000 case "B" a = 400 b = 2000 case "C" a = 300 b = 3000 case else exit function end select 仕入 = iif(個数<=a, b - 個数, 0) end function マクロ1を実行します。 #参考 セルD2に =仕入($A2,B2) と記入し、右にコピー、下にコピーしても出来ます。
その他の回答 (2)
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! ↓の画像のようになれば良いのでしょうか? もしそうであれば一例です。 IFの優先順位を「C」→「A」の順にしてみてはどうでしょうか? コードにすると Sub test() Dim i As Long For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row Select Case Cells(i, 1) Case "C" If Cells(i, 2) <= 300 Then Cells(i, 4) = 3000 - Cells(i, 2) End If If Cells(i, 3) <= 300 Then Cells(i, 5) = 3000 - Cells(i, 3) End If Case "B" If Cells(i, 2) <= 400 Then Cells(i, 4) = 2000 - Cells(i, 2) End If If Cells(i, 3) <= 400 Then Cells(i, 5) = 2000 - Cells(i, 3) End If Case "A" If Cells(i, 2) <= 500 Then Cells(i, 4) = 1000 - Cells(i, 2) End If If Cells(i, 3) <= 500 Then Cells(i, 5) = 1000 - Cells(i, 3) End If End Select Next i End Sub こんな感じではどうでしょうか? 的外れならごめんなさいね。m(_ _)m
お礼
早々の回答、優先順位の変更点など指導いただき本当にありがとうございます。
- kmee
- ベストアンサー率55% (1857/3366)
Andとorには優先順位があります。 Cells(i, 1) = "C" And Cells(i, 2) <= 300 Or Cells(i, 3) <= 300 は ( (Cells(i, 1) = "C") And (Cells(i, 2) <= 300) ) Or( Cells(i, 3) <= 300 ) の意味です 「Cells(i, 1) = "C" かつ Cells(i, 2) <= 300」 または 「Cells(i, 3) <= 300」※ Cell(i,1)に関係無く です 括弧でまとめましょう。 なんですが、3回ループするのって無駄ですよね? IfとElseifで i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "A" Then 'Aの処理 ElseIf Cells(i, 1) = "B" Then 'Bの処理 ElseIf Cells(i, 1) = "C" Then 'Cの処理 End if i=i+1 Loop とやれば、1回でいいです。 Cells(i,1)=A,B,Cが同時に成立つことは無いのですから。 If ~ ElseIfではなく、Select Caseを使えばもっと綺麗に書けます
お礼
お礼が遅くなり、申し訳ないです。 完成はしていないですが、とても助かりました。 ありがとうございます。
お礼
早々の回答、掲示の方法など指導いただき本当にありがとうございます。