這將做你想做的。
我有這對我寫的功能和使用所有的時間:
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.
怎麼樣'debug.print FileName' || 'ActiveCell = FileName' – 2013-11-26 16:53:48
@Mehow這實際上工作正常:) - 我有一個問題 - 有沒有辦法循環它,以防萬一有多個文件存在?我可以只添加一個if語句,像If filename <>「」 - Loop Until ISEMPTY? – mmichaelx
http://social.msdn.microsoft.com/Forums/office/en-US/ed24ba3d-3373-49cb-ab67-3dae4eecbe04/cycling-through-a-directory-in-vba?forum=accessdev - 看看第一個解決方案 –