Как открыть файл, если я знаю только часть имени файла? - PullRequest
10 голосов

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

Я знаю, что имя файла примерно такое.

filename*esy

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

Ответы [ 5 ]

17 голосов
/ 19 мая 2010

filename*esy уже является подстановочным знаком "shell shell", и если это всегда так, вы можете просто;

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

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

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

2 голосов
/ 19 мая 2010

Вы можете использовать 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
1 голос
/ 19 мая 2010
If InStr(sFilename, "filename") > 0 and InStr(sFilename, "esy") > 0 Then
 'do somthing
end if

Или вы можете использовать RegEx

 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
0 голосов
/ 23 июня 2017

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

Workbooks.Open Filename:= "Filepath\filename*esy.*"

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

Workbooks.Open Filename:= "Filepath\filename????esy.*"

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

0 голосов
/ 20 апреля 2014

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

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 & "\"
'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 & Dir(path & "\" & sName & 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 & file
  file = Dir
Wend

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

 End Function

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

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