#vba #loops #file
#vba #циклы #файл
Вопрос:
Вот моя проблема, на моем листе Excel я указываю пути к каждой папке, которую я хочу проверить
V:Folder1
V:Folder2
Внутри этой папки я хочу, чтобы vba дал мне имя последнего измененного файла на основе определенного имени.
Я приведу пример:
В моей папке 1 у меня есть эти файлы :
Lo_2021_1
Lo_Full_2021_1
Lo_2021_2
Lo_Full_2021_2
...
Lo_2021_50
Lo_Full_2021_50
В моей папке 2 у меня есть эти файлы :
Li_2021_1
Li_Full_2021_1
Li_2021_2
Li_Full_2021_2
...
Li_2021_50
Li_Full_2021_50
Я хочу, чтобы vba дал мне имя последнего измененного файла, которое начинается с Lo_2021
в моей папке 1 и Li_2021
в моей папке 2 (поэтому я не хочу Lo_Full
и Li_Full
)
Я уже создал код, который дал мне имя последних измененных файлов, но они Lo_Full_2021_50
и Li_Full_2021_50
в то время как я хочу Lo_2021_50
и Li_2021_50
Вот мой код :
Option Explicit
Sub name_last_file()
Dim FileSys As FileSystemObject
Dim objFile As File
Dim myFolder
Dim strFilename As String
Dim dteFile As Date
Dim list_path As Range
Dim path_ As Range
Dim myDir As String
Set list_path = Range("B2", Range("B2").End(xlDown))
For Each path_ In list_path
myDir = path_.Value
'set up filesys objects
Set FileSys = New FileSystemObject
Set myFolder = FileSys.GetFolder(myDir)
'loop through each file and get date last modified. If largest date then store Filename
dteFile = DateSerial(1900, 1, 1)
For Each objFile In myFolder.Files
If objFile.DateLastModified > dteFile Then
dteFile = objFile.DateLastModified
strFilename = objFile.Name
End If
Next objFile
MsgBox strFilename
Next path_
End Sub
Это даст мне Lo_Full_2021_50
и Li_Full_2021_50
, в то время как я хочу Lo_2021_50
и Li_2021_50
.
Есть ли способ сказать, что я хочу, чтобы последний измененный файл начинался с Lo_2021
или Li_2020
, чтобы я получил Lo_2021_50
и Li_2021_50
в результате?
Я действительно благодарен за вашу помощь
Комментарии:
1. Ваш код никоим образом не фильтрует имена проверенных файлов. Вы должны использовать, на самом деле, я опубликую обновленный код, чтобы вернуть то, что (я понял) вам нужно…
2. Я удивлен, что ваш код вообще компилируется! Что вам
path_.values
дает? Вы имеете в видуpath_.Value
? Пожалуйста, попробуйте скопировать и вставить свой код, а не вводить его (или его части).3. Привет, прошу прощения за это. Да, я имею в виду путь. Значение, я отредактировал код, вставив его. Спасибо за ваше замечание
Ответ №1:
Пожалуйста, протестируйте следующий обновленный код:
Sub Give_name_files()
Dim FileSys As FileSystemObject, objFile As File, myFolder As oobject
Dim strFilename As String, dteFile As Date, list_path As Range, path_ As Range
Dim strRoot As String
strRoot = "Lo_2021" 'the beginning of the tested files name
'First I Select paths that are on my excel cells
Set list_path = Range("B2", Range("B2").End(xlDown))
For Each path_ In list_path
myDir = path_.Value
'Set up filesys objects
Set FileSys = New FileSystemObject
Set myFolder = FileSys.GetFolder(myDir)
'loop through each file and get date last modified. If largest date then store Filename
dteFile = DateSerial(1900, 1, 1)
For Each objFile In myFolder.Files
If left(objFile.Name, Len(strRoot)) = strRoot Then
If objFile.DateLastModified > dteFile Then
dteFile = objFile.DateLastModified
strFilename = objFile.Name
End If
End If
Next objFile
MsgBox strFilename
Next path_
End Sub
Комментарии:
1. Большое спасибо за вашу помощь, но есть еще одна проблема, которую нужно решить. Здесь мы берем strRoot = «Lo_2021», который находится в моей папке1 (V:Folder1 ) и я также должен посмотреть на «Li_2021», который находится в моей Папке2 (V:Folder2 ) . Это основная проблема, потому что я думал о создании цикла, но это даст 4 случая: Lo_2021_50 и пустой для Folder1 и пустой и Li_2021_50 для Folder2