VBSについて質問です。

ファイル更新の監理を行いたいと思っています。
そこで以下のプログラムをりようしましたが、カスタマイズしたいと思っております。
・更新された数だけポップアップされるので、
 ポップアップを閉じたら一つのポップアップだけにしたい。
・更新者と更新時間をポップアップに表示したい
-------------------
ソースは別途

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2016/02/09 15:05:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:japan-nan

-------------------

' 監視するファイルの設定

fil_path = "C:\Users\tar-t-05866f\Desktop\vbaテスト\1234.xlsx"

Set fso = CreateObject("Scripting.FileSystemObject")

' (変更前)ファイルの更新日時の取得

file_dtm1 = ""

If fso.FileExists(fil_path) Then

file_dtm1 = fso.GetFile(fil_path).DateLastModified

End If

Do

WScript.Sleep(1000) ' VBSの時

'Sleep 1000: DoEvents ' VBAの時

' (変更後)ファイルの更新日時の取得

file_dtm2 = ""

If fso.FileExists(fil_path) Then

file_dtm2 = fso.GetFile(fil_path).DateLastModified

End If

' 変更前後のファイル更新日時を比較

If file_dtm1 <> file_dtm2 Then

If file_dtm1 <> "" And file_dtm2 <> "" Then

MsgBox "変更されました"

ElseIf file_dtm1 <> "" Then

MsgBox "削除されました"

Else

MsgBox "追加されました"

End If

End If

' 変更後日時を変更前日時として設定

file_dtm1 = file_dtm2

Loop

Set fso = Nothing

-------------------

ベストアンサー

id:braahmaNa No.1

回答回数23ベストアンサー獲得回数9

ポイント300pt

新たに何もインストールしないとこんな感じですね…
このBuiltinDocumentProperties.Itemプロパティ使うためには、
自分が対象のエクセルファイルを開いていないとエラーになるので強制的に開いています。
また、自分が対象ファイルを新たに開いたり閉じたりするとスクリプトからファイルへの接続が切られてしまいます。
この辺はちょっとどうにも出来なかったですね…

因みにネットワーク越しに他人が編集する場合は大丈夫です。
(ファイル削除、リネーム等のファイルの存在判定に関わる場合を除く)
また、ネットワーク越しに編集された場合にFileSystemObjectのDateLastModifiedを使うと、
正確な日時にならない場合が有るようなのでBuiltinDocumentPropertiesの値に変更しています。
なるべく元の形を残して編集はしていますので、
細かい挙動はjapan-nanさんの使いやすい様に編集して下さい。

新たにDsoっていうActiveXコンポーネント入れるともっとスマートにいけるかも知れません。
https://support.microsoft.com/ja-jp/kb/224351





' 監視するファイルの設定
fil_path = "C:\Users\tar-t-05866f\Desktop\vbaテスト\1234.xlsx"

Set fso = CreateObject("Scripting.FileSystemObject")

' ファイルが存在しなければ強制終了
If not fso.FileExists( fil_path ) Then
MsgBox fil_path & "が存在しません"
Set fso = Nothing
WScript.Quit()
End If

' excelファイルが開いている事が前提なので強制的にOpen
Set excel = CreateObject( "Excel.Application" )
excel.Workbooks.Open( fil_path )

' falseにするとexcel非表示
' 自分自身が編集しない(このファイルを新たに開かない)場合のみ
excel.Visible=true

' Workbookオブジェクト取得
Set excel_object = GetObject( fil_path )

' プロパティのキー名
key_last_author = "Last Author"
key_last_save_time = "Last Save Time"

file_dtm1 = ""
If fso.FileExists(fil_path) Then
' (変更前)ファイルの更新日時の取得
file_dtm1 = excel_object.BuiltinDocumentProperties.Item( key_last_save_time )
End If

Do
WScript.Sleep(1000) ' VBSの時
'Sleep 1000: DoEvents ' VBAの時
file_dtm2 = ""
If fso.FileExists(fil_path) Then
' (変更後)ファイルの更新日時・前回保存者の取得
last_author = excel_object.BuiltinDocumentProperties.Item( key_last_author )
file_dtm2 = excel_object.BuiltinDocumentProperties.Item( key_last_save_time )
End If
' 変更前後のファイル更新日時を比較
If file_dtm1 <> file_dtm2 Then
If file_dtm1 <> "" And file_dtm2 <> "" Then
MsgBox "変更されました" & vbcrlf & "更新者:" & last_author & vbcrlf & "更新日時:" & file_dtm2
ElseIf file_dtm1 <> "" Then
MsgBox "削除されました"
Else
MsgBox "追加されました"
End If
End If
' 変更後日時を変更前日時として設定
file_dtm1 = file_dtm2
Loop

Set fso = Nothing

その他の回答0件)

id:braahmaNa No.1

回答回数23ベストアンサー獲得回数9ここでベストアンサー

ポイント300pt

新たに何もインストールしないとこんな感じですね…
このBuiltinDocumentProperties.Itemプロパティ使うためには、
自分が対象のエクセルファイルを開いていないとエラーになるので強制的に開いています。
また、自分が対象ファイルを新たに開いたり閉じたりするとスクリプトからファイルへの接続が切られてしまいます。
この辺はちょっとどうにも出来なかったですね…

因みにネットワーク越しに他人が編集する場合は大丈夫です。
(ファイル削除、リネーム等のファイルの存在判定に関わる場合を除く)
また、ネットワーク越しに編集された場合にFileSystemObjectのDateLastModifiedを使うと、
正確な日時にならない場合が有るようなのでBuiltinDocumentPropertiesの値に変更しています。
なるべく元の形を残して編集はしていますので、
細かい挙動はjapan-nanさんの使いやすい様に編集して下さい。

新たにDsoっていうActiveXコンポーネント入れるともっとスマートにいけるかも知れません。
https://support.microsoft.com/ja-jp/kb/224351





' 監視するファイルの設定
fil_path = "C:\Users\tar-t-05866f\Desktop\vbaテスト\1234.xlsx"

Set fso = CreateObject("Scripting.FileSystemObject")

' ファイルが存在しなければ強制終了
If not fso.FileExists( fil_path ) Then
MsgBox fil_path & "が存在しません"
Set fso = Nothing
WScript.Quit()
End If

' excelファイルが開いている事が前提なので強制的にOpen
Set excel = CreateObject( "Excel.Application" )
excel.Workbooks.Open( fil_path )

' falseにするとexcel非表示
' 自分自身が編集しない(このファイルを新たに開かない)場合のみ
excel.Visible=true

' Workbookオブジェクト取得
Set excel_object = GetObject( fil_path )

' プロパティのキー名
key_last_author = "Last Author"
key_last_save_time = "Last Save Time"

file_dtm1 = ""
If fso.FileExists(fil_path) Then
' (変更前)ファイルの更新日時の取得
file_dtm1 = excel_object.BuiltinDocumentProperties.Item( key_last_save_time )
End If

Do
WScript.Sleep(1000) ' VBSの時
'Sleep 1000: DoEvents ' VBAの時
file_dtm2 = ""
If fso.FileExists(fil_path) Then
' (変更後)ファイルの更新日時・前回保存者の取得
last_author = excel_object.BuiltinDocumentProperties.Item( key_last_author )
file_dtm2 = excel_object.BuiltinDocumentProperties.Item( key_last_save_time )
End If
' 変更前後のファイル更新日時を比較
If file_dtm1 <> file_dtm2 Then
If file_dtm1 <> "" And file_dtm2 <> "" Then
MsgBox "変更されました" & vbcrlf & "更新者:" & last_author & vbcrlf & "更新日時:" & file_dtm2
ElseIf file_dtm1 <> "" Then
MsgBox "削除されました"
Else
MsgBox "追加されました"
End If
End If
' 変更後日時を変更前日時として設定
file_dtm1 = file_dtm2
Loop

Set fso = Nothing

  • id:braahmaNa
    Excelファイルの更新者(前回保存者)で良いんですか?
    普通のテキストファイルとかだとこの情報は持ってない筈なので。
    あとポップアップを一つの意味がよく分からないです…
    ポップアップが出ている状態で、新たにファイルが更新された場合は、新しい更新に関するポップアップは出さないという事ですか?
  • id:jan8
    braahmaNaさんと同じ疑問を持ってます。

    ソースを実行してみましたが、対象ファイルを複数回更新しても、ポップアップは一つしか出ませんよ。
    (Msgboxはデフォルトでモーダルなので、表示中はスクリプトが停止している)

    ポップアップが出ている状態で、新たにファイルが更新された場合、
    出ているポップアップに応答して閉じると、1秒後に新たなポップアップが出ます。
  • id:japan-nan
    大変失礼しました!ごめんなさい。
    ポップアップが複数表示されるのは思い違いでした。
    ポップアップに前回保存者と前回保存日時がわかるとありがたいです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません