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

#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