前回、棚卸作業の前半部分を解説しました。
この記事では、棚卸作業の後半部分を解説します。
VBA在庫管理システムVer01
棚卸の流れ
システムの棚卸は、下記の作業フローで進めます。
1. 棚卸集計表の出力
商品在庫画面から出力
2. 実棚の計量
棚卸集計表用紙への記入
3. 棚卸集計表への入力
棚卸集計表シートへの入力
4. 棚卸実行
システム棚卸の実行
フローに沿って、システムの追加機能などを解説していきます。
この記事では4の、棚卸実行について解説します。
棚卸実行の準備
出力ボタンの作成
ここまで、メニュー画面は初期状態のままでボタンが並んでいるだけでしたが、フレームを利用し画面を整えます。
画像を参考にして、メニュー画面を修正してみて下さい。
※プロパティ設定後のユーザーフォーム
メニュー画面に棚卸実行ボタンを追加します。
システム管理のフレームを作成して、棚卸実行のコマンドボタンを追加し、プロパティウィンドウで詳細設定します。
※プロパティ設定後のユーザーフォーム
標準モジュールの作成
標準モジュールを追加し、オブジェクト名を棚卸実行とします。
棚卸を実行するプロシージャはユーザーフォームの動作とは異なりますので、標準モジュールに作成していきます。
システム棚卸の実行
変数の設定
商品マスタデータの取り込み用変数の設定をしていきます。
VBEで標準モジュール 棚卸実行を選択し、宣言セクションに列挙型変数をPrivateで宣言します。
Option Explicit 'wsItemMasterの項目列設定 Private Enum wsItemMasterColumns M商品ID = 1 M商品名称 M登録日 M更新日 M発注先 M発注単位 M梱包数 M最大在庫 M発注点 M棚位置 M棚卸日 M棚卸数 M出庫済み M出庫予定 M入庫済み M入庫予定 M現在在庫 M有効在庫 M発注Flag M削除 End Enum
@1. 列挙型変数の宣言
標準モジュール 棚卸実行では、商品マスタシートの全ての列を列挙型変数で宣言します。
棚卸実行
商品マスタの棚卸データを更新するプロシージャをサブルーチンとして、標準モジュール 棚卸実行に作成します。
Sub GetItemInventoryUpdate() '棚卸実行選択画面の非表示 Unload frmItemInventorySelect 'インプットボックスを設定し、棚卸日を取得 Dim myMsg As String, myTitle As String, 棚卸日 As String myMsg = "棚卸日を入力してください" & vbCr & "(例:2023/03/31)" myTitle = "棚卸日入力" 棚卸日 = Application.InputBox(prompt:=myMsg, Title:=myTitle, Default:=Format(Date, "yyyy/mm/dd"), Type:=2) 'インプットボックスの入力値を判定 If 棚卸日 = "False" Then Exit Sub End If Application.ScreenUpdating = False '棚卸集計データの取得--------------------------------------------------------------------------------------------------- 'ファイル名の格納 Dim FileName As String FileName = データ位置 & Format(棚卸日, "yyyymmdd") & "棚卸集計表.xlsx" 'ファイルの存在判定 If Dir(FileName) = "" Then 'プログラム終了 frmMainMenu.Show MsgBox "ファイルが見つかりません。", vbCritical, "確認" Exit Sub Else '作業ブックを開く Workbooks.Open FileName End If 'オブジェクト変数の取得 Dim wsInventoryReport As Worksheet Set wsInventoryReport = Workbooks(Format(棚卸日, "yyyymmdd") & "棚卸集計表.xlsx").Sheets("棚卸集計表") '棚卸集計データの取り込み Dim aryInventory() As Variant Dim i As Long '最終行の取得 Dim wsInventoryReportRow As Long wsInventoryReportRow = wsInventoryReport.Cells(Rows.Count, 1).End(xlUp).Row '変数の設定 ReDim aryInventory(wsInventoryReportRow - 4, 1) As Variant '変数への取り込み For i = 5 To wsInventoryReportRow aryInventory(i - 5, 0) = wsInventoryReport.Cells(i, 1) aryInventory(i - 5, 1) = wsInventoryReport.Cells(i, 8) Next '作業ブックを閉じる Workbooks(Format(棚卸日, "yyyymmdd") & "棚卸集計表.xlsx").Close savechanges:=False '棚卸集計データの書込--------------------------------------------------------------------------------------------------- '作業ブックを開く Workbooks.Open データ位置 & "在庫管理DATA.xlsx" 'オブジェクト変数の取得 Dim wsItemMaster As Worksheet Set wsItemMaster = Workbooks("在庫管理DATA.xlsx").Sheets("M_商品") '最終行の取得 Dim wsItemMasterRow As Long wsItemMaster.Activate wsItemMasterRow = wsItemMaster.Cells(Rows.Count, 1).End(xlUp).Row '棚卸集計データの書き込み Dim j As Long For i = 2 To wsItemMasterRow For j = 0 To UBound(aryInventory, 1) If wsItemMaster.Cells(i, M商品ID) = aryInventory(j, 0) Then wsItemMaster.Cells(i, M棚卸日) = Format(棚卸日, "yyyy/mm/dd") wsItemMaster.Cells(i, M棚卸数) = aryInventory(j, 1) Exit For End If Next Next '作業ブックを閉じる Workbooks("在庫管理DATA.xlsx").Close savechanges:= True Application.ScreenUpdating = True '棚卸実行完了画面の表示 frmItemInventoryUpdate.Show End Sub
@1. ユーザーフォームの消去
棚卸実行選択画面をとじます。
@2. 棚卸日の取得
インプットボックスの機能を利用し、ユーザーに棚卸日を入力して貰います。
@3. 入力値の判定
インプットボックスのキャンセルが押された場合は、プロシージャーを抜けます。
A.データの取得:棚卸集計表シートからデータを配列変数に取得します。
@4. ファイル名の格納
変数 棚卸日 を利用し、棚卸集計表のファイル名を成形し、変数 FileName に格納します。
@5. ファイルの存在確認
Dir関数を使用し、ファイルが存在するか判定します。
ファイルがない場合はプロシージャーを抜け、ファイルが有ればファイルを開きます。
@6. 配列変数の設定
集計シートの最終行を取得し、配列変数の要素数を確定させたあと、For〜Next構文でデータを取り込みます。
@7. ブックの立ち下げ
シートを操作してますので、初期化するため、ブックは保存せずに閉じます。
B.データの書込:配列変数に格納した棚卸集計表データを、商品マスタシートに書き込みます。
@8. 作業ブックを開く
データブックを開き、商品マスタシートを変数に格納します。
このとき、最終行も取得します。
@9. 棚卸集計データの書込み
商品マスタシートをループして、1レコードづつ書き込んでいきます。
商品マスタシートの商品IDと配列変数の商品IDが合致したら、棚卸日と棚卸数を書き込んでいきます。
@10. ブックの立ち下げ
シートにデータを書き込みましたので、ブックは保存して閉じます。
@11. 終了フラグ
棚卸実行完了画面を表示して、処理は終了です。
棚卸実行フォームの作成
棚卸実行用に、ユーザーフォームを2つ作成していきます。
棚卸実行選択画面
棚卸実行選択用に、frmItemStockSelectをコピーして、新たにfrmItemInventorySelectを作成します。
※VBA実行時の棚卸実行選択画面
棚卸実行完了画面
棚卸実行完了後の終了フラグ用に、 frmItemInventoryReportをコピーして、新たにfrmItemInventoryUpdateを作成します。
※VBA実行時の棚卸実行完了画面
システム棚卸の実行
メニュー画面の棚卸実行ボタン
Private Sub btnInventoryUpdate_Click() frmItemInventorySelect.Show End Sub
@1. 棚卸実行選択画面の表示
直接、棚卸実行をおこなうのではなく、メニュー画面 → 棚卸実行選択画面 の画面遷移を作成します。
システム全体の更新となるので、2段階の選択にして、後戻りできるようにします。
選択画面の"はい"ボタン
Private Sub btnYes_Click() '棚卸実行 Call GetItemInventoryUpdate End Sub
@1. システム棚卸の実行
サブルーチンを実行します。
選択画面の"いいえ"ボタン
Private Sub btnNo_Click() 'フォームを閉じる Unload Me End Sub
@1. 棚卸選択画面の非表示
棚卸は実行せずに、棚卸実行選択画面を閉じます。
実行画面の閉じるボタン
Private Sub btnClose_Click() 'フォームを閉じる Unload Me End Sub
@1. 棚卸実行画面の非表示
棚卸実行画面を閉じます。
画面を表示させて、動作確認しましょう。
動作確認時は、データブックをコピーしバックアップをとることを心がけましょう。
システムの棚卸機能ができました。
次回はメニュー画面の追加機能を作成していきます。
www.minizaiko.com