1

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

Sub Test()
Dim dtCutOff
Dim File
Dim filespec
Dim fso
Dim f

dtCutOff=DateAdd("n", -20, Now) 'беру текущее время минус 20 минут

File="18.06.2020_00.09.03_volume.xlsx" 'сам файл filespec="D:\Report_3d"&File 'путь к файлу Set fso=CreateObject("scripting.filesystemobject") Set f=fso.GetFile(filespec)

If f.DateLastModified > dtCutOff Then                 'проверяю время модификации файла с текущем временем -20 мин
MsgBox "Файл " &f.Name& " изменён позднее "&dtCutOff  'если были изменения файла, то вывожу MsgBox
End If 

Set f=Nothing Set fso=Nothing

End Sub

Есть кусочек скрипта, который по маске находит все файлы в папке с расширением .xlsx и выводит поочередно названия файлов в MsgBox

Sub Mask()
Dim objShellApp
Dim objFolder
Dim objFolderItems
Dim file
Dim oFSO

Set oFSO = CreateObject("Scripting.FileSystemObject")

Set objShellApp = CreateObject("Shell.Application") Set objFolder = objShellApp.NameSpace("D:\Report_3d") Set objFolderItems = objFolder.Items() objFolderItems.Filter 64+128, "*.xlsx" For Each file In objFolderItems

MsgBox file

Next End Sub

На следующем шаге я видимо делаю ошибку, и с этим мне нужна помощь. Далее я пытаюсь обратиться к переменной File и функцией GetFile пытаюсь получить атрибуты файла, сравнить время изменения, и, если все ок, то выдать MsgBox. Но это не работает. И я не могу найти информации по этому вопросу, прошу помощи и указания на ошибки

Sub Mask()
Dim objShellApp
Dim objFolder
Dim objFolderItems
Dim file
Dim oFSO    
Dim dtCutOff
Dim filespec
Dim f

dtCutOff=DateAdd("n", -20, Now)

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set objShellApp = CreateObject("Shell.Application")

Set objFolder = objShellApp.NameSpace("D:\Report_3d") Set objFolderItems = objFolder.Items() objFolderItems.Filter 64+128, "*.xlsx"

For Each file In objFolderItems

Set f=oFSO.GetFile(file) 
If f.DateLastModified > dtCutOff Then

MsgBox "Файл " &f.Name& " изменён позднее "&dtCutOff End If

Next

Set f=Nothing Set oFSO=Nothing

End Sub

Такой вариант тоже не приносит результата:

For Each file In objFolderItems
If file.DateLastModified > dtCutOff Then

MsgBox "Файл " &file& " изменён позднее "&dtCutOff End If

Next

  • У меня есть рабочий скрипт, который работает с файлом, у которого явно указано его имя Что мешает преобразовать это в процедуру, которая принимает имя файла (и, возможно, каталог - или полное имя), и вызывать её в ForEach? – Akina Jun 23 '20 at 04:29
  • Дело в том, что я не могу знать полное имя файла. Это файл отчёта с прибора, который внутри всегда одинаковый, а название какое-то рандомное. Поэтому и ищу по маске xlsx файлы. Каким образом можно преобразовать тогда? – Cotton Pericranium Jun 23 '20 at 04:53
  • Дело в том, что я не могу знать полное имя файла. Ну уже ж есть код, который "по маске находит все файлы в папке с расширением .xlsx и выводит поочередно названия файлов в MsgBox" (кстати, в нём нет упоминания MsgBox, но не суть) - вот что мешает вместо MsgBox выполнить соответствующий Call? И да - незачем генерить на каждый чих свой FSO, используйте уже существующий. – Akina Jun 23 '20 at 05:09

1 Answers1

0

Все оказалось проще. Не уверен, что это правильный вариант, но он работает. Я использовал метод GetFile не в том виде. Методом тыка обнаружил, что следующий код оказался рабочим и это то, что мне нужно

For Each file In objFolderItems
Set oFileInfo = oFSO.GetFile("D:\Report_3d\"&file.Name)

If oFileInfo.DateLastModified > dtCutOff Then

MsgBox "Файл " &oFileInfo.Name& " изменен позднее "&dtCutOff End If