VBA实战技巧精粹012:查找指定目录下的指定文件及Dir函数用法
問題:有處理學生評語,限于網絡條件,往往學生提交的都是單個文件,這就需要將其一一提取出來,然后進行判斷、導出等操作,但首先要解決的就是查找所有文件如何操作,這里需要用到Dir函數,當然創建一個文件搜索對象也可以。
Dir 函數
返回一個 String,用以表示一個文件名、目錄名或文件夾名稱,它必須與指定的模式或文件屬性、或磁盤卷標相匹配。
語法
Dir[(pathname[, attributes])]
Dir 函數的語法具有以下幾個部分:
| pathname | 可選參數。用來指定文件名的字符串表達式,可能包含目錄或文件夾、以及驅動器。如果沒有找到 pathname,則會返回零長度字符串 ("")。 | |
| attributes | 可選參數。常數或數值表達式,其總和用來指定文件屬性。如果省略,則會返回匹配 pathname 但不包含屬性的文件。 | |
設置值
attributes 參數的設置可為:
| vbNormal | 0 | (缺省) 指定沒有屬性的文件。 |
| vbReadOnly | 1 | 指定無屬性的只讀文件 |
| vbHidden | 2 | 指定無屬性的隱藏文件 |
| VbSystem | 4 | 指定無屬性的系統文件 在Macintosh中不可用。 |
| vbVolume | 8 | 指定卷標文件;如果指定了其它屬性,則忽略vbVolume 在Macintosh中不可用。 |
| vbDirectory | 16 | 指定無屬性文件及其路徑和文件夾。 |
| vbAlias | 64 | 指定的文件名是別名,只在Macintosh上可用。 |
注意 這些常數是由 VBA 所指定的,在程序代碼中的任何位置,可以使用這些常數來替換真正的數值。
說明
在 Microsoft Windows 中, Dir 支持多字符 (*) 和單字符 (?) 的通配符來指定多重文件。
在第一次調用 Dir 函數時,必須指定 pathname,否則會產生錯誤。如果也指定了文件屬性,那么就必須包括 pathname。
Dir 會返回匹配 pathname 的第一個文件名。若想得到其它匹配 pathname 的文件名,再一次調用 Dir,且不要使用參數。如果已沒有合乎條件的文件,則 Dir 會返回一個零長度字符串 ("")。一旦返回值為零長度字符串,并要再次調用 Dir 時,就必須指定 pathname,否則會產生錯誤。不必訪問到所有匹配當前 pathname 的文件名,就可以改變到一個新的 pathname 上。但是,不能以遞歸方式來調用 Dir 函數。以 vbDirectory 屬性來調用 Dir 不能連續地返回子目錄。
提示 由于文件名并不會以特別的次序來返回,所以可以將文件名存儲在一個數組中,然后再對這個數組排序。
Dir 函數示例本示例使用 Dir 函數來檢查某些文件或目錄是否存在。
Dim MyFile, MyPath, MyName
' 返回“WIN.INI”(在 Microsoft Windows 中) (如果該文件存在)。
MyFile = Dir("C:\WINDOWS\WIN.ini")???
' 返回帶指定擴展名的文件名。如果超過一個 *.ini 文件存在,
' 函數將返回按條件第一個找到的文件名。
MyFile = Dir("C:\WINDOWS\*.ini")
' 若第二次調用 Dir 函數,但不帶任何參數,則函數將返回同一目錄下的下一個 *.ini 文件。
MyFile = Dir
' 返回找到的第一個隱式 *.TXT 文件。
MyFile = Dir("*.TXT", vbHidden)
' 顯示 C:\ 目錄下的名稱。
MyPath = "c:\"??? ' 指定路徑。
MyName = Dir(MyPath, vbDirectory)??? ' 找尋第一項。
Do While MyName <> ""??? ' 開始循環。
??? ' 跳過當前的目錄及上層目錄。
??? If MyName <> "." And MyName <> ".." Then
??????? ' 使用位比較來確定 MyName 代表一目錄。
??????? If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
??????????? Debug.Print MyName??? ' 如果它是一個目錄,將其名稱顯示出來。
??????? End If
??? End If
??? MyName = Dir??? ' 查找下一個目錄。
Loop
?'只需要文件名不要路徑可以用這個
?Sub 利用Dir函數搜索指定目錄下所有指定文件()
???? Dim MyFile As String, MyPath As String, i As Integer
???? MyPath = "C:\windows\"
???? i = 0
???? MyFile = Dir(MyPath & "*.ini")
???? '如果上行未找到,則下行的條件肯定不滿足了:Dir函數未找到符合條件的結果時,返回一個空字符串,長度為0
???? Do While Len(MyFile) > 0
??????? MyFile = Dir?????????? '只需對Dir進行循環操作即可,因為上面已經有一行查找命令了.
??????? Debug.Print MyFile???? '只輸出文件名,而不顯示路徑,用處很大.
??????? i = i + 1
???? Loop
???? Debug.Print "共找到" & i & "個文件"
?End Sub
輸出結果:
win.ini
msdfmap.ini
ODBCINST.INI
vb.ini
vbaddin.ini
desktop.ini
...
'需要完整路徑的文件名可以用這個
Sub 利用FileSearch對象搜索指定目錄下的所有文件()
??? Dim i As Integer, xls() As String
??? Dim sr As FileSearch '定義一個文件搜索對象
??? Set sr = Application.FileSearch
??? sr.LookIn = "c:\windows\" '注意路徑,換成你實際的路徑
??? sr.Filename = "*.ini" '搜索所有文件
??? sr.Execute '執行搜索
??? ReDim xls(sr.FoundFiles.Count)
??? For i = 1 To sr.FoundFiles.Count
??????? xls(i) = sr.FoundFiles(i) '因為下面需要打開指定路徑下的文件,故就不需再去掉路徑名了,直接將完整路徑輸入即可.
??????? Debug.Print xls(i)
??? Next
End Sub
輸出結果:
C:\WINDOWS\ApabiMaker.INI
C:\WINDOWS\callInfo.ini
C:\WINDOWS\capture.ini
C:\WINDOWS\control.ini
C:\WINDOWS\desktop.ini
...
下面是一個將指定目錄下所有指定文件類型提取至工作表并進行排序且更名的代碼:
Sub 將指定目錄下的指定文件類型提取至工作表并排序且進行更名()
??? Dim MyFile As String, MyPath As String, i As Integer, arr() As String
??? MyPath = "e:\temp\"
??? i = 0
??? MyFile = Dir(MyPath & "*.txt")
??? Do While Len(MyFile) > 0
??????? i = i + 1
??????? ReDim Preserve arr(i)
??????? arr(i) = MyFile
??????? MyFile = Dir
??? Loop
??? With Worksheets("sheet6")
??????? .Cells(1, 1).Value = "文件名"
??????? .Range("A2:A" & UBound(arr) + 1).Value = Application.WorksheetFunction.Transpose(arr)
'??????? 本來想去掉擴展名,現在想想不需要去掉擴展名,直接帶著就可以.
'??????? For i = 1 To UBound(arr)
'??????????? .Cells(i + 1, 1).Value = Replace(LCase(.Cells(i + 1, 1).Value), ".txt", "")
'??????? Next i
??????? .Range("A1").Sort Key1:=.Range("A1"), Order1:=xlAscending, header:=xlYes
??????? '如果只是改名的話,那新舊文件名都要帶上完整路徑,不然就移到當前工作簿所在文件夾了.
??????? For i = 1 To UBound(arr)
??????????? Name MyPath & .Cells(i + 1, 1).Value As MyPath & Worksheets("sheet4").Cells(i + 1, 1).Value & ".txt"
??????? Next i
??? End With
End Sub
BuzzNet: Excel VBA
del.icio.us: Excel VBA
Flickr: Excel VBA
IceRocket: Excel VBA
LiveJournal: Excel VBA
Technorati: Excel VBA
?本文用菊子曰發布
轉載于:https://www.cnblogs.com/xiehui/archive/2011/04/15/2016778.html
總結
以上是生活随笔為你收集整理的VBA实战技巧精粹012:查找指定目录下的指定文件及Dir函数用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android UI学习 - GridV
- 下一篇: 转:两种转换mysql数据编码的方法-l