Openしてますか? どうもoReです。
今回は、Workbook_Openプロシージャを使っていきます。
Workbook_Open
・Workbook ウァークブゥク ・Open オゥパァン
Workbook_Open なんとなくわかりますよね?
ワークブックを開いた時に処理されるプロシージャです。
このような、何かしらのイベントの時に動くプロシージャを
イベントプロシージャというらしいです。
では、Workbook_Openプロシージャを作りましょう。
・プロジェクト内のThisWorkbookをダブルクリック→オブジェクトのWorkbookを選択
→プロシージャのOpenを選択
Private Sub Workbook_Open()
'ここに部品不動日数処理を書くよ!!
End Sub
一応流れとして
① 1日の入出庫作業が終了する
② Bookを保存して閉じる
③ ルンルンで家に帰る
④ 翌日、嫌々会社に出勤する
⑤ 入出庫作業を開始する
⑥ Bookを開く ←ここ!! ここをトリガーとする!!
①へ戻る
という感じになりますな。
Bookを閉じなかったらどうするの?
ボタンでも作ればいいんじゃね!?(適当)
ちゃんとブックを開いた時に処理するか確認してみましょう。
↓こんな感じ
'ブックオープン処理
Private Sub Workbook_Open()
MsgBox "m(__)mおはようございます!!"
End Sub
ブックを保存して閉じ、ブックを開いてみてください。
ちゃんと、おはようございますと挨拶してくれますか?
とりあえずトリガーの準備が出来たので、部品不動日数を算出する
プログラムを作っていきましょう。
日付の間隔を取得する DateDiff
・Diff ディフ
Diffは、『2つのデータを比較』するみたいな感じらしいです。
DateDiff関数の構文
DateDiff(Interval As String, Date1, Date2)
引数値渡しを使いまくったあなたなら、構文見てどうやって使うか
何となくわかりますか?
何となくわかるならレベルが上がっている証拠です!! 多分…
・Interval インタァヴァル
Intervalは、『間隔』という意味みたいです。
DateDiff(間隔は文字列型でちょうだい!!, 日付をちょうだい!!, 日付をちょうだい!!)
DateDiffという関数の引数(Date1,Date2)に日付データを渡すと、
指定した間隔(Interval)の結果を返してくれます。
Interval指定文字 | 単位 |
“yyyy” | 年 |
“m” | 月 |
“d” | 日 |
色々指定できるから、その他はググってね。
とりあえず、部品管理№1のアサヒスーパードライで動作確認しますか。
アサヒスーパードライの最終入出庫年月日セルに『2019/12/1』と入力しておきましょう。
部品不動日数算出
↓こう書いてみましょう。
'ブックオープン処理
Private Sub Workbook_Open()
'部品不動日数算出
Sheet1.Cells(6, 17) = DateDiff("d", Sheet1.Cells(6, 16), Date)
End Sub
2019/12/1と現在日付の間隔を日数で返してね!! という感じです。
動作確認ですが、いちいちブックを開いたり閉じたりするのは面倒くさいので、
プロシージャ内のどこかを選択してSub/ユーザーフォームの実行ボタンを押しましょう。
Sub/ユーザーフォームの実行ボタン?の方はこちら→【VBA在庫管理#20】
部品不動日数のセルに日数が出力されていますか?
最終入出庫年月日やIntervalの所を変更して結果を見てみてね。
日付データか確認する IsDate
・Is イズ
Isは、『は(わ)』という意味みたいです。
最終入出庫年月日のセルに日付じゃなくて、数値を入れてみましたか?
数値がセルに入っているとよくわからのない結果が出力されます。
これは日付でなはない為、うまく算出できていない様です。
なので、最終入出庫年月日のセルデータが日付なのか確認する必要があります。
IsDate(確認したいデータ)
そのまんま、このデータは日付ですか? てな感じです。
日付の場合 True(真) を返してくれます。
日付でない場合 False(偽) を返してくれます。
・True トゥルゥー ・False フォールス ・Boolean ブゥーリアン
はい・いいえ、Yes・Noみたいな感じで、二者択一のデータ型
Boolean型となります。
では、試してみましょう。
'ブックオープン処理
Private Sub Workbook_Open()
Dim 日付かい As Boolean
日付かい = IsDate(Sheet1.Cells(6, 16)) '日付か確認
MsgBox 日付かい
'部品不動日数算出
Sheet1.Cells(6, 17) = DateDiff("d", Sheet1.Cells(6, 16), Date)
End Sub
最終入出庫年月日のセルに数値と日付を入力して
動作確認してみてください。
すべての部品不動日数を算出する
ブックを開いた時に、すべての部品不動日数を算出する
プログラムを書きましょう。
For文を使っていきますか。
↓こんな感じ
'ブックオープン処理
Private Sub Workbook_Open()
Dim i As Long, LastRow As Long
'部品不動日数算出
With Sheet1
LastRow = .Cells(Rows.Count, 2).End(xlUp).Row
For i = 6 To LastRow
If IsDate(.Cells(i, 16)) = True Then '日付の場合
.Cells(i, 17) = DateDiff("d", .Cells(i, 16), Date)
Else '日付ではない場合
.Cells(i, 17) = "算出不可"
End If
Next i
End With
End Sub
実際にブックを開いた時に処理されるか確認してみてください。
まとめ
DateDiff(間隔は文字列型でちょうだい!!, 日付をちょうだい!!, 日付をちょうだい!!)
IsDate(確認したいデータ)
次回 プログラムの手直しと、部品検索フォームをつくるよ
コメント