VBAで部品の発注数を算出するプログラム

このQ&Aのポイント
  • VBAを使って部品の在庫に対する発注数を算出するプログラムを作成中です。
  • 3種類の機械と2種類の部品を持っており、残量に応じて発注数を算出します。
  • 発注基準値を設定し、切り捨て単位で発注基準値を計算します。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

コメントを書く習慣をつけたほうが良いですよ。 Loopでループ終了後、iをリセットしてないので、対象行は延々と下がり続けるように見えます。 '---現 ここから i = i + 1 Loop Do While Worksheets("sheet1").Cells(i, 1) = "B" '---現 ここまで '---新 ここから i = i + 1 Loop ’iをリセットする i = 2 Do While Worksheets("sheet1").Cells(i, 1) = "B" '---新 ここまで

bike5050
質問者

お礼

お礼が遅くなり、申し訳ありません。 ありがとうございまた。 アドバイスを参考に試行錯誤の結果、完成しました。 今後もお願いします。

bike5050
質問者

補足

回答ありがとうございます。 すみませんが、初心者のためよくわかりませんのでもう一度教えてください。 A列には、いくつものABCが不規則に並んでいるために、はじめのAは処理できますが、Bになると処理されません。 勉強不足で、すみませんが、ご指導願います。

関連するQ&A

  • EXCEL VBA VloopUPエラー

    お世話になります。 EXCEL VBAでVlookupを動かそうとしていますが、エラーが出てうまく動きません。 以下やりたいことと、エラーメッセジとなります。 【やりたいこと】 「生販在庫推移表」シートにある日付(Cells(1,j).Value)をキーにして、別シートの「日別商品別集計」(このシートの1列目は日付になっています)のある列(sno)の値を「生販在庫推移表」シートのあるセル(Cells(i,j).Value)に持ってきたいのです。 【エラーになっているロジック】 Worksheets("生販在庫推移表").Cells(i, j).Value = Application.WorksheetFunction.VLookup(Worksheets("生販在庫推移表").Cells(1, j).Value, Worksheets("日別商品別集計").Range("A1:BZ5000"), sno, False) 【エラーメッセージ】 実行時エラー'1004' WorksheetFunction クラスのVLookupプロパテイを取得できません。 どなたか良きアドバイスをご教授いただけますでしょうか。 よろしくお願い致します。

  • 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部の計算ができません。

  • Excel ワークシート関数をVBAで使用したい

    お世話になります。 Excelでワークシート関数をVBAで使用したいのですが、うまくいきませんでした。 関数ですと「ISERROR(FIND(V$10,R$11))=FALSE」のような式をVBA上で使用したいと思い、以下のようにコードを書いてみましたが If Application.WorksheetFunction.IsError(Application.WorksheetFunction.Find(Cells(i, j), Cells(i, 18))) = False Then Cells(i, j).Select End If 「実行時エラー'1004' WorksheetFunction クラスのFindプロパティを取得できません」となります。 入れ子が問題なのでしょうか。 よろしくお願いします。

  • エクセル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

  • VLookupで一致しなかった時のVBAでの処理

    On Error ~を使わないで、 VLookup()で一致しなかった時の処理をさせたいのですが どのように記述すればよいでしょうか。 例えば、以下のようなコードの場合、 一致したデータがない時にyに-1を代入するには 以下のコードをどのように記述すればよいのでしょうか。 --------------------- Dim x As Integer Dim y As String x = 7 y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) --------------------- 以下はいずれもエラーになりますが、以下のような感じで処理がしたいです。 --------------------- If IsError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False)) Then  y = -1 Else  y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) End If --------------------- y = Application.WorksheetFunction.IfError(Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False), -1) --------------------- なお、以下のように本来エラーではない処理で On Error Resume Nextを使うのは、 本当のエラーの処理と混同するため不可 --------------------- On Error Resume Next y = Application.WorksheetFunction.VLookup(x, Worksheets("Sheet1").Range("A1:B100"), 2, False) If Err <> 0 Then y = -1 On Error GoTo 0 ---------------------

  • 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

  • VBAの処理が遅くて困っています!

    VBAの処理が遅くて困っています! Excel VBAで1つのExcelファイルに3つのシートがあります。 1つ目のシートにデータが入力されています。 2つ目のシートには条件を入力できるようになっています。  例えば車速と記入してあるセルには手入力で30と入力できるようになっています。 3つ目のシートは、1つ目のデータから2つ目の入力値と比較して その条件にあう結果を3つ目のシートに計算結果として反映しています。 それが下記の処理です。 但し、処理が遅すぎて困っています。 下記式が20個ありB列の結果を元にまた次の計算をさせています。 誰か、教えて頂けませんでしょうか? よろしく御願い致します。 Set J1Sheet = Worksheets("条件設定1") Set K1Sheet = Worksheets("計算1") Set DataSheet = Worksheets("データ")  2つ目のシートの入力値を格納しています  TMPCAT = J1Sheet.Cells(11, 4) VSP下限 = J1Sheet.Cells(9, 4) 水温下限 = J1Sheet.Cells(13, 4) ST1_下限Ne = J1Sheet.Cells(17, 4) ST1_上限Ne = J1Sheet.Cells(15, 4) ST1_下限TP = J1Sheet.Cells(21, 4) ST1_上限TP = J1Sheet.Cells(19, 4) ST1_上限QM = J1Sheet.Cells(23, 4) ST1_許可ディレイ = J1Sheet.Cells(35, 4) ST1_診断周期 = J1Sheet.Cells(37, 4) ST1_診断回数 = J1Sheet.Cells(39, 4)   今回はデータ数が14000行ありました  RowEnd = K1Sheet.Range("A65535").End(xlUp).Row Application.ScreenUpdating = False Application.Calculation = xlCalculationManual  Dim i As Long   For i = 3 To RowEnd 'B列の計算:2 strAns = "●" If K1Sheet.Cells(i - 1, 2) <> "●" Then If DataSheet.Cells(i + 1, 10) < TMPCAT Then strAns = "" End If End If K1Sheet.Cells(i, 2) = strAns Next i

  • VBA 初心者

    sheet1から、sheet2データを検索して抽出する練習をしているのですがerror"1104"が表示されます、なぜなのか分からないので投稿しました、よろしくお願いします。 sub test() dim sh1 as worksheets dim sh2 as worksheets dim  i  as  integer set sh1 = thisworkbook.worksheets("sheet1!") set sh2 = thisworkbook.worksheets("sheet2!") b = userform1.textbox1 for i = 1 to 10 sh1 .cells(i,2) = b b = b+1 x = sh1.cells(1,2) sh1.cells(i,3).value = worksheetfunction.vlookup(x,sh2.range("a1:d500"),2,false) next i end sub

  • vbaの速度向上(sumif関数)

    エクセルvbaの速度を向上できないか、お知恵を貸していただきたく存じます。 以下のvba(sumif関数)をもっと速めたいです。何とかできないでしょうか。長い記載となり申し訳ないのですが、何卒よろしくお願い申し上げます。 myCnt7 = 2 Do Worksheets("●").Cells(myCnt7, 4).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 3), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 3), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 7).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 6), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 6), Worksheets("★").Range("C:C")) Worksheets("●").Cells(myCnt7, 10).Value = WorksheetFunction.SumIf(Worksheets("◆").Range("B:R"), Worksheets("●").Cells(myCnt7, 9), Worksheets("◆").Range("R:R")) - WorksheetFunction.SumIf(Worksheets("★").Range("B:C"), Worksheets("●").Cells(myCnt7, 9), Worksheets("★").Range("C:C")) Loop While myCnt7 > 201 ※シート●のC列から3列ごとに、Sumifの検索条件があります。 ※シート●のD列から4列ごとに、Sumifの計算結果を出力させます。 ※計算対象シートは、シート◆とシート★の2つです。  シート◆のSumif合計から、シート★のSumif合計を差し引いています。  Sumifの条件自体は、どちらのシートも同じ(シート●)。 ※上記のSumif関数の記述は、3つですが、実際の記述は24あります。 ※すなわち、検索条件の組み合わせが24あり、201行分をmyCnt7でLoopさせて実行しています。