#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.*"
Я использую этот метод для запуска кода в файлах с метками даты и времени, чтобы игнорировать часть метки времени.