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