Определение даты и времени создания или последнего изменения любого файла в VBA Excel. Функция FileDateTime — описание, синтаксис, примеры.
Функция FileDateTime в VBA Excel
Описание
Определение функции FileDateTime:
Формат отображения даты и времени зависит от региональных настроек системы. Российский формат — dd.mm.yyyy h:nn:ss
.
Из наблюдений можно отметить, что функция FileDateTime, как правило, возвращает дату и время, которые отображаются в папке проводника справа от выбранного файла в столбце «Дата изменения» или «Дата», как на скриншоте из третьего примера.
Синтаксис
1 |
FileDateTime(pathname) |
pathname
— полное имя файла, включающее букву диска, вложенные папки и краткое имя файла с расширением.
Примеры с функцией FileDateTime
Пример 1
Есть файл «Отчет.xlsx» по адресу «C:\Users\Evgeniy\Desktop», который был изменен 13 августа 2022 г., 0:55:05 (окно «Свойства:Отчет.xlsx»). Проверяем, что будет отображено в информационном окне MsgBox при использовании переменных разного типа для присвоения значений, возвращенных функцией FileDateTime:
1 2 3 4 5 6 7 8 9 |
Sub Primer1() Dim d As Date, s As String, n As Double d = FileDateTime("C:\Users\Evgeniy\Desktop\Отчет.xlsx") MsgBox d 'Результат: 13.08.2022 0:55:05 s = FileDateTime("C:\Users\Evgeniy\Desktop\Отчет.xlsx") MsgBox s 'Результат: 13.08.2022 0:55:05 n = FileDateTime("C:\Users\Evgeniy\Desktop\Отчет.xlsx") MsgBox n 'Результат: 44786,0382523148 End Sub |
Пример 2
Примеры отображения в VBA Excel только даты, возвращенной функцией FileDateTime:
1 2 3 4 5 6 |
Sub Primer2() Dim d As Date d = FileDateTime("C:\Users\Evgeniy\Desktop\Отчет.xlsx") MsgBox Format(d, "Short Date") 'Результат: 13.08.2022 MsgBox Format(d, "dd.mm.yy") 'Результат: 13.08.22 End Sub |
Пример 3
Есть папка с файлами:
Необходимо из кода VBA Excel получить список файлов в папке «C:\Users\Evgeniy\Desktop\Новая папка», пройтись по списку файлов циклом For Each… Next и записать на активный рабочий лист следующую информацию:
- № п/п — в первый столбец со второй строки;
- имя файла — во второй столбец;
- дату и время изменения файла — в третий столбец;
- создать строку заголовков — «№ п/п», «Имя» и «Дата»;
- осуществить автоподбор ширины столбцов и добавить границы ячеек.
Для получения списка файлов в заданной папке будем использовать метод FileSystemObject.GetFolder:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
Sub Primer3() Dim myPath As String, myFolder As Folder, myFile As File, n As Integer 'Записываем в переменную myPath полное имя папки myPath = "C:\Users\Evgeniy\Desktop\Новая папка" 'Создаем новый экземпляр FileSystemObject Dim fso As New FileSystemObject 'Присваиваем переменной myFolder ссылку на объект Folder Set myFolder = fso.GetFolder(myPath) 'Проверяем, есть ли файлы в папке myFolder If myFolder.Files.Count = 0 Then MsgBox "В папке «" & myPath & "» файлов нет" Exit Sub End If 'Записываем номер по порядку в первый столбец активного листа, 'имя файла - во второй столбец, 'дату изменения файла - в третий столбец. For Each myFile In myFolder.Files n = n + 1 Cells(n + 1, 1) = n Cells(n + 1, 2) = myFile.Name Cells(n + 1, 3) = FileDateTime(myFile.Path) Next 'Заполняем строку заголовков With Cells(1, 1) .Value = "№ п/п" 'Автоподбор ширины столбца .EntireColumn.AutoFit 'Полужирное начертание .Font.Bold = True 'Выравнивание значения по центру .HorizontalAlignment = xlCenter End With With Cells(1, 2) .Value = "Имя" .EntireColumn.AutoFit .Font.Bold = True .HorizontalAlignment = xlCenter End With With Cells(1, 3) .Value = "Дата" .EntireColumn.AutoFit .Font.Bold = True .HorizontalAlignment = xlCenter 'Добавляем границы ячеек .CurrentRegion.Borders.LineStyle = True End With End Sub |
Результат работы кода:
Если сравнить дату и время изменения файлов в папке проводника и в таблице Excel, то можно заметить, что время изменения файла «Certificate.pdf» разнится на 1 час. Непонятно, почему это происходит, так как в свойствах файла также указано время изменения, как в папке проводника:
Именно из-за этого случая я добавил словосочетание как правило в утверждение, что функция FileDateTime возвращает дату и время, которые отображаются в папке проводника справа от выбранного файла в столбце «Дата изменения» или «Дата», что означает — возможны исключения.
Спасибо!
Попробую и отвечу обязательно.
Добрый день!
Воспользовался Вашим примером Нр 3.
Вставил код в лист, заменил полное имя, нажал проверить, а он ругается, выделяет
"..., myFolder As Folder..."
и"Sub Primer3()"
Что-то не так я сделал?
Добрый день!
Подключите библиотеку Microsoft Scripting Runtime (Tools >> References…).
Вечер добрый, Евгений!
Библиотеку Microsoft Scripting Runtime (Tools >> References…) не подключал, т.к. побоялся что в школьных ПК с этим будет проблема.
Получил результат, как у Вас показано на картинке в результате работы кода, но только с небольшими изменениями. Правильно это или нет не знаю, но работает.
Изменил в строках:
остальное в коде все осталось как у Вас в примере 3.
Это все здорово, но к нужному результату Я не продвинулся.
Как можно дополнить код, чтобы при обновлении даты (время) изменялся цвет ячейки (либо строки).
Это для того, чтобы было видно, какие файлы обновлены (изменены), а при нажатии на Имя файла (к каждому файлу будет привязана гиперссылка), цвет ячейки (либо строки) должен поменяться в исходное положение.
Вот, как то так.
Что-то придумать можно?
Константин, замените
на
А в модуль листа добавьте:
Евгений!
В Книгу записал код, чтобы при открытии записанный код уже сработал. Правильно записал?
Евгений, Вы супер МОЛОДЕЦ!
Код работает согласно пожеланий.
Еще один штрих добавить, если можно.
При запуске файла чтобы сработал этот код.
Евгений!
В определенную папку от исполнителей собираются файлы с постоянными именами.
Вы написали код, который нам подошел.
Теперь нам видно какие файлы обновились, далее мы нажимаем на гиперссылку данного файла, он открывается, данные таким способом обновляются, закрываем и работаем далее с основным документом (куда стекаются все данные).
Чтобы данные обновлялись БЕЗ открытия файлов, это реальность или фантастика, подскажите пожалуйста!
Для этого можно в ячейки, которые обновляются из закрытой книги, вставить формулы с указанием адреса книги:
Можно набрать знак =, выбрать ячейку в другой книге и нажать галочку ввода формулы. После закрытия другой книги, ее адрес добавится в формулу автоматически.
Добрый день Евгений!
Вы помогли с написанием кода. Работает он согласно пожеланий, но слишком долго открывается, если к нему прикрепить гиперссылку. Отдельным файлом работает быстро хорошо. Может есть вариант улучшить быстродействие по открытию этого файла через гиперссылку.
Код в Книге
Код на Листе
Код в Модуле
Здравствуйте, Константин!
Подключите временно библиотеку Microsoft Scripting Runtime. Сначала проверьте код как есть. Если не поможет, примените раннюю привязку объектов, как было у меня в примере. Если и это не поможет, тогда не знаю как ускорить.
Евгений!
Код в файле работает хорошо как нужно.
Вот только если к нему применить гиперссылку, файл открывается долго, но если удалить код из Книги
то файл запускается через гиперссылку быстро. Однако если разместить кнопку на Листе с кодом, то код работает ещё медленнее.
Без гиперссылок, все хорошо, вопросов нет.
Может есть другой выход?
Пожелания кода выдумывались для такой схемы:
Отчет1.xlsm -> Книга1.xls -> Книга1.xls -> Учёт.xls
У исполнителя два файла Отчет1.xlsm, Книга1.xls.
У меня два файла Книга1.xls, Учёт.xls.
Исполнитель: в Книга1.xls из Отчет1.xlsm данные поступают методом =…
Далее файл Книга1.xls исполнитель отправляет по Эл.почте мне. Я его закидываю в определённую папку с таким же именем с заменой.
Далее данные из Книга1.xls должны отобразится в основном файле Учёт.xls методом =…
Вот тут то и засада. Если у себя полученный файл не открою, данные не обновляются.
Поэтому такой код и собирали.
Может что-то или как-то переиграть с кодом?
Спасибо!
К сожалению, у меня нет решения.
Все равно, огромное Вам спасибо. И так во многом помогли.
Спасибо!
Обсуждение закрыто.