2013-11-26 35 views
3

我試圖圍繞interwebz進行研究,但無濟於事。文件名通配符的返回值

我有這段代碼搜索一個文件夾來查看文件是否存在。問題是我不知道完整的文件名,所以我用通配符。帶有通配符「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' – 2013-11-26 16:53:48

+0

@Mehow這實際上工作正常:) - 我有一個問題 - 有沒有辦法循環它,以防萬一有多個文件存在?我可以只添加一個if語句,像If filename <>「」 - Loop Until 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