エクセルVBAで分岐がうまくできません

このQ&Aのポイント
  • エクセルVBAでA,B,Cの仕入れパターンに基づいて適正な仕入量を算出する方法を教えてください。
  • エクセルVBAのコードで、A,B,Cのりんごとみかんの仕入れパターンに基づいて適正な仕入量を算出したいですが、正しい値が算出されません。
  • エクセルVBAでA,B,Cの仕入れパターンに基づいて適正な仕入量を算出するためのコードを教えてください。
回答を見る
  • ベストアンサー

エクセルVBAで、分岐がうまくできません。

A,B,,Cのりんごとみかんの3種類の仕入れパターンがあり仕入の数量を算出したいですが、適正値が算出されません。 どのようにしたら、適正値を算出できるにのか教えてください。 Sub test() Dim i As Integer 'A リンゴは、500以下になったら1000個になるように仕入 '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個になるように仕入 'A みかんまたはりんごの片方が400以下になったらみかんとりんごを2000個になるように仕入 i = 2 'Do While Worksheets("sheet1").Cells(i, 1) <> "" ElseIf 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個になるように仕入 'A みかんまたはりんごの片方が300以下になったらみかんとりんごを3000個になるように仕入 i = 2 'Do While Worksheets("sheet1").Cells(i, 1) <> "" ElseIf 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

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

  • ベストアンサー
回答No.3

こんにちは。 #7748670の質問は適当に締めたほうがよいかもしれませんね。 前回の質問との違いということで、見比べてみると、 >みかんまたはりんごの片方が500以下になったらみかんとりんごを1000個になるように仕入 という項目で、マクロの内容をみて、「みかんとりんごを、それぞれ1000 個……」というように解釈しました。もちろん、ワークシートの数式でできますし、その方がよいかもしれません。マクロでは、通常では「戻し」が利きません。 '// Sub PurchasePlanning()  Dim i As Long  Dim n As String  With Worksheets("Sheet1")   '2 は、データ行の始まり   Application.ScreenUpdating = False   For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row    n = .Cells(i, 1).Value    If n <> "" Then     Select Case n      Case "A"       'A リンゴは、500以下になったら1000個       'A みかんは、500以下になったら1000個       ' みかんまたはりんごの片方が500以下になったらみかんとりんごを1000個       If .Cells(i, 2).Value < 501 Or .Cells(i, 3).Value < 501 Then        .Cells(i, 4).Value = 1000 - .Cells(i, 2).Value        .Cells(i, 5).Value = 1000 - .Cells(i, 3).Value       End If      Case "B"       'B リンゴは、400以下になったら2000個       'B みかんは、400以下になったら2000個       ' みかんまたはりんごの片方が400以下になったらみかんとりんごを2000個       If .Cells(i, 2).Value < 401 Or .Cells(i, 3).Value < 401 Then        .Cells(i, 4).Value = 2000 - .Cells(i, 2).Value        .Cells(i, 5).Value = 2000 - .Cells(i, 3).Value       End If      Case "C"       'C リンゴは、300以下になったら3000個       'C みかんは、300以下になったら3000個       If .Cells(i, 2).Value < 301 Or .Cells(i, 3).Value < 301 Then        .Cells(i, 4).Value = 3000 - .Cells(i, 2).Value        .Cells(i, 5).Value = 3000 - .Cells(i, 3).Value       End If     End Select    End If   Next i   Application.ScreenUpdating = True  End With End Sub

bike5050
質問者

お礼

大変助かりました。 VBA・数式のどちらを使うかの切り分けもまだできませんが、参考にさせてもらいます。 ありがとうございました。

その他の回答 (2)

  • jacob-wk9
  • ベストアンサー率36% (85/231)
回答No.2

プログラムの問題でしたら、Loopネスティングの中にi=2が2箇所出て来ていますので、これを外す必要があります。 セルB8のりんごの在庫はまだ、発注点に達していませんので、リンゴ仕入れのところはゼロにしなければいけません。 Cells(i, 2) > 400ならば発注数0 Cells(i, 3) > 400ならば発注数0を代入する必要があります。 ところで、この程度であれば、VBAで処理するまでもなく、式で表現できます。 マクロ付きEXCELファイルを配布し、受け取るときにセキュリティ警告が出る事から、配布の予定があれば なるべくVBAを使うのは最後の手段としたほうが良いように思います。

bike5050
質問者

お礼

参考になりました。 ありがとうございます。

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

変数iが「A・B」の条件に一致した場合、常に初期値の「2」に戻されているのが原因ではないでしょうか。 又、Cellsプロパティでシートオブジェクトを省略、指定しているコードが紛らわしいので揃えませんか。

bike5050
質問者

お礼

記述についての指摘は、注意していこう思います。 ありがとうございました。

関連するQ&A

  • IF 分岐処理がうまくできません

    エクセル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  りんご みかん りんご仕入 みかん仕入 A 500 700   500 300 A 400 600 600 400 A 300 500 700 500 A 300 400 1700 1600 A 200 300 2800 2700 A 100 200 2900 2800 B 500 400 1500 1600 B 400 600 1600 1400 B 340 500 1660 1500 B 260 400 1740 1600 B 180 300 2820 2700 B 100 200 2900 2800 C 200 700 2800 2300 C 500 200 2500 2800 C 300 500 2700 2500 C 200 400 2800 2600 C 100 300 2900 2700 C 100 200 2900 2800 Cは、適正値ですが、A,Bの1部の計算ができません。

  • VBAで空欄にデータに表示

    エクセルVBAのIFを使って、シートaのA列に値があって、B列が空欄の場合のみ、空欄のセルにシートbの値を表示させたいです。 上手くできませんでしたので、教えてください。 Sub Do文2() Dim i As Integer i = 1 If Worksheets("a").Cells(i, 2) = "" Then Do While Worksheets("a").Cells(i, 1) <> "" Worksheets("a").Cells(i, 2) = Worksheets("b").Cells(1, 1) i = i + 1 Loop End If End Sub

  • 複数選択可能なリストボックス

    Excel VBAの質問をさせてください。 シート(sheet1)のA列、セルA1から以下のデータがあるとします。 みかん りんご バナナ 苺 梨 バナナ バナナ みかん フォームのリストボックスで"みかん"と"バナナ"を選択した際、シート(sheet2)のセルA1にコピーしていきたいのですが機能しません。 単品、"みかん"だけを選択しても何もコピーされません。 どこがいけないでしょうか?? Private Sub UserForm_Initialize()   With ListBox1     .AddItem "みかん"     .AddItem "りんご"     .AddItem "バナナ"     .AddItem "苺"     .AddItem "梨" .MultiSelect = fmMultiSelectMulti   End With End Sub Private Sub CommandButton1_Click() Dim i As Long For i = 1 To 8 If Worksheets("Sheet1").Cells(i, "A").Value = Me.ListBox1.Value Then Worksheets("Sheet1").Cells(i, "A").Copy Worksheets("Sheet2").Cells(i, "A") End If End Sub

  • VBA エクセル 合計

    皆様、こんにちは。 それぞれの値が入っている会計シート(シートの形式は同じ)を一つの合計シートに合計しようとしていますが、うまくいきません。具体的に、数値の合計ができません。 例えば、ある項目に対して、シートAに100が入力され、シートBには230が入力されているとすれば、合計シートに100+230=330を入力したいです。なお、全ての会計シートは"Form"というエクセルシートにあり、その数をユーザが決めますので、検索しなければいけません。そして、合計シートは"Result"にあります。 以下のように書いてみましたが、間違っているようです。 Worksheets("Result").Activate Dim SR As Integer Dim SC As Integer 'SR is start row 'SC is start column SR = 6 SC = 2 Worksheets("Form").Activate Dim i As Integer i = 68 Do While 1 = 1 If Selection.Cells(i, 4).Value = "" Then Exit Do End If i = i + 49 Loop Sum = 0 Sum = Sum + Selection.Cells(i, 4) Worksheets("Result").Activate Cells(SR + 5, SC + 2) = Sum 詳しい方に教えていただければ非常に助かります。 どうぞよろしくお願いします。

  • VBA リストボックスについて

    VBA初心者です。どうぞよろしくお願いします。 ユーザーフォームにタブつきのリストボックスを作りたいと思っています。 リストはsheet1の中にあります。   A    B    C    D・・・ 1  NO  品名  売場 2  1  いちご  果物 3  2  みかん  果物 4  3  もも    果物 5  4  ハクサイ 野菜 6  5  キャベツ  野菜 7  6  きゅうり  野菜 8  7 9 果物のタブには、果物の品名が表示される。 1 いちご 2 みかん 3 もも 野菜のタブには、野菜の品名が表示される。 4 ハクサイ 5 キャベツ 6 きゅうり 青果のタブには、果物、野菜が表示される。 1 いちご 2 みかん 3 もも 4 ハクサイ 5 キャベツ 6 きゅうり 本を見ながら格闘しておりますが、きっと的違いで滅茶苦茶なことをしているのだと思います。 どうにも出来ず困っております。どなたか教えていただけないでしょうか。よろしくお願いします。 Private Sub UserForm_Initialize() Dim LastRow As Long Dim i As Integer Dim ListBoxNo As Integer Dim ListBox As Control Dim Listtabu(3) As Long 'タブの数 For i = 1 To 3 Listtabu(i) = 0 Next i Worksheets("sheet1").Activate With Worksheets("sheet1") LastRow = .Range("A65536").End(xlUp).Row For i = 2 To LastRow If Worksheets("sheet1").Range(Cells(i, 3)) = "果物" Then ListBoxNo = 1 Set ListBox = 果物 果物.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value End If If Worksheets("sheet1").Range(Cells(i, 3)) = "野菜" Then ListBoxNo = 2 Set ListBox = 野菜 野菜.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value End If If Worksheets("sheet1").Range(Cells(i, 3)) = "果物" & "野菜" Then ListBoxNo = 3 Set ListBox = 青果 青果.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value End If ListBox.AddItem ListBox.List(Listtabu(LstBxNo), 0) = Worksheets("sheet1").Cells(i, 1).Value ListBox.List(Listtabu(LstBxNo), 1) = Worksheets("sheet1").Cells(i, 2).Value Listtabu(LstBxNo) = Listtabu(LstBxNo) + 1 Next End With End Sub

  • vba ;制御

    下記でhakkenn = 1 '******** のところから次は next iの直前にいくようにプログラムをランさせるにはどう記述すればよいか。 よろしくお願いします。 For i = 3 To d hakken = 0 For ui = CELL_S To (CELL_E - CELL_S + 1) If Worksheets("sheet2").Cells(i, "D") = Worksheets("user").Cells(ui, "A") Then Worksheets("user").Cells(ui, ichi) = "◎" hakkenn = 1 '******** Else End If Next ui If hakkenn = 1 Then Else Worksheets("user2").Cells(ui, "D") = Worksheets("sheet2").Cells(i, "D") End If Next i

  • IF・DoなどVBAについて

    部品の在庫に対する発注数を算出するプログラムを下記の条件で作成中です。 ご指導願います。 A・B・Cの3種類の機械があり、それぞれ2種類の部品を持っています。 A・B・Cの3種類の機械があり、それぞれ指定した残量になると発注数を算出する。 1.Aの限界在庫 box1:50000 box2:5000 2.Bの限界在庫 box1:40000 box2:4000 3.Cの限界在庫 box1:30000 box2:3000 4Aの発注基準値 box1:30000 box2:3000 5.Bの発注基準値 box1:20000 box2:2000 6.Cの発注基準値 box1:10000 box2:1000 7.発注基準値の切り捨て  1の単位までありますので下記の単位で切り捨てます。 box1:10の単位で切り捨て box2:10の単位で切り捨て 8.A列にA・B・Cの機械の識別IDがランダムにあります。 9.B列にbox1の在庫があります。 8.C列にbox2の在庫があります。 8.D列にbox1の在発注数を表示します。。 8.E列にbox1の在発注数を表示します。 Sub 計算1() Dim i As Integer Dim Abox1, Abox2, Bbox1, Bbox2, Cbox1, Cbox2 As Long Dim Aboxh1, Aboxh2, Bboxh1, Bboxh2, Cboxh1, Cboxh2 As Long Abox1 = 50000 'Abox1容量 Abox2 = 5000 'Abox2容量 Bbox1 = 40000 'Bbox1容量 Bbox2 = 4000 'Bbox2容量 Cbox1 = 30000 'Cbox1容量 Cbox2 = 3000 'Cbox2容量 Aboxhk1 = 30000 'Abox1発注基準値 Aboxhk2 = 2000 'Abox2発注基準値 Bboxhk1 = 20000 'Bbox1発注基準値 Bboxhk2 = 2000 'Bbox2発注基準値 cboxhk1 = 10000 'Cbox1発注基準値 cboxhk2 = 1000 'Cbox2発注基準値 Aboxhs1 = 30000 'Abox1発注数 Aboxhs2 = 2000 'Abox2発個数 Bboxhs1 = 20000 'Bbox1発個数 Bboxhs2 = 2000 'Bbox2発個数 cboxhs1 = 10000 'Cbox1発注数 cboxhs2 = 1000 'Cbox2発注数 i = 2 Aboxhs1 = Abox1 - Cells(i, 2) Aboxhs2 = Abox2 - Cells(i, 3) Bboxhs1 = Bbox1 - Cells(i, 2) Bboxhs2 = Bbox2 - Cells(i, 3) cboxhs1 = Cbox1 - Cells(i, 2) cboxhs2 = Cbox2 - Cells(i, 3) Do While Worksheets("sheet1").Cells(i, 1) = "A" If Cells(i, 2) < Aboxhk1 Or Cells(i, 3) < Aboxhk2 Then Worksheets("sheet1").Cells(i, 4) = Application.WorksheetFunction.RoundDown(Aboxhs1, -3) Worksheets("sheet1").Cells(i, 5) = Application.WorksheetFunction.RoundDown(Aboxhs2, -2) End If i = i + 1 Loop Do While Worksheets("sheet1").Cells(i, 1) = "B" If Cells(i, 2) < Bboxhk1 Or Cells(i, 3) < Bboxhk2 Then Worksheets("sheet1").Cells(i, 4) = Application.WorksheetFunction.RoundDown(Bboxhs1, -3) Worksheets("sheet1").Cells(i, 5) = Application.WorksheetFunction.RoundDown(Bboxhs2, -2) End If i = i + 1 Loop Do While Worksheets("sheet1").Cells(i, 1) = "C" If Cells(i, 2) < cboxhk1 Or Cells(i, 3) < cboxhk2 Then Worksheets("sheet1").Cells(i, 4) = Application.WorksheetFunction.RoundDown(cboxhs1, -3) Worksheets("sheet1").Cells(i, 5) = Application.WorksheetFunction.RoundDown(cboxhs2, -2) End If i = i + 1 Loop End Sub

  • 簡単なVBA

    エクセルで特定の列データを削除したいのですが シンプルな形を教えてください ちなみに今は以下のようなVBAを使っています。 Sub 特定の列を削除する() For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1 If Cells(1, i) = "りんご" Then Columns(i).Delete End If Next i For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1 If Cells(1, i) = "みかん" Then Columns(i).Delete End If Next i For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1 If Cells(1, i) = "ばなな" Then Columns(i).Delete End If Next i End Sub

  • Excel VBA; 複数のループ処理

    ↓のようなコードがあります。 Dim i As Long, MaxRow1 As Long, MaxRow2 As Long MaxRow1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MaxRow2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow1 Worksheets("Sheet1").Cells(i, 1).Value = i . Next i For i = 1 To MaxRow2 Worksheets("Sheet2").Cells(i, 1).Value = i . Next i これらを最大行の多いシートに合わせて、パフォーマンスを良くしたいと思います。 同様の処理をシート1、シート2で実施しているので纏めて記述したいです。 シート1、シート2に対する処理をサブルーチンにする方法しかありませんか? どなたかお願いします。 If MaxRow1 >= MaxRow2 Then For i = 1 To MaxRow1 Else For i = 1 To MaxRow2 End If Worksheets("Sheet1").Cells(i, 1).Value = i Worksheets("Sheet2").Cells(i, 1).Value = i . Next i

  • マクロ 条件分岐の仕方

    いつも回答ありがとうございます。 条件分岐について質問です。 文字に『N 』含まれている時の条件処理と、『N』が含まれていない時の条件処理を記述記述しました。一応、この記述で上手く動作しているので問題ないのですが、他に記述方法はないのでしょうか?宜しくお願い致します。 Sub 色を塗る2() Dim b As Long '仮シートの列 Dim res As Variant '色の設定 Dim c As Variant '最後に定期をした日付のセル番地 Worksheets("仮シート").Activate b = 2 Do While Worksheets("仮シート").Cells(2, b).Value <> "" With Worksheets(Worksheets("仮シート").Cells(2, b).Value) Set c = .Columns("C").Find("定期", , xlValues, 1, , 2).Offset(, -1) If Worksheets("仮シート").Cells(2, b).Value Like "*N*" Then If (Date - 30) <= c And c <= Date Then res = 8 ElseIf (Date - 60) <= c And c <= (Date - 31) Then res = 10 ElseIf c <= (Date - 61) Then res = 3 End If End If If Worksheets("仮シート").Cells(2, b).Value Like "*N*" = False Then If (Date - 10) <= c And c <= Date Then res = 8 ElseIf (Date - 30) <= c And c <= (Date - 11) Then res = 10 ElseIf c <= (Date - 31) Then res = 3 End If End If Worksheets("仮シート").Cells(3, b).Interior.ColorIndex = res End With b = b + 1 Loop End Sub

専門家に質問してみよう