前回、商品マスタデータの取得プログラムを作成しました。
この記事では、商品在庫画面の商品在庫表 及び 商品検索を作成していきます。
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