Вы можете попробовать использовать регулярные выражения для сопоставления с образцом файлов в данной папке. Выполните небольшую манипуляцию со строками, чтобы сохранить только часть даты в строках, затем используйте sortedList для упорядочивания соответствующих имен файлов. Затем выберите последний элемент из упорядоченного списка как последнее имя файла.
Option Explicit
Public Sub GetLastestFile()
Const PATH As String = "C:\Users\User\Desktop\Testing"
Dim fso As Object, oFolder As Object, oFile As Object, list As Object, tempString As String
Set list = CreateObject("System.Collections.SortedList")
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(PATH)
For Each oFile In oFolder.Files
If IsFound(oFile.Name) Then
tempString = Replace$(Left$(oFile.Name, 7), ".", vbNullString)
With list
If Not .contains(tempString) Then
.Add tempString, vbNullString
End If
End With
End If
Next
Debug.Print list.Getkey(list.Count - 1)
End Sub
Public Function IsFound(ByVal inputString As String) As Boolean
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
With re
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "\d{4}.\d{2}\sfinal.xlsx"
IsFound = .test(inputString)
End With
End Function
Вы можете попробовать регулярное выражение здесь .
Regex объяснение:
\ д {4}. \ Д {2} \ sfinal.xlsx
\ d {4} соответствует цифре (равно [0-9])
{4} Квантификатор - соответствует ровно 4 раза
. соответствует любому символу (кроме ограничителей строки)
\ d {2} соответствует цифре (равно [0-9])
{2} Квантификатор - соответствует ровно 2 раза
\ s соответствует любому пробелу (равен [\ r \ n \ t \ f \ v])
final соответствует буквам символов final (с учетом регистра)
, соответствует любому символу (кроме ограничителей строки)
xlsx соответствует символам xlsx буквально (с учетом регистра)
Использование класса
Еще лучше было бы реализовать класс для регулярного выражения, имеющий метод IsFound
. Это позволит избежать постоянного создания и уничтожения объекта регулярных выражений. Вместо этого он будет создан с использованием экземпляра класса, а затем только методом, вызываемым как требуется.
Если вы создаете класс с именем RegexFileMatch
, введите следующий код:
Option Explicit
Private re As Object
Private Sub Class_Initialize()
Set re = CreateObject("VBScript.RegExp")
End Sub
Public Function IsFound(ByVal inputString As String) As Boolean
With re
.Global = True
.MultiLine = True
.IgnoreCase = False
.Pattern = "\d{4}.\d{2}\sfinal.xlsx"
IsFound = .test(inputString)
End With
End Function
Затем измените код вызова в стандартном модуле на:
Option Explicit
Public Sub GetLastestFile()
Const PATH As String = "C:\Users\User\Desktop\Testing"
Dim fso As Object, oFolder As Object, oFile As Object, list As Object, tempString As String
Set list = CreateObject("System.Collections.SortedList")
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(PATH)
Dim regex As New regexFileMatch
For Each oFile In oFolder.Files
If regex.IsFound(oFile.Name) Then
tempString = Replace$(Left$(oFile.Name, 7), ".", vbNullString)
With list
If Not .contains(tempString) Then
.Add tempString, vbNullString
End If
End With
End If
Next
Debug.Print list.Getkey(list.Count - 1)
End Sub
Это становится дешевле.