VBA操作文件和文件夾步驟

2021-12-08 14:30 更新

獲取當(dāng)前文件夾的名稱(CurDir 函數(shù))

當(dāng)你使用文件時,經(jīng)常會需要知道當(dāng)前文件夾的名稱,你使用CurDir函數(shù)輕易地獲取該信息:
CurDir([drive])
Drive是一可選參數(shù),如果你忽略它,VBA將使用當(dāng)前驅(qū)動(drive)。

CurDir函數(shù)返回一個文件路徑作為Variant(變量)。如果要返回作為字符串(String)的路徑的話,就得使用CurDir$(這里的$是字符串的類型聲明字符)。讓我們在立即窗口里做些練習(xí),練習(xí)使用這些函數(shù)吧:

1. 打開一個新工作簿,并且切換到VB編輯器窗口

2. 激活立即窗口并敲入下述代碼:
?CurDir
當(dāng)你按下回車,VB就顯示當(dāng)前文件夾名稱,例如:
C:\
如果你有第二個硬盤(或者光驅(qū))的話,你可以獲取D盤上的當(dāng)前文件夾,例如:
?CurDir(“D:\”)
如果你提供了一個并不存在的驅(qū)動字母的話,VB就將顯示下述錯誤信息:“設(shè)備不可用”

3. 要儲存當(dāng)前驅(qū)動名稱到變量myDrive,可以輸入下述指令:
myDrive = Left(CurDir$,1)
當(dāng)你按下回車鍵時,VB將當(dāng)前驅(qū)動器的字母儲存到變量myDrive
敲入下述指令并回車,可以檢查變量myDrive的內(nèi)容:
?myDrive
你還可以將上面的指令改為如下:
myDrive = left(CurDir$,1) & ":"
VB將返回驅(qū)動器字母,后面帶有一個冒號。

更改文件或文件夾名稱(Name 函數(shù))

使用函數(shù)Name可以重命名文件或者文件夾,例如:
Name old_pathname As new_pathname
Old_pathname是你想用重命名的文件或文件夾的名稱和路徑,New_pathname則明確文件或文件夾的新名稱和位置。使用函數(shù)Name,你可以將一個文件從一個文件夾移動到另外一個文件夾,但是,你不可以移動文件夾。

請在立即窗口里試演該函數(shù)(用你文件的實際名稱替換示例名稱)。這里有些需要考慮的注意事項:

①在New_pathname里的文件名稱不要指向已經(jīng)存在的文件
Name "C:\System.1st " As "C:\test.txt"
因為文件C:\test.txt已經(jīng)存在于C盤,VB將顯示錯誤信息:“文件已存在”,同樣,如果你要重命名的文件不存在的話,就會出現(xiàn)“文件未找到”的錯誤信息。
 
②如果New_pathname已經(jīng)存在,并且和Old_pathname不同,函數(shù)Name必要時將文件移動到新文件夾并且更改它的名稱。
Name "C:\System.1st " As "D:\test.txt"
因為文件test.txt在D盤的根目錄下并不存在,VB將C:\System.1st
移動到指定的驅(qū)動盤,然而,并不重命名該文件。(本段與上面的內(nèi)容似乎矛盾,而且未能試驗成功,未知是原書失誤與否。讀者應(yīng)仔細驗證)

③如果New_pathname和Old_pathname指向不同的目錄,以及提供的文件名稱相同,那么Name函數(shù)將指定的文件移到新地址,不用更改文件名。
Name "D:\test.txt " As "C:\DOS\test.txt"
上面的指令將test.txt移動到C盤下的DOS文件夾里。

技巧:你不能重命名開啟的文件
在重命名文件之前,你必須關(guān)閉該文件。文件名稱里不能包含通配符“*”或者“?”。

檢查文件或文件夾是否存在(Dir 函數(shù))

Dir函數(shù),返回文件或者文件夾名稱,語法如下:
Dir[(pathname[, attributes])]
Dir函數(shù)的兩個參數(shù)都是可選的,pathname是文件或文件夾名稱,對于參數(shù)attributes,你可以下列常量或者數(shù)值之一:

文件屬性

Dir函數(shù)常用來檢查某個文件或文件夾是否存在,如果不存在,那么就返回空字符串(””)。我們到立即窗口里試驗幾個Dir函數(shù)的練習(xí):

1. 在立即窗口,輸入下述指令:
?Dir("C:\", vbNormal)
你一旦按下回車鍵,VB就會返回該文件夾下的第一個文件名。普通文件(vbNormal)就是除隱藏,卷標(biāo),目錄,文件夾或系統(tǒng)文件之外的任何文件。
要返回當(dāng)前目錄下的其它文件名稱的話,就使用不帶參數(shù)的Dir函數(shù):
?Dir (并且回車)

2. 在立即窗口里輸入下列指令,并且在你回車時檢查其結(jié)果:
mfile = Dir("C:\", vbHidden)
?mfile
mfile = Dir
?mfile
mfile = Dir
?mfile

3. 在立即窗口輸入下述指令:
If Dir("C:\stamp.bat") = "" Then Debug.Print "文件未找到。"
因為stamp.bat文件不在C盤上,所以VB就在立即窗口里寫下文本信息“文件未找到?!?br>
4. 在立即窗口輸入下述語句,可以檢查某文件是否存在于某驅(qū)動盤上:
If Dir ("C:\Autoexec.bat") <>"" Then Debug.Print "該文件不在C盤上。"
函數(shù)Dir允許你在文件路徑名中使用通配符——星號(*)代表多個字符,問號(?)代表單個字符:

例如,要在WINDOWS文件夾中查找所有配置設(shè)置的文件,你可以查找所有的INI文件,如下:
?Dir("C:\WINNT\*.ini", vbNormal)
system.ini
?dir WIN.INI
?dir
WINFILE.INI
?dir control.ini
?dir EQUIP32.INI
?dir
sxpwin32.ini
下面顯示的過程在立即窗口里寫上了確定目錄下的文件名稱。函數(shù)LCase$讓文件名稱顯示為小寫字母。

1. 打開一新工作簿,并保存為Chap08.xls

2. 切換到VB編輯器窗口并重命名VBA工程為FileMan

3. 插入新模塊,重命名為DirFunction

4. 輸入下述VBA過程:
Sub MyFiles()
Dim mfile As String
Dim mpath As String
mpath = InputBox("Enter pathname,e.g., C:\Excel")
If Right(mpath, 1) <> "\" Then mpath = mpath & "\"
mfile = Dir(mpath & "*.*")
If mfile <> "" Then Debug.Print "Files in the " & mpath _
& "folder"
Debug.Print LCase$(mfile)
If mfile = "" Then
MsgBox "No files found."
Exit Sub
End If
Do While mfile <> ""
mfile = Dir
Debug.Print LCase$(mfile)
Loop
End Sub
上面的過程myFiles向用戶詢問文件路徑名。如果該路徑結(jié)尾沒有反斜杠,函數(shù)Right就會將反斜杠附加在路徑名字符串上。接下來,VB在該確定的文件夾里搜索所有文件(*)。如果沒有文件的話,就會有信息顯示,如果文件存在,那么文件名就會被寫入立即窗口。

5. 在同一個模塊里輸入另外一個過程:
Sub GetFiles()
Dim nfile As String
Dim nextRow As Integer
nextRow = 1
'next row index
With Worksheets("Sheet1").Range("A1")
nfile = Dir("C:\", vbNormal)
.Value = nfile
Do While nfile <> ""
nfile = Dir
.Offset(nextRow, 0).Value = nfile
nextRow = nextRow + 1
Loop
End With
End Sub
過程GetFiles獲取C盤根目錄下的所有文件名并且將每個文件名寫入工作表。

4.獲得文件修改的日期和時間(FileDateTime 函數(shù))

如果你的過程需要知道某文件的最后修改的時間的話,可以使用函數(shù)FileDateTime:
FileDateTime(文件路徑名)

文件路徑名是個字符串,明確你要用的文件,并且需要包括驅(qū)動和文件夾的名稱。該函數(shù)返回某文件的日期和時間印記。日期和時間的格式取決于視窗控制面板的原始設(shè)置。

我們在立即窗口里來練習(xí)使用該函數(shù):

1. 在立即窗口里輸入:
?FileDateTime("C:\config.sys")
回車后,VB返回下述格式的日期和時間
5/4/2001 10:52:00 AM

要分開獲取日期和時間時,可以將函數(shù)FileDateTime作為函數(shù)DateValue或TimeValue的參數(shù)來使用。例如:
?DateValue(FileDateTime("C:\config.sys"))
?TimeValue(FileDateTime("C:\config.sys"))

2. 在立即窗口里將下述語句在一行輸入:
If DateValue(FileDateTime("C:\config.sys"))< Date then Debug.Print "This file was not
modified today.”
Date函數(shù)返回當(dāng)前系統(tǒng)日期,也是視窗控制面板的日期對話框里設(shè)定的。 

獲得文件大?。‵ileLen 函數(shù))

如果你需要檢查某文件是否能夠存在某磁盤上,那么你應(yīng)該按照下述方式使用FileLen函數(shù):
FileLen(文件路徑名)

FileLen函數(shù)一字節(jié)方式返回文件的大小。如果該文件已打開,那么VB將返回該文件最后一個保存時的大小。

假設(shè)你想要獲取Windows目錄下進行配置設(shè)置的所有文件的總大?。?br>
1. 在當(dāng)前工程里插入新模塊,并重命名為FileLenFunction

2. 在代碼窗口了輸入過程TotalBytesIni:
Sub TotalBytesIni()
Dim iniFile As String
Dim allBytes As Long
iniFile = Dir("C:\WINDOWS\*.ini")
allBytes = 0
Do While iniFile <> ""
allBytes = allBytes + FileLen("C:\WINDOWS\" & iniFile)
iniFile = Dir
Loop
Debug.Print "Total bytes: " & allBytes
End Sub






以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號