入出庫処理をまとめて、データベースの項目を追加する 【VBA在庫管理#23】

Excel VBA 部品在庫管理アイキャッチ画像部品在庫管理

体重が3kg増えました(照)、どうもoReです。

今回は、データベースの項目を増やしていきます。

だって、在庫数だけ数えてもねぇ…
いろんなデータがあると解析できると思うの。

入庫処理・出庫処理プログラムまとめ

Mainフォームに入庫処理出庫処理を書いていますが、
項目を追加する場合、この2つのプロシージャに追加しないと
いけなくなるので、今のうちにまとめちゃいましょう。

入庫処理と出庫処理のコードを見るとほぼ同じですよね。

 

違いといえば

・在庫数の増減の部分

在庫数をプラスするか、マイナスするかの違い。

'入庫処理
Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) + TextBox3
'出庫処理
Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) - TextBox3

 

・入出庫履歴シートへの入庫か出庫かの出力部分

入庫と出力するか、出庫と出力するかの違い。

'入庫処理
.Range("I3") = "入庫"
'出庫処理
.Range("I3") = "出庫"

 

・メッセージの部分

『入庫しました。』と表示するか、『出庫しました。』と表示するかの違い。

'入庫処理
MsgBox "入庫しました。"
'出庫処理
MsgBox "出庫しました。"

のみです。

 

Mainフォームに新たにNyuSyukkoプロシージャを作成します。
共通する部分はコピペしてサクッとまとめましょう。

  ↓こんな感じ

'入出庫処理
Private Sub NyuSyukko(ByVal NS As String) '引数NSは文字列で、入庫か出庫をちょうだい!!
  Dim Knskcell As Range

  If ComboBox1 = "" Then
    MsgBox "入出庫者名を入力してください。"
  ElseIf TextBox2 = "" Then
    MsgBox "バーコードデータを入力してください。"
  ElseIf TextBox3 = "" Then
    MsgBox "個数を入力してください。"
  Else
    Set Knskcell = Range("C:C").Find(what:=TextBox2, lookat:=xlWhole)
    If Knskcell Is Nothing Then
      MsgBox "部品が登録されていません。"
    Else
      If NS = "入庫" Then '引数NSが入庫の場合
        Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) + TextBox3
      ElseIf NS = "出庫" Then '引数NSが出庫の場合
        Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) - TextBox3
      End If
      'ここに項目追加処理を書くよ
      With Sheet2 '入出庫履歴シートへ出力
        .Rows(Rows.Count).Delete
        .Rows(3).Insert
        .Range("B3") = Now
        .Range("C3") = ComboBox1
        .Range("D3") = Knskcell.Offset(0, -1)
        .Range("E3") = Knskcell.Offset(0, 1)
        .Range("F3") = Knskcell.Offset(0, 2)
        .Range("G3") = Knskcell.Offset(0, 3)
        .Range("H3") = TextBox3 * 1
        .Range("I3") = NS '引数NSの文字列を出力
      End With
      Call UserForm_Initialize
      MsgBox NS & "しました。" '引数NSの文字列に しました。を合体
    End If
  End If
End Sub

 

コマンドボタン1クリックを変更

'出庫ボタンクリック
Private Sub CommandButton1_Click()
  Call NyuSyukko("出庫") '引数に文字列の出庫を渡すよ!!
End Sub

 

コマンドボタン2クリックを変更

'入庫ボタンクリック
Private Sub CommandButton2_Click()
  Call NyuSyukko("入庫") '引数に文字列の入庫を渡すよ!!
End Sub

 

動作確認しましょう。
ちゃんと、入出庫していますか?

oReのぞき見

データベースの項目追加

とりあえず、以下の項目を追加します。

・最大在庫数・最少在庫数・過剰在庫数・在庫不足数
・部品注文数・部品単価・部品合計金額

  ↓データベースシートに追加

データベース項目追加

では、追加した項目の処理を書いていきましょう。

 

過剰在庫数処理

・過剰在庫数=在庫数-最大在庫数

With Knskcell
  .Offset(0, 7) = .Offset(0, 4) - .Offset(0, 5) '過剰在庫数=在庫数-最大在庫数
End With

 

在庫不足数処理

・在庫不足数=最少在庫数-在庫数

With Knskcell
  .Offset(0, 7) = .Offset(0, 4) - .Offset(0, 5) '過剰在庫数=在庫数-最大在庫数
  .Offset(0, 8) = .Offset(0, 6) - .Offset(0, 4) '在庫不足数=最少在庫数-在庫数
End With

 

部品注文数処理

・部品注文数=最大在庫数-在庫数

With Knskcell
  .Offset(0, 7) = .Offset(0, 4) - .Offset(0, 5) '過剰在庫数=在庫数-最大在庫数
  .Offset(0, 8) = .Offset(0, 6) - .Offset(0, 4) '在庫不足数=最少在庫数-在庫数
  .Offset(0, 9) = .Offset(0, 5) - .Offset(0, 4) '部品注文数=最大在庫数-在庫数
End With

 

部品合計金額処理

・部品合計金額=在庫数×部品単価

With Knskcell
  .Offset(0, 7) = .Offset(0, 4) - .Offset(0, 5) '過剰在庫数=在庫数-最大在庫数
  .Offset(0, 8) = .Offset(0, 6) - .Offset(0, 4) '在庫不足数=最少在庫数-在庫数
  .Offset(0, 9) = .Offset(0, 5) - .Offset(0, 4) '部品注文数=最大在庫数-在庫数
  .Offset(0, 11) = .Offset(0, 4) * .Offset(0, 10) '部品合計金額=在庫数*部品単価
End With

 

動作確認しましょう。

入出庫した際、過剰在庫数・在庫不足数・部品注文数・部品合計金額が
算出されていますか?

oReのぞき見

まとめ

特になし!!

oReあけおめ

次回 もうちょい項目追加するよ

ExcelVBA部品在庫管理【目次】へ戻る

コメント

  1. しん より:

    初めまして、しんと申します。毎回オレグラミングで、VBAを勉強させていただいています。
    入出庫をまとめたVBAについて質問させて下さい。
    私の会社は、在庫管理ソフトを買うのは高いから、作れと言う難題を頂いて勉強して作ってるのですが、バーコードとロットが、完全一致した時に入出庫処理をしたいと思って、VBAを書いたのですが、構文的?解釈的に合っているのでしょうか?

    途中まで省略…
    Set Knskcell = Range("C:C").Find(what:=TextBox1, lookat:=xlWhole)
    Set Knskcell = Range("D:D").Find(what:=TextBox2, lookat:=xlWhole)
    If Knskcell Is Nothing Then
      MsgBox "部品が登録されていません。"
    Else…以下省略…
    

    C列の中から、TextBox1と同じものを探してね。
    D列の中から、TextBox2と同じものを探してね。
    と、並べて書いて、検索のAndの意味になるのかが、わかりません。何分初心者のため、うまく伝わらなかったらすみません。

    • oReoRe より:

      しん様
      はじめまして。
      コメントありがとうございます。 

      >私の会社は、在庫管理ソフトを買うのは高いから、作れ…

      男前で素晴らしい会社ですね(笑)

       

      >並べて書いて、検索のAndの意味になるのかが、わかりません。

      Andの意味にはなりません。

      Set Knskcell = Range("C:C").Find(what:=TextBox1, lookat:=xlWhole)
      Set Knskcell = Range("D:D").Find(what:=TextBox2, lookat:=xlWhole)
      If Knskcell Is Nothing Then
        MsgBox "部品が登録されていません。"
      Else…以下省略…
      

      変数には1つのデータしか入りません。

      上記のコードだと、

      ①C列の検索結果がKnskcellに入る。

      ②D列の検索結果がKnskcellに入る。(※上書きされる)

      ③D列の検索結果で条件分岐する。

      と言った処理になると思います。

       

      ↓入れ子(Nest)にする場合の例

      Set Knskcell = Range("C:C").Find(what:=TextBox1, lookat:=xlWhole)
      If Knskcell Is Nothing Then
        MsgBox "登録なし"
      Else
        Set Knskcell = Range("D:D").Find(what:=TextBox2, lookat:=xlWhole)
        If Knskcell Is Nothing Then
          MsgBox "登録なし"
        Else
          MsgBox "登録あり"
        End If
      End If
      

       

      ↓And演算子を使う場合の例(【VBA在庫管理#33】)

      Dim Knskcell_1 As Range, Knskcell_2 As Range
      
      Set Knskcell_1 = Range("C:C").Find(what:=TextBox1, lookat:=xlWhole)
      Set Knskcell_2 = Range("D:D").Find(what:=TextBox2, lookat:=xlWhole)
      If Not Knskcell_1 Is Nothing And Not Knskcell_2 Is Nothing Then
        MsgBox "登録あり"
      Else
        MsgBox "登録なし"
      End If
      

       

      こんな感じになると思います。

  2. しん より:

    oRe様
    アドバイスというより、わかりやすい解説、回答まで頂きありがとうございます。完全に盲点でした。
    確かにおっしゃられるように、kenskcellは、C列から、探したデータを入れると言ってるのに、D列のデータも入れたらおかしくなりますね。

    大変勉強に、なりましたが、初心者丸出しの質問、恥ずかしい限りです。

    ちなみに私の会社は、今紙で在庫管理していまして、監査の時にそのうちの一個の在庫を見せてくれと言うときにスムーズに提示出来なかったから、パソコンで作ってすぐ見せらるように…と言うのが事の発端です(泣)

    oRe様のオレグラミングは、大変分かりやすく、誰にでも胸を張ってお勧めできる内容ですので、更新も大変だと思いますが、頑張って下さい。
    最後に、こんな幼稚な質問に答えて頂きありがとうございました。

    • oReoRe より:

      >こんな幼稚な質問に…

       

      全然幼稚ではないですよ?

      だって、初心者だもの!!

      わからないのが、デフォです。

       

      お役に立てたようで幸いです。

  3. ポン より:

    オレプログラミングで楽しく勉強させて頂いてます。
    初歩的な質問で申し訳ないのですが、データベースの項目追加のコード

    
    With Knskcell
      .Offset(0, 7) = .Offset(0, 4) - .Offset(0, 5) '過剰在庫数=在庫数-最大在庫数
      .Offset(0, 8) = .Offset(0, 6) - .Offset(0, 4) '在庫不足数=最少在庫数-在庫数
      .Offset(0, 9) = .Offset(0, 5) - .Offset(0, 4) '部品注文数=最大在庫数-在庫数
      .Offset(0, 11) = .Offset(0, 4) * .Offset(0, 10) '部品合計金額=在庫数*部品単価
    End With
    

    はどこに書いたらいいのでしょうか?
    教えてください。

    • oReoRe より:

      ポン様
      はじめまして。
      コメントありがとうございます。

       

      >どこに書いたらいいのでしょうか?

       

      在庫数が変わった後に書けばいいと思います。

      とりあえず、ブログコード内の『’ここに項目追加処理を書くよ』
      辺りに書けばいいと思います。

タイトルとURLをコピーしました