2021年11月19日金曜日

二つの関数の組み合わせで、時間を把握しながらブックの使えない時間を判断させてしまおうというアイデア ー Format(Now)(VBA)

インド、ムンバイ中央駅
   
以前の投稿で、メインフレームから出力されたデータの加工を取り上げました。
その時は、自動実行を二段階処理するのに必要なイベントプロシージャでした。

Workbook_OpenとAuto_Openですが、このアプリはひとまず完成しました。
ただ、アプリで特定の時間には、データを読み出りだせない要望が出たんだな。

なぜかというと、メインフレームは、CSVデータを午前と午後に出力します。
その時刻も想定されましたが、その前後は、ファイルを開かせたくありません。

つまり、出力後にデータを加工し、標準のエクセルファイルに再出力する工程。
データもエクセルファイルも上書きされるので、アクセス禁止をしておきたい。

その最中に、不用意なファイル使用で、不具合が起きないようにする工夫です。
なので、その対策を考えるようにとのお達しで、頭をひねることになりました。

簡単なのは、出力されたデータを開いてくるプログラムを使ってもらうことだ。
この中に、条件選択で午前と午後の指定時間に、ブックを開くのを禁止します。

すぐ思いついたのは、ブックを開くと自動実行で、その時間を速攻判断します。
これに余裕を見て、二十分間はブックを開いても閉じてしまう段取りもしたな。

使用したのはFormat関数で、Now関数と組み合わせて現在の時間を出力する。
ただ、出力結果が文字列型 [String] に変換されているので、数値化も必要です。

時間は、文字列の”7”や”11”でも判断できるけど、分はVal関数で数値変換した。
もっとも、時分秒の”hhmmss”という出力しか得られないので抽出も必要です。

これにはMid関数も使ったんだけど、こういった組み合わせでプログラムした。
加えて、時刻で午前と午後を判断するのに、Format(Time, "AM/PM")の活用。

こうして、午前と午後を条件分岐式(Select Case)で分けてから判別します。
次に、参考までにプログラムを挙げますので、興味があれば使ってみて下さい。

Private Sub Workbook_Open()
Select Case Format(Time, "AM/PM")
Case "AM" 
If Left(Format(Now, "hhmmss"), 2) = "7" And Val(Mid(Format(Now, "hhmmss"), 3, 2)) > 50 Then GoTo Skip
If Left(Format(Now, "hhmmss"), 2) = "8" And Val(Mid(Format(Now, "hhmmss"), 3, 2)) < 10 Then GoTo Skip
Case "PM" 
If Left(Format(Now, "hhmmss"), 2) = "12" And Val(Mid(Format(Now, "hhmmss"), 3, 2)) > 50 Then GoTo Skip
If Left(Format(Now, "hhmmss"), 2) = "13" And Val(Mid(Format(Now, "hhmmss"), 3, 2)) < 10 Then GoTo Skip
End Select
GoTo ToPrcdre
Skip:
MsgBox "時間外で閉じます"
Application.Quit  'ブックを閉じる処理
ThisWorkbook.Close SaveChanges:=False
ToPrcdre:
Call ”プロシージャ”
End Sub

注1:7または12時50分~8または13時10分の間は、時間外でブックを閉じる
注2:Format(Now)は、文字列の値になるのに注意、数値の変換はValを使う

というわけで、この設定だけでは飽き足らず、データの再加工も工夫しました。
こうして、結構、大掛かりなプログラムになったのですが、社内の従業員が使用する約束で、このプログラムを使わずに階層の深いフォルダにあるデータを読み取りに行こうとする不心得者はいないだろうという、性善説なのでした。



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



0 件のコメント:

コメントを投稿