台風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
とりあえず、増えていく入出庫履歴に対応できるようになりました。
でも、リストボックスに入出庫履歴を表示(反映)させるには
ユーザーフォームを消して、またユーザーフォーム表示させなければなりません。
※初期化プログラムを動かすため
できれば、入出庫した際にリストボックスに入出庫履歴を
即反映してほしいですよね?
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
プログラムは上から下へ処理していきます。
なので、入出庫履歴に出力したあとに書いてあげれば即反映されます。
動作確認してみてください。
ちゃんと入出庫後に、リストボックスに入出庫履歴が即反映されてますか?
※Callを付けなくても呼び出せるするみたいですが、
Callを付けたほうがわかりやすいですよね。
なんか呼び出してるみたいな感じで。
まとめ
.Cells(Rows.Count, 9).End(xlUp).Row
リストボックスに入出庫履歴を表示してますが、
上から古い順で入出庫履歴が表示されてますよね?
できれば最新の入出庫履歴からみたくないですか?
次回 最新の入出庫履歴から表示させるよ
コメント