Вопрос по events, filesystemwatcher, ms-office, vba – Как узнать, когда файл был изменен в макросе VBA?

2

Есть ли способ просмотреть файл в VBA (который по сути является VB6), чтобы я знал, когда файл был изменен? -- похожий наэтот только я нене хочу знать, когда файлнеиспользуемый, только когда егомодифицирована.

Ответы, которые янашел рекомендовал использовать "FileSystemWatcher» и Win32 API "FindFirstChangeNotification», Я могу'Не могу понять, как их использовать, есть идеи?

Ваш Ответ

3   ответа
1

Вот, На странице есть "Смотреть каталог Демо " Образец VB, Брайан Стаффорд.

1

ля WMI для просмотра файла в соответствии с предлагаемымиВот но сузив его до определенного файла вместо папки

(Это при условии, что вы можетепросто следить за файломs Дата изменения свойства ..)

2

я собрал решение, способное обнаруживать изменения файловой системы, в VBA (VB6).

Public objWMIService, colMonitoredEvents, objEventObject

'call this every 1 second to check for changes'
Sub WatchCheck()
On Error GoTo timeout
    If objWMIService Is Nothing Then InitWatch 'one time init'
    Do While True
        Set objEventObject = colMonitoredEvents.NextEvent(1) 
         '1 msec timeout if no events'
        MsgBox "got event"

        Select Case objEventObject.Path_.Class
            Case "__InstanceCreationEvent"
                MsgBox "A new file was just created: " & _
                    objEventObject.TargetInstance.PartComponent
            Case "__InstanceDeletionEvent"
                MsgBox "A file was just deleted: " & _
                    objEventObject.TargetInstance.PartComponent
            Case "__InstanceModificationEvent"
                MsgBox "A file was just modified: " & _
                    objEventObject.TargetInstance.PartComponent
        End Select
    Loop
Exit Sub
timeout:
    If Trim(Err.Source) = "SWbemEventSource" And Trim(Err.Description) = "Timed out" Then
        MsgBox "no events in the last 1 sec"
    Else
        MsgBox "ERROR watching"
    End If
End Sub

Скопируйте и вставьте этот сабвуфер рядом с вышеупомянутым, он вызывается автоматически при необходимости для инициализации глобальных переменных.

Sub InitWatch()
On Error GoTo initerr
    Dim watchSecs As Integer, watchPath As String
    watchSecs = 1 'look so many secs behind'
    watchPath = "c:\\\\scripts" 'look for changes in this dir'

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
        ("SELECT * FROM __InstanceOperationEvent WITHIN " & watchSecs & " WHERE " _
            & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _
                & "TargetInstance.GroupComponent= " _
                    & "'Win32_Directory.Name=""c:\\\\scripts""'")

    MsgBox "init done"
Exit Sub
initerr:
    MsgBox "ERROR during init - " & Err.Source & " -- " & Err.Description
End Sub

Похожие вопросы