Есть ли способ открыть файл с известным именем в неизвестной папке с помощью VBA? - PullRequest
0 голосов
/ 06 августа 2020

Я запускаю серию отчетов каждый день, и они сохраняются в папке в зависимости от даты. Например: C: \ Users \ Desktop \ Test \ Current \ 2020 08 05 \ Report_Name 2020 08 05.xlsx

На следующий день я запускаю новые отчеты и перемещаю папку «2020 08 05» в Архив. Но новые отчеты извлекают данные из отчета за предыдущий день, поэтому мне нужно открыть его без указания имени папки с датой.

Я пробовал использовать подстановочный знак, но это не сработало.

    Sub OpenReport()
    Dim sFound As String
    Dim Path As String
    
    Path = "C:\Users\Desktop\Test\Current\*\"
    
    sFound = Dir(Path & "\Report_Name*.xlsx")
        If sFound <> "" Then
            Workbooks.Open Filename:=Path & "\" & sFound
        End If

End Sub

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Поскольку имя пути к файлу фиксировано, за исключением даты, просто сгенерируйте его:

Function yesterdayReport() As String
    Const sBasePath As String = "C:\Users\Desktop\Test\Current\"
    Dim sDT As String

sDT = Format(Date - 1, "yyyy mm dd")
yesterdayReport = sBasePath & sDT & "\Report_Name " & sDT & ".xlsx"
    
End Function

Если вам нужно найти предыдущий рабочий день с учетом выходных и праздничных дней, вы можете используйте одну из функций WorkDay.

Например:

Option Explicit
Function yesterdayReport() As String
    Const sBasePath As String = "C:\Users\Desktop\Test\Current\"
    Dim sDT As String, dt As Date
    Dim vHolidays
    
vHolidays = Array(#1/1/2020#, #7/4/2020#, #8/5/2020#)
dt = Application.WorksheetFunction.WorkDay(Date, -1, vHolidays)

sDT = Format(dt, "yyyy mm dd")
yesterdayReport = sBasePath & sDT & "\Report_Name " & sDT & ".xlsx"
    
End Function

Ваш аргумент holiday может быть либо жестко задан, как я показываю, либо получен из диапазона на листе.

Возможны варианты, если ваши выходные не суббота / воскресенье.

0 голосов
/ 06 августа 2020

Вы можете искать в каждой папке и подпапке указанное имя файла.

Мне лично нравится нерекурсивный подход, и я уже много раз находил ответ на этот вопрос "cor_blimeys", очень полезный.

L oop Через все подпапки с использованием VBA

В основном вы создаете новую коллекцию, перебираете файлы / папки в каталоге root, добавляя папки в коллекцию при обнаружении, а затем перебирать каждую подпапку в поисках имени файла.

Рекурсивные методы всегда слишком сильно задевают мой мозг, а нерекурсивный метод легче отлаживать и проходить через него. Биты, это просто личное мнение.

Так или иначе, читайте ссылку.

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