
エクセル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部の計算ができません。
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)
と記入し、右にコピー、下にコピーしても出来ます。

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

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を使えばもっと綺麗に書けます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
microsoft office for mac につ...
-
Microsoft Officeを2台目のPCに...
-
office2019 のoutlookは2025年1...
-
エクセルの式がわかる方がおら...
-
大学のレポート A4で1枚レポー...
-
Microsoft Formsの「個人情報や...
-
outlookのメールが固まってしま...
-
Excelで〇のついたものを抽出し...
-
Excel 日付を比較したら、同じ...
-
Office2021を別のPCにインスト...
-
Microsoft 365 の支払いが反映...
-
ステータスバーの合計に表示さ...
-
VBAの印刷について
-
エクセル:一定間隔で平均値を...
-
会社のOutlookにてメールを予約...
-
Office 2021 Professional Plus...
-
Windows 11で、IME言語バー(IM...
-
web上にあるエクセルをショート...
-
Office2024インストール後の疑問点
-
マイクロソフト オフィスのサポ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA
-
初歩的な質問で申し訳ありませ...
-
AccessVBAから、Excelシート内...
-
vba formulaの中での変数の扱い
-
連続ではない三つのセルの値の...
-
Range("A1")⇔cells(1,1)の変換。
-
VBA sum ワークシートChange
-
【マクロ】実行時エラー '424':...
-
「段」と「行」の違いがよくわ...
-
Excel UserForm の表示位置
-
エクセルで離れた列を選択して...
-
マクロの「SaveAs」でエラーが...
-
エクセル 上下で列幅を変えるには
-
Excel VBAでのWorksheet_Change...
-
Excelで、あるセルの値に応じて...
-
【Excel関数】UNIQUE関数で"0"...
-
VBA シートをコピーする際に Co...
-
Worksheets メソッドは失敗しま...
-
VBAマクロ実行時エラーの修正に...
-
Excel グラフのプロットからデ...
おすすめ情報