リストボックスを増えていく入出庫履歴に対応させる 【VBA在庫管理#10】

Excel VBA 部品在庫管理アイキャッチ画像部品在庫管理

台風19号大丈夫でしたか? どうもoReです。

今回は、増えていく入出庫履歴に対応するように
プログラムを作っていきます。

前回のプログラム問題点1

前回のListBoxに入出庫履歴を表示させるプログラムは
こんな感じに書きました。

'ユーザーフォーム初期化
Private Sub UserForm_Initialize()
  ListBox1.ColumnCount = 8
  ListBox1.ColumnWidths = “90;40;20;100;100;100;20;30;”
  ListBox1.List = Worksheets(“入出庫履歴”).Range(“B3:I8”).Value
End Sub

 

何が問題かというと、リストボックスに登録する
セル範囲を固定しているところです。

ListBox1.List = Worksheets(“入出庫履歴”).Range(“B3:I8”).Value

 

入出庫履歴は増えていくので、セル範囲を固定してしまうと
9行目以降に対応できないですよね?

リストボックスに登録出来ない範囲

増えていく入出庫履歴に対応させるには、
セル範囲を変動させなければいけません。

さっしのいいあなたなら、気付いてますね?(笑)

 

最終セルの行を取得する

入出庫履歴シートに出力するプログラムで使用したやつです。

Worksheets("入出庫履歴").Cells(Rows.Count, 2).End(xlUp)

入出庫履歴シートの2列目の最終セルを取得しています。

 

今回は、入出庫履歴シートの9列目の最終セルのを取得します。

Worksheets("入出庫履歴").Cells(Rows.Count, 9).End(xlUp).Row

 

取得した行を変数にいれます。

行は数値で取得するので、変数の型はLongを使用します。

Dim LastRow As Long
LastRow = Worksheets("入出庫履歴").Cells(Rows.Count, 9).End(xlUp).Row

 

これで、LastRowという変数に9列目の最終セル行の『12』がはいります。

入出庫履歴最終セル行取得

 

あとは、リストボックスに登録するセル範囲にLastRowをぶち込むだけです。

  ↓こんな感じ

'ユーザーフォーム初期化
Private Sub UserForm_Initialize()
  Dim LastRow As Long

  LastRow = Worksheets("入出庫履歴").Cells(Rows.Count, 9).End(xlUp).Row
  ListBox1.ColumnCount = 8
  ListBox1.ColumnWidths = “90;40;20;100;100;100;20;30;”
  ListBox1.List = Worksheets(“入出庫履歴”).Range(“B3:I” & LastRow).Value
End Sub

※&は、合体させるときに使います。

Range(“B3:I” & LastRow)は、Range(“B3:I12”)ということになります。

 

ちゃんとリストボックスに表示されましたか?

リストボックス入出庫履歴反映完了

動作確認として、入出庫履歴を増やして表示してみましょう。

 

問題点2

とりあえず、増えていく入出庫履歴に対応できるようになりました。

でも、リストボックスに入出庫履歴を表示(反映)させるには
ユーザーフォームを消して、またユーザーフォーム表示させなければなりません。
※初期化プログラムを動かすため

できれば、入出庫した際にリストボックスに入出庫履歴を
即反映してほしいですよね?

oReのぞき見

Call

・Call コォール

Callは、『呼ぶ』という意味みたいです。

 

Callは、作ったプログラム(プロシージャ)を呼び出せます。

Call プロシージャ名

 

プログラムを呼び出すと、呼び出されたプログラムが実行されます。

Call UserForm_Initialize

これで、ユーザーフォーム初期化(初期設定)を呼び出せます。

 

入出庫した際にリストボックスに入出庫履歴を即反映させるには、
どこに書けばいいかわかりますよね?

  ↓はい! ここに書きましょう。※出庫処理

'出庫処理
Private Sub CommandButton1_Click()
  Dim Knskcell As Range

  If TextBox1 = "" Then
    MsgBox "入出庫者名を入力してください。"
  ElseIf TextBox2 = "" Then
    MsgBox "バーコードデータを入力してください。"
  ElseIf TextBox3 = "" Then
    MsgBox "個数を入力してください。"
  Else
    Set Knskcell = Range("C:C").Find(what:=TextBox2, lookat:=xlWhole)
    If Knskcell Is Nothing Then
      MsgBox "部品が登録されていません。"
    Else
      Knskcell.Offset(0, 4) = Knskcell.Offset(0, 4) - TextBox3
      With Worksheets("入出庫履歴").Cells(Rows.Count, 2).End(xlUp)
        .Offset(1, 0) = Now
        .Offset(1, 1) = TextBox1
        .Offset(1, 2) = Knskcell.Offset(0, -1)
        .Offset(1, 3) = Knskcell.Offset(0, 1)
        .Offset(1, 4) = Knskcell.Offset(0, 2)
        .Offset(1, 5) = Knskcell.Offset(0, 3)
        .Offset(1, 6) = TextBox3 * 1
        .Offset(1, 7) = "出庫"
      End With
      Call UserForm_Initialize 'ユーザーフォームを初期化するよ
    End If
  End If
End Sub

 

プログラムは上から下へ処理していきます。

なので、入出庫履歴に出力したあとに書いてあげれば即反映されます。

動作確認してみてください。
ちゃんと入出庫後に、リストボックスに入出庫履歴が即反映されてますか?

oReのぞき見

※Callを付けなくても呼び出せるするみたいですが、
Callを付けたほうがわかりやすいですよね。
なんか呼び出してるみたいな感じで。

 

まとめ

最終セルの行を取得
.Cells(Rows.Count, 9).End(xlUp).Row
プロシージャを呼ぶ Call プロシージャ名

リストボックスに入出庫履歴を表示してますが、
上から古い順で入出庫履歴が表示されてますよね?
できれば最新の入出庫履歴からみたくないですか?

オレグラミング画像

次回 最新の入出庫履歴から表示させるよ

ExcelVBA部品在庫管理【目次】へ戻る

コメント

タイトルとURLをコピーしました