2013-11-26 4 views
3

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

У меня есть этот код, который ищет папку, чтобы узнать, существует ли файл. Проблема в том, что я не знаю полного имени файла, поэтому я использовал подстановочный знак. Файл с шаблоном «Provider * _extra» & «.csv» - подстановочный знак представляет собой дату и строку - например Provider_20131126_purple_extra.csv.

Я хочу знать, что это подстановочное значение - например. Я хочу назвать «20131126_purple» или что-то еще. Кто-нибудь знает, как это сделать в VBA? Заранее спасибо.

FileName = Dir$(MyPath & "PROVIDER*_EXTRA" & ".csv") 
If (Len(FileName) > 0) Then 

wb1.Sheets("Found Files").Activate 
LastRow = Range("E" & Rows.Count).End(xlUp).Row + 1 
Range("E" & LastRow).Activate 
ActiveCell = "PROVIDER EXTRA FILE" 
wb1.Sheets("Control").Activate 

Else 

End If 
+2

насчет 'Debug.Print filename' || 'ActiveCell = FileName' –

+0

@Mehow Это действительно сработало отлично :) - У меня есть вопрос - есть ли способ его пропустить, чтобы в случае присутствия нескольких файлов? Могу ли я просто добавить оператор if, который говорит как If filename <> "" - Loop до ISEMPTY? – mmichaelx

+0

http://social.msdn.microsoft.com/Forums/office/en-US/ed24ba3d-3373-49cb-ab67-3dae4eecbe04/cycling-through-a-directory-in-vba?forum=accessdev - посмотрите на первое решение –

ответ

1

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

Debug.print FileName, чтобы получить имя файла, который вы используете.

если вы хотите перебрать все файлы в папке см this

короткий образец:

Public Const PathToFolder As String = "C:\SampleFolder\" 

Sub PrintFilesNames() 
    Dim file As String 
    file = Dir$(PathToFolder) 
    While (Len(file) > 0) 
     Debug.Print file 
     file = Dir 
    Wend 
End Sub 
2

Вы можете попробовать его с помощью функции REPLACE:

wildcard = Replace(FileName, "Provider", "") 
wildcard = Replace(wildcard, "_extra.csv", "") 
+0

Спасибо @Jazzyjoop - я использовал код Mehow выше, который дает мне имя файла с подстановочным знаком - что я хотел - но это только дает мне одно имя файла с подстановочным знаком - есть ли способ что вы думаете, что я смогу зациклиться на его коде - или вы считаете, что цикл с вашим кодом будет проще? – mmichaelx

2

Это будет делать то, что вы хотите.

У меня есть эта пара функций, которые я написал и использовать все время:

Function GetFilenamesMatchingPattern(ByVal pathPattern As String, _ 
    Optional attributes As VbFileAttribute = vbNormal) As String() 
    Dim i As Long 
    Dim nFiles As Long 
    Dim filenames() As String 
    nFiles = CountFilesMatchingPattern(pathPattern, attributes) 
    If nFiles > 0 Then 
     ReDim filenames(1 To nFiles) 
     filenames(1) = dir(pathPattern, attributes) 
     For i = 2 To nFiles 
      filenames(i) = dir() 
     Next i 
    Else 
     'Return unallocated array 
    End If 
    GetFilenamesMatchingPattern = filenames 
End Function 
Function CountFilesMatchingPattern(ByVal pathPattern As String, _ 
    Optional attributes As VbFileAttribute = vbNormal) As Long 
    Dim nFiles As Long 
    If dir(pathPattern, attributes) = "" Then 
     nFiles = 0 
    Else 
     nFiles = 1 
     Do While dir() <> "" 
      nFiles = nFiles + 1 
     Loop 
    End If 
    CountFilesMatchingPattern = nFiles 
End Function 

Извинения, если кто-то не нравится стиль!

Пример использование с шаблоном:

Dim filenames() As String 
filenames = GetFilenamesMatchingPattern("C:\Users\myName\Documents\Book*.xlsm") 

'returns an array of Strings: 
'{"Book1.xlsm", "Book2.xlsm", "Book2_test.xlsm"} 

Теперь для вашей конкретной проблемы, а именно получение различных подстановочных значения:

Dim i As Long 
Dim filenames() As String 
Dim wildcardValues() As String 
Dim part1 As String 
Dim part2 As String 
part1 = "Book" ' yours would be "Provider_" 
part2 = ".xlsm" ' yours would be "_extra.csv" 
filenames = GetFilenamesMatchingPattern("C:\Users\myName\Documents\" _ 
    & part1 & "*" & part2) 
ReDim wildcardValues(LBound(filenames) To UBound(filenames)) 
For i = LBound(filenames) To UBound(filenames) 
    wildcardValues(i) = Replace(Replace(filenames(i), part1, ""), part2, "") 
Next i 
'wildcardValues is now: 
'{"1", "2", "2_test"} 
'Done. 
+0

+1 выглядит всеобъемлющим. – brettdj

Смежные вопросы