前回、商品マスタデータの取得プログラムを作成しました。
この記事では、商品マスタ画面の商品検索部分を作成していきます。
VBA在庫管理システムVer01
コントロールの動作設定について
コントロールの動作コードを作成するときは、①VBEでユーザーフォーム画面を開き、該当コントロールをダブルクリックすると、コントロール_Click や _Changeプロシージャが生成されるので、これを改修して作成していきます。
このとき、該当コントロールに既にプロシージャが作成されているときはそのプロシージャが選択されます。
また、②VBEでコードウィンドウを開き、オブジェクトボックスとプロシージャボックスを使用して直接プロシージャを作成することもできます。
いずれかの方法でプロシージャを作成した後、 Sub 〜 End Sub の中にコードを書いていきます。
必要のないプロシージャは可読性を妨げるので削除しましょう。
商品マスタの名称修正ボックス設定
商品名称コンボの動作設定
名称修正テキストボックスは、参照用に、商品名称コンボボックスと同一のテキストを表示させます。
商品名称コンボボックスの動作設定を作成します。
Private Sub cmbItemName_Change() '名称修正の設定 texNameUpdate.Text = cmbItemName.Text End Sub
@1. 名称修正テキストボックス
商品名称と同一のテキストを表示させます。
名称修正ボックスの表示設定
名称修正テキストボックスは修正時のみ使用します。登録・削除時は未使用となるので、デフォルトでは非表示とします。
VBEでfrmItemMasterを表示し、texNameUpdateを選択します。
プロパティウィンドウで詳細設定します。
※プロパティ設定後のユーザーフォーム
動作確認用に名称修正ラベルをクリックすると名称修正テキストボックスが表示されるようにコードを追加します。
Private Sub lblNameUpdate_Click() '名称修正テキストボックスの表示・非表示 With texNameUpdate If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub
@1. Withステートメント
With〜End Withの中では、オブジェクト名を省略できます。多用すると可読性が悪くなる場合がありますが、コードの入力速度が上がりますので、活用しましょう。
@2. テキストボックス表示設定
名称修正テキストボックスが非表示ならば表示、表示ならば非表示の設定をします。
画面を表示させ、動作確認してみましょう。
商品マスタの商品検索作成
変数の設定
宣言セクションにデータ展開用の列挙型変数を追加します。変数はPrivateで宣言します。
'lstItemMasterの項目列設定 Private Enum lstItemMasterColumns L商品ID = 0 L商品名称 L登録日 L更新日 L発注先 L発注単位 L梱包数 L最大在庫 L発注点 L棚位置 End Enum
@1. 列挙型変数の宣言
商品マスタコンボボックスのデータ展開用に、あらたに宣言セクションで列挙型変数を定義します。
シートの項目列と異なり、初期定数は0から始まります。
商品名称コンボでの名称検索
商品名称コンボボックスの動作設定を作成します。
Private Sub cmbItemName_Change() '名称修正の設定 texNameUpdate.Text = cmbItemName.Text '異常値の回避 If cmbItemName.ListIndex < 0 Then texItemID.Value = "" Exit Sub End If '詳細情報の表示 With cmbItemName texItemID.Value = .List(.ListIndex, lstItemMasterColumns.L商品ID) 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 '商品リストの選択 lstItemMaster.ListIndex = cmbItemName.ListIndex End Sub
@1. 異常値の回避
商品名称コンボの入力内容が商品名称コンボのリスト項目と合致しないときは、商品IDを非表示とします。
この段階で詳細情報をリセットしないのは、新規登録時に詳細情報を参照項目として利用するためです。
※異常値の回避に使用した、Exit Sub 構文などIf ステートメントの詳細は、下記の記事で解説しています。
@2. 詳細情報の表示
商品名称コンボの入力内容が商品名称コンボのリスト項目と合致したときは、商品名称コンボの各リスト項目をテキストボックスに表示させます。
@3. 商品リストの選択
商品リストと商品名称コンボには同一のリスト構造のデータを格納しているので、インデックス番号を受け渡します。
商品リストでの商品検索
商品リストを選択し、ダブルクリックすると商品情報が表示される動作を作成します。
オブジェクトボックスで lstItemMasterを、プロシージャボックスで DblClickを選択します。選択すると、lstItemMaster_DblClick のプロシージャが生成されます。(lstItemMaster_Click 等の必要の無いプロシージャは削除しましょう。)
商品リストのダブルクリック時の動作設定を作成します。
Private Sub lstItemMaster_DblClick(ByVal Cancel As MSForms.ReturnBoolean) '製品名称の選択 cmbItemName.ListIndex = lstItemMaster.ListIndex End Sub
@1. 商品名称コンボの選択
商品リストのインデックス番号を、商品名称コンボに受け渡し、表示等は cmbItemName_Change プロシージャーで実行させます。
商品マスタの検索リセット
詳細情報のリセット設定
詳細データをリセットするプロシージャをサブルーチンとして作成します。
Sub Reset() '詳細情報の表示解除 texItemID.Value = "" cmbItemName.Text = "" texSupplier.Value = "" texOrderUnit.Value = "" texPackage.Value = "" texMaxStock.Value = "" texOrderPoint.Value = "" texStockPosition.Value = "" '商品リストの選択解除 lstItemMaster.ListIndex = -1 End Sub
@1. 詳細情報の削除
各表示を削除します。
@2. リスト選択の解除
インデックス番号を-1に設定します。
リセットボタンの設定
リセットボタンの動作設定を作成します。
Private Sub btnReset_Click() Call Reset End Sub
@1. サブルーチンの実行
Resetプロシージャを呼び出し、検索情報をクリアします。
商品マスタ画面の検索設定ができました。
次回は実行ボタンを作成していきます。
www.minizaiko.com