ous">

小さな在庫管理

在庫管理導入からシステム作成まで詳細解説!

商品在庫画面の商品在庫表作成 [VBA在庫管理システムVer01#26]

前回、商品マスタデータの取得プログラムを作成しました。

この記事では、商品在庫画面の商品在庫表 及び 商品検索を作成していきます。


VBA在庫管理システムVer01

商品在庫の在庫表作成

商品在庫表の表示

商品在庫表を表示するプロシージャをサブルーチンとして作成します。

Sub ShowItemStock()

    Application.ScreenUpdating = False

'作業ブックを開く
Workbooks.Open データ位置 & "在庫管理DATA.xlsx"
    
'オブジェクト変数の取得
Dim wsItemMaster As Worksheet
Set wsItemMaster = Workbooks("在庫管理DATA.xlsx").Sheets("M_商品")

'商品在庫表データの取り込み
Dim aryStock() As Variant
Dim i As Long, j As Long

'最終行の取得
Dim wsItemMasterRow As Long
wsItemMasterRow = wsItemMaster.Cells(Rows.Count, 1).End(xlUp).Row

'有効在庫/発注フラグを昇順で並べ替え
wsItemMaster.Range("A1").Sort key1:=wsItemMaster.Range("R1"), order1:=xlAscending, Header:=xlYes
wsItemMaster.Range("A1").Sort key1:=wsItemMaster.Range("S1"), order1:=xlAscending, Header:=xlYes

'変数の設定
ReDim aryStock(wsItemMasterRow - 2, 4) As Variant
j = 0

'変数への取り込み
For i = 2 To wsItemMasterRow
    If wsItemMaster.Cells(i, wsItemMasterColumns.M削除) = 0 Then
        aryStock(j, 0) = wsItemMaster.Cells(i, wsItemMasterColumns.M商品ID)
        aryStock(j, 1) = wsItemMaster.Cells(i, wsItemMasterColumns.M商品名称)
        aryStock(j, 2) = wsItemMaster.Cells(i, wsItemMasterColumns.M現在在庫)
        aryStock(j, 3) = wsItemMaster.Cells(i, wsItemMasterColumns.M有効在庫)
        aryStock(j, 4) = wsItemMaster.Cells(i, wsItemMasterColumns.M発注Flag)
        j = j + 1
    End  If
Next

'商品在庫表リストボックスの設定
With lstStock
    .Clear
    .ColumnCount = 5
    .ColumnWidths = "50;150;80;80;60"

    .List = aryStock
End With

'作業ブックを閉じる
Workbooks("在庫管理DATA.xlsx").Close savechanges:=False

    Application.ScreenUpdating = True

End Sub

@1. シートの描画を止める
Application.ScreenUpdatingをFalsに設定に設定します。

@2.変数への取り込み
データブックを開いた後、M_商品シートとその最終行を変数に格納します。

@3.シートの並び替え
有効在庫と発注フラグを昇順に並び替え、リストを成形します。

@4.配列変数への取り込み
配列変数の要素数を確定させたあと、For〜Next構文でデータを取り込みます。
データは論理削除の構造なので、削除フラグが立っているものは取り込みません。

@5.商品在庫表リストへの表示
ColumnWidthsで表示状態を設定し、商品在庫表リストボックスへ表示します。

@6.ブックの立ち下げ
シートを操作してますので、初期化するため、ブックは保存せずに閉じます。
また、Application.ScreenUpdatingもTrue設定に戻します。

商品在庫表の表示設定

商品在庫リストボックスに初期値として表示させるため、初期設定にサブルーチンの実行コードを追加します。

Private Sub UserForm_Initialize()

'----サイズ調整---------------------------------------------------------
    Me.Zoom = Me.Zoom * ((画面高さ * 高さ割合) / Me.Height)
    Me.Width = Me.Width * ((画面高さ * 高さ割合) / Me.Height)
    Me.Height = Me.Height * ((画面高さ * 高さ割合) / Me.Height)
'-----------------------------------------------------------------------

~~~~~~~~~~~~~~~

'在庫表の表示    ←ここを追加
Call ShowItemStock

End Sub

 

商品在庫の商品検索作成

変数の設定

宣言セクションにデータ展開用の列挙型変数を追加します。変数はPrivateで宣言します。

'lstItemMasterの項目列設定
Private Enum lstItemMasterColumns
    L商品ID = 0
    L商品名称
    L登録日
    L更新日
    L発注先
    L発注単位
    L梱包数
    L最大在庫
    L発注点
    L棚位置
End Enum

@1. 列挙型変数の宣言
商品マスタコンボボックスのデータ展開用に、あらたに宣言セクションで列挙型変数を定義します。
シートの項目列と異なり、初期定数は0から始まります。

詳細情報のリセット設定

詳細データをリセットするプロシージャをサブルーチンとして作成します。

Sub Reset()

'詳細情報の表示解除
cmbItemID.Text = ""
texSupplier.Value = ""
texOrderUnit.Value = ""
texPackage.Value = ""
texMaxStock.Value = ""
texOrderPoint.Value = ""
texStockPosition.Value = ""

'商品在庫表の選択解除
lstStock.ListIndex = -1

End Sub

@1. 詳細情報の表示解除
各表示を削除します。

@2.商品在庫表の選択解除
インデックス番号 = -1 を受け渡し、選択を解除します。

商品名称コンボでの名称検索

商品名称コンボボックスの動作設定を作成します。

Private Sub cmbItemName_Change()

'商品選択無し時の回避
If cmbItemName.ListIndex = -1 Then
    Call Reset
    Exit Sub
End If

'詳細情報の表示
With cmbItemName
    cmbItemID.ListIndex = .ListIndex
    texSupplier.Value = .List(.ListIndex, lstItemMasterColumns.L発注先)
    texOrderUnit.Value = .List(.ListIndex, lstItemMasterColumns.L発注単位)
    texPackage.Value = .List(.ListIndex, lstItemMasterColumns.L梱包数)
    texMaxStock.Value = .List(.ListIndex, lstItemMasterColumns.L最大在庫)
    texOrderPoint.Value = .List(.ListIndex, lstItemMasterColumns.L発注点)
    texStockPosition.Value = .List(.ListIndex, lstItemMasterColumns.L棚位置)
End With

'商品在庫表の選択
Dim i As Long

For i = 0 To lstStock.ListCount
    If lstStock.List(i, 0) = cmbItemName.List(cmbItemName.ListIndex,lstItemMasterColumns.L商品ID) Then
        lstStock.ListIndex = i
        Exit For
    End If
Next

End Sub

@1.異常値の回避
商品名称コンボの入力内容が商品名称コンボのリスト項目と合致しないときは、詳細情報をリセットします。
Resetプロシージャを呼び出し、詳細データをクリアした後、プロシージャを抜けます。

@2.詳細情報の表示
商品名称コンボの入力内容が商品名称コンボのリスト項目と合致したときは、商品名称コンボの各リスト項目をテキストボックスに表示させます。

@3.商品在庫表の選択
商品在庫表をループし、商品名称コンボの商品IDと合致するレコードを選択し、ループを抜けます。

商品IDコンボでの商品検索

商品IDコンボボックスの動作設定を作成します。

Private Sub cmbItemID_Change()

'商品名称の選択
cmbItemName.ListIndex = cmbItemID.ListIndex

End Sub

@1.商品名称コンボの選択
商品IDコンボボックスのインデックス番号を、商品名称コンボボックスに受け渡し、詳細表示等は cmbItemName_Change プロシージャーで実行させます。

商品在庫リストでの商品検索

商品在庫表リストボックスのダブルクリック時の動作設定を作成します。

Private Sub lstStock_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

'商品名称の選択
cmbItemName.Text = lstStock.List(lstStock.ListIndex, 1)

End Sub

@1.商品名称コンボの選択
商品在庫表リストボックスの選択行の商品名称を、商品名称コンボボックスに受け渡し、詳細表示等は cmbItemName_Change プロシージャーで実行させます。

リセットボタンの設定

リセットボタンの動作設定を作成します。

Private Sub btnReset_Click()

'商品名称の選択
cmbItemName.ListIndex = -1

End Sub

@1.商品名称コンボの選択
インデックス番号 = -1 を、商品名称コンボボックスに受け渡し、詳細情報のクリア等は cmbItemName_Change プロシージャーで実行させます。



商品在庫画面の商品在庫表 及び 商品検索の設定ができました。
次回は受払履歴リストを作成していきます。
www.minizaiko.com