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