重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

エクセルVBAで、分岐がうまくできません。
A、B,Cのリンゴとみかんの3種類の仕入れパターンがあり仕入の数量を算出したいですが、適正値が算出されません。
どのようにしたら、適正値を算出できるにのか教えてください。

Sub 仕入計算()
Dim i As Integer

'A リンゴは、500以下になったら1000個になるように仕入
'A みかんは、500以下になったら1000個になるように仕入
i = 2

Do While Worksheets("sheet1").Cells(i, 1) <> ""
If Cells(i, 1) = "A" And Cells(i, 2) <= 500 Or Cells(i, 3) <= 500 Then
Worksheets("sheet1").Cells(i, 4) = 1000 - Cells(i, 2)
Worksheets("sheet1").Cells(i, 5) = 1000 - Cells(i, 3)

End If
i = i + 1
Loop

'B リンゴは、400以下になったら2000個になるように仕入
'B みかんは、400以下になったら2000個になるように仕入
i = 2
Do While Worksheets("sheet1").Cells(i, 1) <> ""
If Cells(i, 1) = "B" And Cells(i, 2) <= 400 Or Cells(i, 3) <= 400 Then
Worksheets("sheet1").Cells(i, 4) = 2000 - Cells(i, 2)
Worksheets("sheet1").Cells(i, 5) = 2000 - Cells(i, 3)

End If
i = i + 1
Loop

'C リンゴは、300以下になったら3000個になるように仕入
'C みかんは、300以下になったら3000個になるように仕入
i = 2
Do While Worksheets("sheet1").Cells(i, 1) <> ""
If Cells(i, 1) = "C" And Cells(i, 2) <= 300 Or Cells(i, 3) <= 300 Then
Worksheets("sheet1").Cells(i, 4) = 3000 - Cells(i, 2)
Worksheets("sheet1").Cells(i, 5) = 3000 - Cells(i, 3)

End If
i = i + 1
Loop

End Sub

結果は以下になってしまいます。

id  りんごみかん りんご仕入 みかん仕入
A500 700   500 300
A400 600 600 400
A300 500 700 500
A300 400 1700 1600
A200 300 2800 2700
A100 200 2900 2800
B500 400 1500 1600
B400 600 1600 1400
B340 500 1660 1500
B260 400 1740 1600
B180 300 2820 2700
B100 200 2900 2800
C200 700 2800 2300
C500 200 2500 2800
C300 500 2700 2500
C200 400 2800 2600
C100 300 2900 2700
C100 200 2900 2800

Cは、適正値ですが、A,Bの1部の計算ができません。

A 回答 (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)
と記入し、右にコピー、下にコピーしても出来ます。
「IF 分岐処理がうまくできません」の回答画像3
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/10/15 08:57

こんばんは!


↓の画像のようになれば良いのでしょうか?

もしそうであれば一例です。
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
「IF 分岐処理がうまくできません」の回答画像2
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/10/15 09:00

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を使えばもっと綺麗に書けます
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/10/15 22:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!