Открыть файл, используя сопоставление с образцом vba

У меня проблема с открытием файла с использованием сопоставления с образцом. Цель - открыть файл с таким шаблоном: extraction _ 20180630 _ Data - Updated.Xlsx. Эта часть имени файла: 201806 устанавливается пользователями через функцию поля ввода с использованием переменных в виде текста. Цель состоит в том, чтобы открыть этот файл, зная, что даты могут меняться в зависимости от цели, выбранной пользователями (год и месяц).

Вот мой код:

Sub OpenFile 
    Dim Directory As Text
    Dim File As Text 
    Dim MainPath As Text
    Dim Y As Text
    Dim M As Text 

    Directory = "C:\Desktop\Folder\"

    Y = InputBox  ("Please Choose your target Year such as 2017")
    M = InputBox ("Please Choose your target Month such as 06 for June")

    ' File name format = "extraction _ 20180630 _ Data - Updated _V5.2.xlslx"
    File = "extraction _" &  Y  & M 
    MainPath = Directory  & File 
    Filename = Dir (MainPath & "*_ Data - Updated _*")

    On Error  Resume Next

    ' after several Checking, the MainPath is Correct. the issue is whithin the second part 
    Workbooks.Open MainPath & Filename

    If Err.Number = 1004
        MsgBox " The file was not found"
        Err.Clear
        Application.DisplayAlerts = False
        Application.Quit 
     End If
End Sub 

Как вы понимаете, этот код генерирует

error 1004

и я проверил правильный основной путь. Проблема связана со второй частью имени файла, как следует за *_ Data - Updated _*)

Как я могу это решить?

Если вы добавите MsgBox MainPath & "|" & Filename в свой код, какой путь и имя файла на самом деле пытается открыть? Это может помочь вам найти, в какой строке находится ошибка.

Chronocidal 10.09.2018 12:01

Использование пробелов (``) в именах файлов - почти всегда плохая идея.

Luuklag 10.09.2018 12:21

Думаю, проблема в том, что вторая часть не учитывается тем, что начинается с "*". обычно я использую эти термины «*» с некоторыми моментами до того, как вы узнаете.

DataScientist 10.09.2018 12:22

@Luuklag. Я знаю это, но это не мой выбор. Приходится обрабатывать вот таким форматом с пробелом :(

DataScientist 10.09.2018 12:24

Возможный дубликат Открытие файла, имя которого содержит пробел

Luuklag 10.09.2018 12:27

@Chronocida. MsgBox Показать следующее: C: \ Desktop \ Folder \ extract _ 201806 |

DataScientist 10.09.2018 12:29

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

DataScientist 10.09.2018 12:32

@DataScientist Да: DateSerial(Year(Now()),Month(Now())+1,0) выдаст последний день текущего месяца или DateSerial(cLng(Y),cLng(M)+1,0), чтобы получить последний день на основе вашего кода. Дело в том, что после "|" ничего нет. в MessageBox означает, что Filename не был найден функцией Dir.

Chronocidal 10.09.2018 12:39

Как только вы добьетесь правильной работы FileName, вы также должны открыть файл Directory & Filename, а не Mainpath & Filename - в противном случае вы попытаетесь открыть C:\Desktop\Folder\extraction _ 201806extraction _ 20180630 _ Data - Updated.Xlsx вместо C:\Desktop\Folder\extraction _ 20180630 _ Data - Updated.Xlsx.

Chronocidal 10.09.2018 12:46
0
9
437
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на обсуждении в комментариях выше, попробуйте следующее:

' File name format = "extraction _ 20180630 _ Data - Updated _V5.2.xlsx"
File = "extraction _" & Format(DateSerial(CInt(y), CInt(M) + 1, 0), "yyyymmdd") & "_ Data - Updated*"
Filename = Dir(Directory & File)

On Error Resume Next

' after several Checking, the MainPath is Correct. the issue is whithin the second part
If Len(Filename) > 1 Then
    Workbooks.Open Directory & Filename
Else
    MsgBox "Unable to find file for pattern """ & File & """ in location " & Directory, vbCritical
End If

Вот версия, которая также откатится до 3 месяцев в поисках последнего файла:

' File name format = "extraction _ 20180630 _ Data - Updated _V5.2.xlsx"
Dim lRollBack As Integer
For lRollBack = 0 To 3
    File = "extraction _" & Format(DateSerial(CInt(y), CInt(M) + 1 - lRollBack, 0), "yyyymmdd") & "_ Data - Updated*"
    Filename = Dir(Directory & File)
    If Len(Filename) > 1 Then Exit For 'Stop after we find a match
Next lRollBack

On Error Resume Next

' after several Checking, the MainPath is Correct. the issue is whithin the second part
If lRollBack <= 3 Then
    If lRollBack > 0 Then
        MsgBox "We had to roll back by " & CStr(lRollBack) & " month(s)", vbInformation
    End If
    Workbooks.Open Directory & Filename
Else
    MsgBox "Unable to find file for pattern """ & File & """ in location " & Directory, vbCritical
End If

Привет, спасибо за быстрый ответ. Просто чтобы понять, почему в следующем примере стоит +1: CInt (M) + 1?

DataScientist 10.09.2018 13:53

@DataScientist Потому что день последний месяца это (например, DateSerial(2018,09,30)) совпадает с днем ​​нулевой месяца следующий (например, DateSerial(2018,10,0)) - так же, как DateSerial(2018,13,1) совпадает с DateSerial(2019,1,1)

Chronocidal 10.09.2018 14:09

@ Chronocidal: Последний вопрос: Иногда. Мне нужно открыть файл за предыдущий месяц, когда текущий недоступен. Я думал об использовании M = M - 1, если первый недоступен, но переменная M - это текст. Вы знаете, есть ли способ справиться с этим напрямую с помощью Format (DateSerial (CInt (y), CInt (M) + 1, 0), «yyyymmdd»)? Еще раз спасибо

DataScientist 10.09.2018 15:29

@DataScientist Я добавил цикл, который откатывается до 3 месяцев

Chronocidal 10.09.2018 15:45

@ Chronocidal, что потрясающе !! Большое спасибо. Действительно полезно. Я надеюсь, что это касается первого месяца января, чтобы вернуться к предыдущему году. большое спасибо, сэр

DataScientist 10.09.2018 20:24

Другие вопросы по теме