1

vbscript を使用して、Excel オブジェクトを作成し、ユーザーがファイルを開いて保存した後、ファイル内のデータを確認できるようにしたいと考えています。WaitForChangedResult を使用して、ファイルがあるディレクトリを監視し、変更されるのを待ってから続行しようとしましたが、ファイルが保存されたときではなく、保存せずに閉じられたときにのみ移動します。そのコードは次のようになります。

Dim xl As Object
xl = CreateObject("excel.application")
xl.FileDialog(1).AllowMultiSelect = False
xl.FileDialog(1).Title = "Navigate to 60-40 loan calculator"
Dim strFilePathAndName As String
If xl.FileDialog(1).Show() = -1 Then
    strFilePathAndName = xl.FileDialog(3).SelectedItems(1)
Else
    Exit Sub
End If
xl.Visible = True
xl.Workbooks.Open(strFilePathAndName)
Dim strXLTab As String
strXLTab = xl.ActiveSheet.Name


Dim result As System.IO.WaitForChangedResult
Dim directory As String
directory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
Dim watcher As New System.IO.FileSystemWatcher(directory, "Calculator.xls")
result = watcher.WaitForChanged(System.IO.WatcherChangeTypes.Changed)
TextBox1.Text = directory

これを行うより良い方法はありますか?

4

1 に答える 1

0

次のコードを使用して、ファイルの変更を監視できます。

ファイルが変更/作成/削除されたときに必要なアクションを実行するには、Wscript.echo コマンドの代わりにコードを置き換えるだけです。

' Monitors a file for modifications.
Dim intTimer:        intTimer = "2"
Dim strDrive:        strDrive = "c:"
Dim strPath:         strPath = "\\temp\\"
Dim strFile:         strFile = "log.txt"
Dim strComputer:     strComputer = "."
Dim objWMIService:   Set objWMIService = GetObject( "winmgmts:" &  "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2" )
Dim strQuery:        strQuery = "Select * From __InstanceOperationEvent" & " Within " & intTimer & " Where Targetinstance Isa 'CIM_DataFile'" & " And TargetInstance.Drive='" & strDrive & "'" & " And TargetInstance.Path='" & strPath & "'"
Dim colEvents:       Set colEvents = objWMIService. ExecNotificationQuery (strQuery)
WScript.Echo "Monitoring file changes... Press [Ctrl]-[C] to exit"
Do
    Set objEvent = colEvents.NextEvent()
    Set objTargetInst = objEvent.TargetInstance
    if right(objTargetInst.Name,len(strFile)) = strFile then
        Select Case objEvent.Path_.Class
            Case "__InstanceCreationEvent"
                WScript.Echo "Created: " & objTargetInst.Name
            Case "__InstanceDeletionEvent"
                WScript.Echo "Deleted: " & objTargetInst.Name
            Case "__InstanceModificationEvent"
                WScript.Echo "Modified: " & objTargetInst.Name
        End Select
    end if
Loop

これをWscript で実行すると表示されないか、Cscript で実行しコンソール ウィンドウで表示できるようにします。

于 2012-10-13T23:27:01.140 に答える