前回、商品マスタデータの商品検索部分を作成しました。
この記事では、商品マスタ画面の登録・修正・削除の実行ボタンを作成していきます。
VBA在庫管理システムVer01
商品マスタの実行ボタン作成
オプションボタンの設定
各オプションボタンの動作設定をしていきます。
※ fraItemInput の初期画面
登録ボタンクリック時の動作を作成します。
Private Sub optInput_Click() '登録ボタンの表示 texNameUpdate.Visible = False lblExcuteDay.Caption = " 登録日" texExcuteDay.Value = Format(Date, "yyyy/mm/dd") btnExecute.Caption = "登 録" btnExecute.BackColor = &HFFFFC0 End Sub
※登録ボタンクリック時の fraItemInput 画面
@1. Format関数
日付の表示書式を設定します。ここでは、月表示を2桁に揃えます。
日付表示の桁数が一定になるので、入力規制やエラー回避等の拡張性がもてます。
修正ボタンクリック時の動作を作成します。
Private Sub optUpdate_Click() '修正ボタンの表示 texNameUpdate.Visible = True lblExcuteDay.Caption = " 修正日" texExcuteDay.Value = Format(Date, "yyyy/mm/dd") btnExecute.Caption = "修 正" btnExecute.BackColor = &HC0FFFF End Sub
※修正ボタンクリック時の fraItemInput 画面
@1. 名称修正テキストボックスの表示
修正オプションボタンが選択されているときのみ、名称修正テキストボックスを表示させるので、.Visible = True とします。
削除ボタンクリック時の動作を作成します。
Private Sub optDelete_Click() '削除ボタンの表示 texNameUpdate.Visible = False lblExcuteDay.Caption = " 削除日" texExcuteDay.Value = Format(Date, "yyyy/mm/dd") btnExecute.Caption = "削 除" btnExecute.BackColor = &HC0C0FF End Sub
※削除ボタンクリック時の fraItemInput 画面
オプションボタンをリセットボタンで解除するために、リセットプロシージャにコードを追加します。
Sub Reset() '詳細情報の表示解除 texItemID.Value = "" cmbItemName.Text = "" texSupplier.Value = "" texOrderUnit.Value = "" texPackage.Value = "" texMaxStock.Value = "" texOrderPoint.Value = "" texStockPosition.Value = "" '実行ボタンの表示解除 ←ここを追加 texNameUpdate.Visible = False optInput.Value = False optUpdate.Value = False optDelete.Value = False lblExcuteDay.Caption = "" texExcuteDay.Value = "" btnExecute.Caption = "" btnExecute.BackColor = &H8000000F '商品リストの選択解除 lstItemMaster.ListIndex = -1 End Sub
※リセットボタンクリック時の fraItemInput 画面
スピンボタンの設定
実行日の日付変更用スピンボタンの動作設定をします。
スピンアップ・スピンダウンの各プロシージャを作成します。
Private Sub spnExcuteDay_SpinUp() Dim dtDate As Date If texExcuteDay.Value <> "" Then dtDate = texExcuteDay.Value texExcuteDay.Value = DateAdd("d", 1, dtDate) End If End Sub
Private Sub spnExcuteDay_SpinDown() Dim dtDate As Date If texExcuteDay.Value <> "" Then dtDate = texExcuteDay.Value texExcuteDay.Value = DateAdd("d", -1, dtDate) End If End Sub
@1. If条件設定
実行日テキストボックスに日付が表示されていないときは、処理を実行しません。
オプションボタンの選択時には日付が表示されるので、処理を実行します。
ここで、実行日テキストボックスに日付以外の入力があるかの判定をし、異常値の回避をいれてもいいでしょう。
登録
商品情報を登録するプロシージャをサブルーチンとして作成します。
Sub 登録() '異常値の回避 If texItemID.Value <> "" Then MsgBox "商品名称が重複しています。", vbExclamation, "確認" Exit Sub End If Application.ScreenUpdating = False '作業ブックを開く Workbooks.Open データ位置 & "在庫管理DATA.xlsx" 'オブジェクト変数の取得 Dim wsItemMaster As Worksheet Set wsItemMaster = Workbooks("在庫管理DATA.xlsx").Sheets("M_商品") '最終行の取得 Dim wsItemMasterRow As Long wsItemMasterRow = wsItemMaster.Cells(Rows.Count, 1).End(xlUp).Row '登録情報書き込み With wsItemMaster .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M商品ID) = wsItemMasterRow .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M商品名称) = cmbItemName.Text .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M登録日) = texExcuteDay.Value .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M発注先) = texSupplier.Value .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M発注単位) = texOrderUnit.Value .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M梱包数) = texPackage.Value .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M最大在庫) = texMaxStock.Value .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M発注点) = texOrderPoint.Value .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M棚位置) = texStockPosition.Value .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M棚卸日) = texExcuteDay.Value .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M棚卸数) = 0 .Cells(wsItemMasterRow + 1, wsItemMasterColumns.M削除) = 0 End With '作業ブックを閉じる Workbooks("在庫管理DATA.xlsx").Close savechanges:=True Application.ScreenUpdating = True '変数の取得 Dim 再表示名称 As String 再表示名称 = cmbItemName.Text '詳細情報のリセット Call Reset '商品マスタ情報の再取得 Call UserForm_Initialize '商品情報の再表示 cmbItemName.Text = 再表示名称 End Sub
@1. 異常値の回避
商品IDが表示されているものは、既に登録されていますのでマスタデータが重複しないように、コメントを表示して処理を終了させます。
@2. 登録情報書き込み
シート最終行の次の行にデータを書き込んでいきます。
マスタデータは論理削除の構造なので、商品IDはシート最終行と同じ値となります。
初期値として、棚卸日には登録日を、棚卸数には0を登録します。削除フラグに0を登録するのも、忘れないでください。
@3. ブックの立ち下げ
シートに登録情報を書き込みましたので、ブックは保存して閉じます。
@4. 商品情報の再表示
一旦、変数=再表示名称 に商品名称を取り込み、Resetプロシージャーを呼び出し、詳細情報をリセットします。
UserForm_Initializeプロシージャーを呼び出し、商品マスタ情報を再取得した後、商品名称コンボに変数=再表示名称を書き込み、詳細情報を表示させます。
修正
商品情報を修正するプロシージャをサブルーチンとして作成します。
Sub 修正() '異常値の回避 If texItemID.Value = "" Then MsgBox "商品登録がありません。", vbExclamation, "確認" Exit Sub End If Application.ScreenUpdating = False '作業ブックを開く Workbooks.Open データ位置 & "在庫管理DATA.xlsx" 'オブジェクト変数の取得 Dim wsItemMaster As Worksheet Set wsItemMaster = Workbooks("在庫管理DATA.xlsx").Sheets("M_商品") '修正行の取得 Dim 修正行 As Long 修正行 = wsItemMaster.Columns("A:A").Find(texItemID.Value, LookAt:=xlWhole).Row '修正情報書き込み With wsItemMaster .Cells(修正行, wsItemMasterColumns.M商品名称) = texNameUpdate.Value .Cells(修正行, wsItemMasterColumns.M更新日) = texExcuteDay.Value .Cells(修正行, wsItemMasterColumns.M発注先) = texSupplier.Value .Cells(修正行, wsItemMasterColumns.M発注単位) = texOrderUnit.Value .Cells(修正行, wsItemMasterColumns.M梱包数) = texPackage.Value .Cells(修正行, wsItemMasterColumns.M最大在庫) = texMaxStock.Value .Cells(修正行, wsItemMasterColumns.M発注点) = texOrderPoint.Value .Cells(修正行, wsItemMasterColumns.M棚位置) = texStockPosition.Value End With '作業ブックを閉じる Workbooks("在庫管理DATA.xlsx").Close savechanges:=True Application.ScreenUpdating = True '変数の取得 Dim 再表示名称 As String 再表示名称 = texNameUpdate.Value '詳細情報のリセット Call Reset '商品マスタ情報の再取得 Call UserForm_Initialize '商品情報の再表示 cmbItemName.Text = 再表示名称 End Sub
@1. 異常値の回避
商品IDが表示されていないものは、修正元データがありませんので、コメントを表示して処理を終了させます。
@2. 修正行の取得
シートが並び変わっているおそれがあるので、Find関数を使用し、商品IDで修正行を検索します。
修正行が見つからない場合はあまり想定できないので、異常値の回避コードは入れてありませんが、修正行=Noting で判定できますので、必要に応じて追加してください。
@3. 修正情報書き込み
修正行に修正可能なデータのみ、書き込んでいきます。
製品名称は名称修正テキストボックスの値を書き込みますので、注意してください。また、修正日はM_商品の更新日に登録します。
@4. ブックの立ち下げ
シートに修正情報を書き込みましたので、ブックは保存して閉じます。
@5. 商品情報の再表示
一旦、変数=再表示名称 に商品名称を取り込み、Resetプロシージャーを呼び出し、詳細情報をリセットします。
UserForm_Initializeプロシージャーを呼び出し、商品マスタ情報を再取得した後、商品名称コンボに変数=再表示名称を書き込み、詳細情報を表示させます。
削除
商品情報を削除するプロシージャをサブルーチンとして作成します。
Sub 削除() '異常値の回避 If texItemID.Value = "" Then MsgBox "商品登録がありません。", vbExclamation, "確認" Exit Sub End If Application.ScreenUpdating = False '作業ブックを開く Workbooks.Open データ位置 & "在庫管理DATA.xlsx" 'オブジェクト変数の取得 Dim wsItemMaster As Worksheet Set wsItemMaster = Workbooks("在庫管理DATA.xlsx").Sheets("M_商品") '削除行の取得 Dim 削除行 As Long 削除行 = wsItemMaster.Columns("A:A").Find(texItemID.Value, LookAt:=xlWhole).Row '削除情報書き込み With wsItemMaster .Cells(削除行, wsItemMasterColumns.M更新日) = texExcuteDay.Value .Cells(削除行, wsItemMasterColumns.M削除) = 1 End With '作業ブックを閉じる Workbooks("在庫管理DATA.xlsx").Close savechanges:=True Application.ScreenUpdating = True '詳細情報のリセット Call Reset '商品マスタ情報の再取得 Call UserForm_Initialize End Sub
@1. 異常値の回避
商品IDが表示されていないものは、削除元データがありませんので、コメントを表示して処理を終了させます。
@2. 削除行の取得
シートが並び変わっているおそれがあるので、Find関数を使用し、商品IDで削除行を検索します。
削除行が見つからない場合はあまり想定できないので、異常値の回避コードは入れてありませんが、削除行=Noting で判定できますので、必要に応じて追加してください。
@3. 削除情報書き込み
マスタデータは論理削除の構造なので、削除フラグに1を書き込み、行削除のような物理削除はしません。また、削除日はM_商品の更新日に登録されます。
@4. ブックの立ち下げ
シートに削除情報を書き込みましたので、ブックは保存して閉じます。
@5. 商品情報の再表示
再表示する情報はありませんので、詳細情報のリセットと商品マスタ情報の再取得のみ実行します。
実行ボタンの設定
実行ボタンクリック時の動作を作成します。
オプションボタンの状態に合わせ、サブルーチンを実行させます。
Private Sub btnExecute_Click() If optInput.Value = True Then Call 登録 ElseIf optUpdate.Value = True Then Call 修正 ElseIf optDelete.Value = True Then Call 削除 End If End Sub
これで、商品マスタ画面のおおまかな動作設定が終了しました。
次回は、入力支援などを追加し、商品マスタ画面を完成させます。
www.minizaiko.com