本文主要介紹四種常用的方法:
1、利用Excel對象來(lái)處理文件;
2、利用VBA文件處理語(yǔ)句來(lái)處理文件;
3、利用FileSystemObject對象來(lái)處理文件;
4、利用API函數來(lái)處理文件。
當然對于數據庫文件,還可以利用ADO+SQL的方法操作,不過(guò)論壇已經(jīng)有前輩詳細介紹過(guò)此類(lèi)方法,本文就不再重復了。
一、利用Excel對象來(lái)處理文件
利用Excel對象自帶的方法來(lái)操作文件是最方便,也是最簡(jiǎn)單的。
我們主要利用Workbooks集合和Workbook對象的方法來(lái)操作文件。
1、打開(kāi)Excel文件
我們可以用Workbooks.Open方法打開(kāi)一個(gè)Excel工作簿。
Workbooks.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)
其中FileName是必選的參數,表示要打開(kāi)的工作簿名,如果沒(méi)有指定路徑,則代表當前路徑。另外14個(gè)是可選參數,除了密碼參數,其他的一般很少用。具體的含義可以參看VBA的幫助。
例:
Workbooks.Open "F:\test.xls"
可以打開(kāi)F盤(pán)的test.xls文件。
2、打開(kāi)文本文件
使用Open方法也可以打開(kāi)文本文件,但建議使用OpenText方法。此方法是載入一個(gè)文本文件,并將其作為包含單個(gè)工作表的工作簿進(jìn)行分列處理,然后在此工作表中放入經(jīng)過(guò)分列處理的文本文件數據。完整語(yǔ)法如下:
Workbooks.OpenText(FileName, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, Semicolon, Comma, Space, Other, OtherChar, FieldInfo, TextVisualLayout, DecimalSeparator, ThousandsSeparator, TrailingMinusNumbers, Local)
關(guān)于以上參數的具體含義可以參看VBA的幫助,這里就不重復了。在實(shí)際的編程中,一般無(wú)需對這些復雜的參數進(jìn)行處理??梢酝ㄟ^(guò)錄制宏來(lái)得到打開(kāi)一個(gè)文本文件的VBA代碼。具體方法就是選擇“文件——打開(kāi)”,然后選擇打開(kāi)文本文件,就會(huì )出現文本導入向導,一步一步執行完,直到文本打開(kāi)后,停止錄制。
以下是錄制宏得到的代碼:
Sub Macro1()
'
' Macro1 Macro
' 宏由 MC SYSTEM 錄制,時(shí)間: 2007-3-29
'
'
Workbooks.OpenText Filename:="F:\CallWindowProc.txt", Origin:=xlWindows, _
StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _
, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
TrailingMinusNumbers:=True
End Sub
在實(shí)際編程中只要做相應的修改就可以使用了。
3、打開(kāi)其他文件
利用Excel對象還可以打開(kāi)XML文件和一些數據庫(如Access)文件,對應XML文件,需要Excel2003以上的版本。
OpenXML方法的語(yǔ)法如下:
Workbooks.OpenXML(Filename, Stylesheets, LoadOption)
FileName String 類(lèi)型,必需。要打開(kāi)的文件名。
Stylesheets Variant 類(lèi)型,可選。單個(gè)值或值的數組,用于指定要應用哪些 XSL 轉換 (XSLT) 樣式表處理指令。
LoadOption Variant 類(lèi)型,轉換。指定 Excel 打開(kāi) XML 數據文件的方式??蔀?XlXmlLoadOption 常量之一。
XlXmlLoadOption 可為以下 XlXmlLoadOption 常量之一:
xlXmlLoadImportToList 將 XML 數據文件的內容置于 XML 列表中。
xlXmlLoadMapXml 在“XML 結構”任務(wù)窗格中顯示 XML 數據文件的架構。
xlXmlLoadOpenXml 打開(kāi) XML 數據文件。文件的內容將展開(kāi)。
xlXmlLoadPromptUser 提示用戶(hù)選擇打開(kāi)文件的方式。
示例
下面的代碼打開(kāi)了 XML 數據文件“customers.xml”并在 XML 列表中顯示了此文件的內容。
Sub UseOpenXML()
Application.Workbooks.OpenXML _
Filename:="customers.xml", _
LoadOption:=xlXmlLoadImportToList
End Sub
OpenDatabase 方法語(yǔ)法如下:
Workbooks.OpenDatabase(FileName, CommandText, CommandType, BackgroundQuery, ImportDataAs)
FileName String 類(lèi)型,必需。連接字符串。
CommandText Variant 類(lèi)型,可選。查詢(xún)的命令文本。
CommandType Variant 類(lèi)型,可選。查詢(xún)的命令類(lèi)型。以下是可用的命令類(lèi)型:Default、SQL 和 Table。
BackgroundQuery Variant 類(lèi)型,可選。查詢(xún)的背景。
ImportDataAs Variant 類(lèi)型,可選。確定查詢(xún)的格式。
示例
本示例中,Excel 打開(kāi)了“northwind.mdb”文件。
Sub OpenDatabase()
Workbooks.OpenDatabase FileName:="C:\northwind.mdb"
End Sub
4、保存文件
文件的保存使用Workbook對象的Save或SaveAs方法。
Save方法使用簡(jiǎn)單,語(yǔ)法為
expression_r.Save,expression_r是某個(gè)Workbook對象。
如:ActiveWorkbook.Save
即保存當前活動(dòng)工作簿。
如果是第一次保存工作簿或要另存為,請使用 SaveAs 方法為該文件指定文件名。
其語(yǔ)法為:
expression_r.SaveAs(FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)
具體參數含義可參看VBA幫助,使用都比較簡(jiǎn)單。
示例
本示例新建一個(gè)工作簿,提示用戶(hù)輸入文件名,然后保存該工作簿。
Set NewBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
Loop Until fName <> False
NewBook.SaveAs Filename:=fName
Application.GetSaveAsFilename為調出標準的“另存為”對話(huà)框,獲取用戶(hù)文件名,但并不真正保存任何文件,然后使用代碼保存文件。還有Application.GetOpenFileName可以調出標準的“打開(kāi)”對話(huà)框。
5、關(guān)閉文件
關(guān)閉文件可以使用Workbooks集合或Workbook對象的 Close 方法。前者是關(guān)閉所有打開(kāi)的工作簿,后者關(guān)閉特定的工作簿。
Workbook對象的 Close 方法語(yǔ)法為:
expression_r.Close(SaveChanges, Filename, RouteWorkbook)
SaveChanges參數表示是否保存更改,對許多不需要更改的操作,可設置為False以免彈出保存更改提示的對話(huà)框。
FileName 可選。以此文件名保存所做的更改。
RouteWorkbook 可選。如果指定工作簿不需要傳送給下一個(gè)收件人(沒(méi)有傳送名單或已經(jīng)傳送),則忽略該參數。
示例
本示例關(guān)閉 Book1.xls,并放棄所有對此工作簿的更改。
Workbooks("BOOK1.XLS").Close SaveChanges:=False
本示例關(guān)閉所有打開(kāi)的工作簿。如果某個(gè)打開(kāi)的工作簿有改變,Microsoft Excel 將顯示詢(xún)問(wèn)是否保存更改的對話(huà)框和相應提示。
Workbooks.Close
6、綜合實(shí)例
假如F盤(pán)有一個(gè)Excel文件test.xls,現在有另一個(gè)Excel文件要訪(fǎng)問(wèn)test.xls的數據,我們來(lái)看用VBA代碼如何操作。代碼如下:
Public Sub test()
Application.ScreenUpdating = False
Workbooks.Open "f:\test.xls"
ThisWorkbook.Sheets(1).Range("b1") = ActiveWorkbook.Sheets(1).Range("a2")
ActiveWorkbook.Close
Application.ScreenUpdating = True
End Sub
首先關(guān)閉屏幕刷新,是為了防止test.xls在打開(kāi)時(shí)被看見(jiàn)(有時(shí)候還是看的見(jiàn))。打開(kāi)后,見(jiàn)test.xls的Sheet1的單元格A2中的值賦給當前工作簿的Sheet1的單元格B2,然后關(guān)閉test.xls。
當要打開(kāi)的工作簿不確定的時(shí)候,可以通過(guò)調用打開(kāi)對話(huà)框來(lái)讓用戶(hù)自己選擇。
可改為如下:
Public Sub test()
Application.ScreenUpdating = False
Dim Filename as String
Filename = Application.GetOpenFileName
Workbooks.Open Filename
ThisWorkbook.Sheets(1).Range("b1") = ActiveWorkbook.Sheets(1).Range("a2")
ActiveWorkbook.Close
Application.ScreenUpdating = True
End Sub
7、總結
利用Excel對象的方法進(jìn)行文件操作是最簡(jiǎn)單,也是最方便的,適合初學(xué)者。對于Excel文件格式,如果我們僅僅是讀取其表格中的內容,這種方法也是首選。對于文本文件的操作,使用第二種方法比較方便,若要將文本轉換成表格,那么使用此方法也是合適的。
二、利用VBA文件處理語(yǔ)句來(lái)處理文件
VBA包含了許多用于文件操作的語(yǔ)句和函數,可以滿(mǎn)足絕大多數情況下的文件操作要求。下面我們按照操作目的進(jìn)行一一介紹。
(一)文件處理
1.Name 語(yǔ)句
語(yǔ)法:Name oldpathname As newpathname
功能:重命名一個(gè)文件、目錄、或文件夾,移動(dòng)一個(gè)文件。
說(shuō)明:在一個(gè)已打開(kāi)的文件上使用 Name,將會(huì )產(chǎn)生錯誤。進(jìn)行文件操作時(shí),一定要注意錯誤處理。
示例:
On Error Resume Next '錯誤處理
Name "f:\TEST.xls" As "f:\TEST123.xls" '重命名
Name "f:\TEST.xls" As "f:\dll\TEST.xls" '移動(dòng)文件
Name "f:\TEST.xls" As "d:\TEST123.xls" '跨驅動(dòng)器移動(dòng)并重命名文件
注意:Name不能移動(dòng)一個(gè)目錄或文件夾。
2、FileCopy 語(yǔ)句
語(yǔ)法:FileCopy source, destination
功能:復制一個(gè)文件。
說(shuō)明:如果對一個(gè)已打開(kāi)的文件使用 FileCopy 語(yǔ)句,則會(huì )產(chǎn)生錯誤。
示例:
FileCopy "f:\TEST.xls", "e:\TEST.xls" '從F盤(pán)復制TEST.xls到E盤(pán)
3、Kill 語(yǔ)句
語(yǔ)法:Kill pathname
功能:從磁盤(pán)中刪除文件。
說(shuō)明:Kill 支持多字符 (*) 和單字符 (?) 的統配符來(lái)指定多重文件。如果使用 Kill 來(lái)刪除一個(gè)已打開(kāi)的文件,則會(huì )產(chǎn)生錯誤。
示例:
Kill "f:\TEST.xls" ’刪除F盤(pán)的TEST.xls文件
Kill "f:\*.xls" ' 刪除F盤(pán)所有xls文件
4、GetAttr 函數
語(yǔ)法:GetAttr(pathname)
功能:獲取一個(gè)文件、目錄、或文件夾的屬性。返回一個(gè) Integer值。
返回值
由 GetAttr 返回的值,是下面這些屬性值的總和:
常數 值 描述
vbNormal 0 常規
vbReadOnly 1 只讀
vbHidden 2 隱藏
vbSystem 4 系統文件
vbDirectory 16 目錄或文件夾
vbArchive 32 存檔文件
vbalias 64 指定的文件名是別名。只在Macintosh中可用。
說(shuō)明:若要判斷是否設置了某個(gè)屬性,在 GetAttr 函數與想要得知的屬性值之間使用 And 運算符與逐位比較。如果所得的結果不為零,則表示設置了這個(gè)屬性值。
示例:
Debug.Print GetAttr("F:\test.txt") '若為存檔文件,在立即窗口可看到值為32
Debug.Print GetAttr("F:\test.txt") '將屬性—高級—可存檔文件的勾去掉后,值為0
為判斷一個(gè)文件是否只讀,可用下法:
Debug.Print GetAttr("F:\test.txt") And vbReadOnly
若值非零,說(shuō)明時(shí)只讀的。
5、SetAttr 語(yǔ)句
語(yǔ)法:SetAttr pathname, attributes
功能:為一個(gè)文件設置屬性。
說(shuō)明:如果想要給一個(gè)已打開(kāi)的文件設置屬性,則會(huì )產(chǎn)生運行時(shí)錯誤。
示例:
SetAttr"F:\test.txt", vbHidden ' 設置隱藏屬性。
SetAttr"F:\test.txt", vbHidden + vbReadOnly ' 設置隱藏并只讀。
6、FileLen 函數
語(yǔ)法:FileLen(pathname)
功能:獲取一個(gè)文件的長(cháng)度,單位是字節。
說(shuō)明:當調用 FileLen 函數時(shí),不需要打開(kāi)文件,如果所指定的文件已經(jīng)打開(kāi),則返回的值是這個(gè)文件在打開(kāi)前的大小。
7、FileDateTime 函數
語(yǔ)法:FileDateTime(pathname)
功能:獲取一個(gè)文件被創(chuàng )建或最后修改后的日期和時(shí)間。
示例:
Debug.Print FileDateTime("F:\TEST.xls") '在立即窗口可看到2007-3-29 19:28:27
(二)目錄處理
1、CurDir 函數
語(yǔ)法:CurDir[(drive)]
功能:返回當前的路徑。
說(shuō)明:drive 參數是可選的,它指定一個(gè)存在的驅動(dòng)器。如果沒(méi)有指定驅動(dòng)器,或 drive 是零長(cháng)度字符串 (""),則 CurDir 會(huì )返回當前驅動(dòng)器的路徑。
示例:
Debug.Print CurDir ' 返回“C:\Documents and Settings\yc\My Documents”。
Debug.Print CurDir("C") ' 返回“C:\Documents and Settings\yc\My Documents”。
Debug.Print CurDir("D") ' 返回“D:\”。
2、ChDir 語(yǔ)句
語(yǔ)法:ChDir path
功能:改變當前的目錄或文件夾。
說(shuō)明:ChDir 語(yǔ)句改變缺省目錄位置,但不會(huì )改變缺省驅動(dòng)器位置。缺省驅動(dòng)器一般是C。
示例:
ChDir "D:\temp"
Debug.Print CurDir ' 返回“C:\Documents and Settings\yc\My Documents”。
Debug.Print CurDir("D") ' 返回“D:\temp”。
與上例比較,此時(shí)D盤(pán)的當前目錄已經(jīng)變?yōu)?#8220;D:\temp”,但是缺省驅動(dòng)器還是C。
3、ChDrive 語(yǔ)句
語(yǔ)法:ChDrive drive
功能:改變當前的驅動(dòng)器。
說(shuō)明:如果使用零長(cháng)度的字符串 (""),則當前的驅動(dòng)器將不會(huì )改變。如果 drive 參數中有多個(gè)字符,則 ChDrive 只會(huì )使用首字母。
示例:
ChDrive "D"
ChDir "D:\temp"
Debug.Print CurDir ' 返回“D:\temp”。
Debug.Print CurDir("D") ' 返回“D:\temp”。
與上例比較,用CurDir返回的是“D:\temp”,當前驅動(dòng)器已經(jīng)變?yōu)镈了。
4、Dir 函數
語(yǔ)法:Dir[(pathname[, attributes])]
兩個(gè)參數都是可選的,attributes表示文件屬性。
功能:返回一個(gè)文件名、目錄名或文件夾名稱(chēng),它必須與指定的模式或文件屬性、或磁盤(pán)卷標相匹配。
說(shuō)明:在第一次調用 Dir 函數時(shí),必須指定 pathname,否則會(huì )產(chǎn)生錯誤。如果也指定了文件屬性,那么就必須包括 pathname。
Dir 會(huì )返回匹配 pathname 的第一個(gè)文件名。若想得到其它匹配 pathname 的文件名,再一次調用 Dir,且不要使用參數。如果已沒(méi)有合乎條件的文件,則 Dir 會(huì )返回一個(gè)零長(cháng)度字符串 ("")。一旦返回值為零長(cháng)度字符串,并要再次調用 Dir 時(shí),就必須指定 pathname,否則會(huì )產(chǎn)生錯誤。不必訪(fǎng)問(wèn)到所有匹配當前 pathname 的文件名,就可以改變到一個(gè)新的 pathname 上。但是,不能以遞歸方式來(lái)調用 Dir 函數。以 vbDirectory 屬性來(lái)調用 Dir 不能連續地返回子目錄。
示例:
Debug.Print Dir("F:\TEST.xls") ’返回"TEST.xls"
Debug.Print Dir("F:\*.xls") ’返回按條件第一個(gè)找到的文件名。
Debug.Print Dir("F:\*.txt",vbReadOnly) ’返回第一個(gè)只讀的txt文件
以下過(guò)程可顯示C盤(pán)根目錄下的所有目錄.
Sub DirC()
MyPath = "c:\"
MyName = dir(MyPath, vbDirectory) ' 找尋第一項。
Do While MyName <> "" ' 開(kāi)始循環(huán)。
' 跳過(guò)當前的目錄及上層目錄。
If MyName <> "." And MyName <> ".." Then
' 使用位比較來(lái)確定 MyName 代表一目錄。
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
Debug.Print MyName ' 如果它是一個(gè)目錄,將其名稱(chēng)顯示出來(lái)。
End If
End If
MyName = dir ' 查找下一個(gè)目錄。
Loop
End Sub
以下過(guò)程利用遞歸可以查找目錄和子目錄下的所有文件。
Public Sub FindFile(mPath As String, Optional sFile As String = "")
On Error Resume Next
Dim s As String, sDir() As String
Dim i As Long, d As Long
If Right(mPath, 1) <> "\" Then
mPath = mPath & "\"
End If
'查找目錄下的文件
s = dir(mPath & sFile, vbArchive + vbDirectory + vbHidden + vbNormal + vbReadOnly + vbSystem)
Do While s <> ""
Debug.Print mPath & s
s = dir
Loop
'查找目錄下的子目錄
s = dir(mPath, vbArchive + vbDirectory + vbHidden + vbNormal + vbReadOnly + vbSystem)
Do While s <> ""
If s <> "." And s <> ".." Then
If (GetAttr(mPath & s) And vbDirectory) = vbDirectory Then
d = d + 1
ReDim Preserve sDir(d)
sDir(d) = mPath & s
End If
End If
s = dir
Loop
'開(kāi)始遞歸
For i = 1 To d
FindFile sDir(d) & "\"
Next
End Sub
5、MkDir 語(yǔ)句
語(yǔ)法:MkDir path
功能:創(chuàng )建一個(gè)新的目錄或文件夾。
說(shuō)明:path 可以包含驅動(dòng)器。如果沒(méi)有指定驅動(dòng)器,則 MkDir 會(huì )在當前驅動(dòng)器上創(chuàng )建新的目錄或文件夾。
示例:
MkDir "MYDIR" '在當前目錄建立新的目錄或文件夾。
6、RmDir 語(yǔ)句
語(yǔ)法:RmDir path
功能:刪除一個(gè)存在的目錄或文件夾。
說(shuō)明:如果想要使用 RmDir 來(lái)刪除一個(gè)含有文件的目錄或文件夾,則會(huì )發(fā)生錯誤。在試圖刪除目錄或文件夾之前,先使用 Kill 語(yǔ)句來(lái)刪除所有文件。
示例:
RmDir "MYDIR" ' 將 MYDIR 刪除。
聯(lián)系客服