ous">

小さな在庫管理

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

商品マスタ画面の実行ボタン作成 [VBA在庫管理システムVer01#08]

前回、商品マスタデータの商品検索部分を作成しました。

この記事では、商品マスタ画面の登録・修正・削除の実行ボタンを作成していきます。


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