VBA открыть самый последний файл в папке - PullRequest
0 голосов
/ 12 сентября 2018

В папке есть несколько exel-файлов.Цель состоит в том, чтобы найти файл с самой высокой датой (в формате «Финансы» и «Формат» (LMD, «DDMMYY») & «.xls») и открыть его.Например, имена файлов: Fundings 270818, Fundings 110618, и самым последним будет первый.Приведенный ниже код приводит к ошибке, что «MyFile = Dir (MyPath, vbNormal)» пуст.

 Dim MyPath  As String
 Dim MyFile  As String
 Dim LatestFile  As String
 Dim LatestDate  As Date
 Dim LMD  As Date

 LMD = Date

 'Specify the path to the folder
 MyPath = "C:\Users\topal\Desktop\Spreaddeterminierung\Fundings " & Format(LMD, "DDMMYY") & ".xls"



 'Get the first Excel file from the folder
 MyFile = Dir(MyPath, vbNormal)

 'If no files were found, exit the sub
 If Len(MyFile) = 0 Then
     MsgBox "No Sir", vbExclamation
     Exit Sub
 End If

 'Loop through each Excel file in the folder
 Do While Len(MyFile) > 0

     'Assign the date/time of the current file to a variable
     LMD = Date

     'If the date/time of the current file is greater than the latest
     'recorded date, assign its filename and date/time to variables
     If LMD > LatestDate Then
         LatestFile = MyFile
         LatestDate = LMD
     End If

     'Get the next Excel file from the folder
     MyFile = Dir

 Loop

 'Open the latest file
 Workbooks.Open MyPath

 End Sub

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Ваш цикл от:

'Прокручивать каждый файл Excel в папке Do While Len (MyFile)> 0

 'Assign the date/time of the current file to a variable
 LMD = Date

 'If the date/time of the current file is greater than the latest
 'recorded date, assign its filename and date/time to variables
 If LMD > LatestDate Then
     LatestFile = MyFile
     LatestDate = LMD
 End If

 'Get the next Excel file from the folder
 MyFile = Dir

Это ничего не делает, поэтому вы получаете пустые значения или никаких действий.

Я рекомендую полностью изменить ваше мнение и попытаться реализовать что-то вроде этого:

vba поиск в папке и выбор файлов по имени

0 голосов
/ 12 сентября 2018

Вы можете зациклить папку и извлечь часть даты из строки и сохранить наибольшее значение для использования для идентификации файла. Следующее также применило маску файла "xlsx", которую вы можете удалить или изменить. Он использует регулярное выражение для поиска подходящих имен файлов в соответствии с указанным вами шаблоном.

Option Explicit

Public Sub GetLastestDateFile()
    Dim FileSys As Object, objFile As Object, myFolder As Object, strFile As String, dteFile As Long
    Const myDir As String = "C:\Users\User\Desktop\TestFolder"
    Set FileSys = CreateObject("Scripting.FileSystemObject")
    Set myFolder = FileSys.GetFolder(myDir)

    Dim fileName As String, tempDate As Long, fileMask As String

    dteFile = 0: fileMask = "xlsx"
    For Each objFile In myFolder.Files
        If FileSys.GetExtensionName(objFile.Path) = fileMask And ValidateFile(Split(objFile.Name, ".xlsx")(0)) Then
            tempDate = GetDateFromFileName(objFile.Name)
            Dim pseudoDate As String
            pseudoDate = ReArrange(tempDate)
            If pseudoDate > dteFile Then dteFile = pseudoDate
        End If
    Next objFile
    If Not tempDate = 0 Then Workbooks.Open (myDir & "\" & "Fundings " & Format$(ReArrange(dteFile), "000000") & "." & fileMask)
End Sub

Public Function ReArrange(ByVal tempDate As String) As String
    tempDate = Format$(tempDate, "000000")
    ReArrange = Format$(Right$(tempDate, 2), "00") & Format$(Mid$(tempDate, 3, 2), "00") & Format$(Left$(tempDate, 2), "00")
End Function

Public Function ValidateFile(ByVal fileName As String) As Boolean
    With CreateObject("VBScript.RegExp")
        .Global = True
        .MultiLine = True
        .Pattern = "Fundings\s\d{6}$"
        ValidateFile = .test(fileName)
    End With
End Function

Public Function GetDateFromFileName(ByVal fileName As String) As Date
    On Error GoTo errhand
    GetDateFromFileName = Split(Split(fileName, "Fundings ")(1), ".")(0)
    Exit Function
errhand:
    GetDateFromFileName = 0
End Function

Regex:

Попробуйте регулярное выражение здесь .

Пояснение:

Fundings\s\d{6}$
/
gm

Fundings соответствует буквам Fundings буквально (с учетом регистра)

\s соответствует любому пробелу (равен [\r\n\t\f\v ])

\d{6} соответствует цифре (равно [0-9])

{6} Квантор - соответствует ровно 6 раз

$ устанавливает положение в конце строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...