• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:IF 分岐処理がうまくできません)

エクセルVBAで分岐処理がうまくできない原因とは?

このQ&Aのポイント
  • エクセルVBAで分岐処理がうまくできない場合、条件式の記述や変数の取得方法などが原因として考えられます。クリアすべきポイントをまとめます。
  • A、B、Cのリンゴとみかんの仕入れパターンの適正値算出がうまく行かない場合、条件式の組み合わせや変数の取得方法を再確認する必要があります。
  • エクセルVBAでの分岐処理において、条件式の演算子や優先順位に注意する必要があります。また、変数の値の取得方法が正しくない場合も分岐処理がうまく行かない原因となります。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.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) と記入し、右にコピー、下にコピーしても出来ます。

bike5050
質問者

お礼

早々の回答、掲示の方法など指導いただき本当にありがとうございます。

その他の回答 (2)

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! ↓の画像のようになれば良いのでしょうか? もしそうであれば一例です。 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

bike5050
質問者

お礼

早々の回答、優先順位の変更点など指導いただき本当にありがとうございます。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

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を使えばもっと綺麗に書けます

bike5050
質問者

お礼

お礼が遅くなり、申し訳ないです。 完成はしていないですが、とても助かりました。 ありがとうございます。

関連するQ&A