Как открыть файл, если мне известна только часть имени файла?

#excel #vba #filenames #filepath

Вопрос:

Мне нужно открыть файл, полное имя которого я не знаю.

Я знаю, что имя файла что-то вроде.

 filename*esy
 

Я определенно знаю, что в данном каталоге есть только одно вхождение этого файла.

Ответ №1:

filename*esy уже есть подстановочный знак «готов к оболочке», и если это всегда так, вы можете просто;

 const SOME_PATH as string = "c:rootdir"
...
Dim file As String
file = Dir$(SOME_PATH amp; "filename*esy" amp; ".*")

If (Len(file) > 0) Then
  MsgBox "found " amp; file
End If
 

Просто позвоните (или повторите цикл до тех пор, пока он не опустеет) file = Dir$() , чтобы получить следующее совпадение.

Ответ №2:

Есть Application.FileSearch вариант, который вы можете использовать (см. Ниже). Вы можете использовать это для поиска файлов, соответствующих вашему шаблону. Эта информация взята отсюда.

 Sub App_FileSearch_Example()

    With Application.FileSearch
        .NewSearch
        .LookIn = "c:some_folder"
        .FileName = "filename*esy"
        If .Execute(SortBy:=msoSortByLastModified, SortOrder:=msoSortOrderDescending) > 0 Then    
            For i1 = 1 To .FoundFiles.Count
                ' do something with matched file(s)
            Next i1

        End If

    End With    
End Sub
 

Ответ №3:

 If InStr(sFilename, "filename") > 0 and InStr(sFilename, "esy") > 0 Then
 'do somthing
end if
 

Или вы можете использовать регулярное выражение

  Dim RE As Object, REMatches As Object 

    Set RE = CreateObject("vbscript.regexp") 
    With RE 
        .MultiLine = False 
        .Global = False 
        .IgnoreCase = True 
        .Pattern = "filename(.*)esy" 
    End With 

    Set REMatches = RE.Execute(sFilename) 
    REMatches(0) 'find match
 

Комментарии:

1. по какой-то причине я предполагал, что файл был открыт. ой

Ответ №4:

Я пытался задать этот вопрос как функцию. Это решение, которое в конечном итоге сработало для меня.

 Function fileName(path As String, sName As String, ext As String) As Variant

'path is Full path from root.  Can also use path = ActiveWorkbook.path amp; ""
'sName is the string to search. ? and * are wildcards.  ? is for single char
'example sName = "book?" or sName ="March_*_2014*"
'ext is file extention ie .pdf .xlsm .xls? .j*

Dim file As Variant 'Store the next result of Dir
Dim fname() As String 'Dynamic Array for result set
ReDim fname(0 To 0) 
Dim i As Integer ' Counter
i = 0

' Use dir to search and store first result
fname(i) = path amp; Dir(path amp; "" amp; sName amp; ext) 
i = i   1

'Load next result
file = Dir 

While file <> "" 'While a file is found store that file in the array
  ReDim Preserve fname(0 To i) As String
  fname(i) = path amp; file
  file = Dir
Wend

fileName = Application.Transpose(fname) 'Print out array

 End Function
 

Это работает для меня как отдельная функция или функция массива.

Ответ №5:

Если вы знаете, что ни один другой файл не содержит «имя файла» и «esy» в таком порядке, вы можете просто использовать

 Workbooks.Open Filename:= "Filepathfilename*esy.*"
 

Или если вы знаете количество пропущенных символов, то (предполагая, что 4 символа неизвестны)

 Workbooks.Open Filename:= "Filepathfilename????esy.*"
 

Я использую этот метод для запуска кода в файлах с метками даты и времени, чтобы игнорировать часть метки времени.