版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、丄Excel-VBA操作文件四大方法之一利用Excel對(duì)象來(lái)處理文件在我們?nèi)粘J褂肊xcel的時(shí)候,不僅會(huì)用到當(dāng)前Excel文件的數(shù)據(jù),還經(jīng)常需要訪問(wèn)其他的數(shù)據(jù)文件。這些數(shù)據(jù)文件可能是Excel文件、文本文件或數(shù)據(jù)庫(kù)文件等。經(jīng)常有朋友會(huì)問(wèn)如何在vba代碼里操作這些數(shù)據(jù)文件?本文就系統(tǒng)地介紹一下在Excel中應(yīng)用VBA操作數(shù)據(jù)文件的方法。本文主要介紹四種常用的方法:1、利用Excel對(duì)象來(lái)處理文件;2、利用VBA文件處理語(yǔ)句來(lái)處理文件;3、利用FileSystemObject對(duì)象來(lái)處理文件;4、利用API函數(shù)來(lái)處理文件。當(dāng)然對(duì)于數(shù)據(jù)庫(kù)文件,還可以利用ADO+SQL的方法操作,不過(guò)論壇已經(jīng)有前輩詳
2、細(xì)介紹過(guò)此類方法,本文就不再重復(fù)了。一、利用Excel對(duì)象來(lái)處理文件利用Excel對(duì)象自帶的方法來(lái)操作文件是最方便,也是最簡(jiǎn)單的。我們主要利用Workbooks集合和Workbook對(duì)象的方法來(lái)操作文件。1、打開Excel文件我們可以用Workbooks.Open方法打開一個(gè)Excel工作簿。Workbooks.Open(FileName,UpdateLinks,ReadOnly,Format,Password,WriteResPassword,IgnoreReadOnlyRecommended,Origin,Delimiter,Editable,Notify,Converter,AddToM
3、ru,Local,CorruptLoad)其中FileName是必選的參數(shù),表示要打開的工作簿名,如果沒(méi)有指定路徑,則代表當(dāng)前路徑。另外14個(gè)是可選參數(shù),除了密碼參數(shù),其他的一般很少用。具體的含義可以參看VBA的幫助。例:Workbooks.OpenF:test.xls可以打開F盤的test.xls文件。2、打開文本文件使用Open方法也可以打開文本文件,但建議使用OpenText方法。此方法是載入一個(gè)文本文件,并將其作為包含單個(gè)工作表的工作簿進(jìn)行分列處理,然后在此工作表中放入經(jīng)過(guò)分列處理的文本文件數(shù)據(jù)。完整語(yǔ)法如下:Workbooks.OpenText(FileName,Origin,Sta
4、rtRow,DataType,TextQualifier,ConsecutiveDelimiter,Tab,Semicolon,Comma,Space,Other,OtherChar,FieldInfo,TextVisualLayout,DecimalSeparator,ThousandsSeparator,TrailingMinusNumbers,Local)關(guān)于以上參數(shù)的具體含義可以參看VBA的幫助,這里就不重復(fù)了。在實(shí)際的編程中,一般無(wú)需對(duì)這些復(fù)雜的參數(shù)進(jìn)行處理??梢酝ㄟ^(guò)錄制宏來(lái)得到打開一個(gè)文本文件的VBA代碼。具體方法就是選擇文件打開”然后選擇打開文本文件,就會(huì)出現(xiàn)文本導(dǎo)入向?qū)?,一步?/p>
5、步執(zhí)行完,直到文本打開后,停止錄制。以下是錄制宏得到的代碼:SubMacro1()!Macro1Macro宏由MCSYSTEM錄制,時(shí)間:2007-3-29Workbooks.OpenTextFilename:=F:CallWindowProc.txt,Origin:=xlWindows,_StartRow:=1,DataType:=xlDelimited,TextQualifier:=xlDoubleQuote,_ConsecutiveDelimiter:=False,Tab:=True,Semicolon:=False,Comma:=False_,Space:=False,Other:=F
6、alse,FieldInfo:=Array(1,1),_TrailingMinusNumbers:=TrueEndSub在實(shí)際編程中只要做相應(yīng)的修改就可以使用了。3、打開其他文件利用Excel對(duì)象還可以打開XML文件和一些數(shù)據(jù)庫(kù)(如Access)文件,對(duì)應(yīng)XML文件,需要Excel2003以上的版本。OpenXML方法的語(yǔ)法如下:Workbooks.OpenXML(Filename,Stylesheets,LoadOption)FileNameString類型,必需。要打開的文件名。StylesheetsVariant類型,可選。單個(gè)值或值的數(shù)組,用于指定要應(yīng)用哪些XSL轉(zhuǎn)換(XSLT)樣式表
7、處理指令。LoadOptionVariant類型,轉(zhuǎn)換。指定Excel打開XML數(shù)據(jù)文件的方式可為XlXmlLoadOption常量之一。XlXmlLoadOption可為以下XlXmlLoadOption常量之一:xlXmlLoadImportToList將XML數(shù)據(jù)文件的內(nèi)容置于XML列表中。xIXmlLoadMapXml在XML結(jié)構(gòu)任務(wù)窗格中顯示XML數(shù)據(jù)文件的架構(gòu)。xlXmlLoadOpenXml打開XML數(shù)據(jù)文件。文件的內(nèi)容將展開。xlXmlLoadPromptUser提示用戶選擇打開文件的方式。示例下面的代碼打開了XML數(shù)據(jù)文件customers.xml并在XML列表中顯示了此文件
8、的內(nèi)容。SubUseOpenXML()Application.Workbooks.OpenXML_Filename:=customers.xml,_LoadOption:=xlXmlLoadImportToListEndSubOpenDatabase方法語(yǔ)法如下:Workbooks.OpenDatabase(FileName,CommandText,CommandType,BackgroundQuery,ImportDataAs)FileNameString類型,必需。連接字符串。CommandTextVariant類型,可選。查詢的命令文本。CommandTypeVariant類型,可選。查
9、詢的命令類型。以下是可用的命令類型:Default、SQL和Table。BackgroundQueryVariant類型,可選。查詢的背景。ImportDataAsVariant類型,可選。確定查詢的格式。示例本示例中,Excel打開了northwind.mdb文件。SubOpenDatabase()Workbooks.OpenDatabaseFileName:=C:northwind.mdbEndSub4、保存文件文件的保存使用Workbook對(duì)象的Save或SaveAs方法。Save方法使用簡(jiǎn)單,語(yǔ)法為expression.Save,expression是某個(gè)Workbook對(duì)象。如:Ac
10、tiveWorkbook.Save即保存當(dāng)前活動(dòng)工作簿。如果是第一次保存工作簿或要另存為,請(qǐng)使用SaveAs方法為該文件指定文件名。其語(yǔ)法為:expression.SaveAs(FileName,FileFormat,Password,WriteResPassword,ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution,AddToMru,TextCodepage,TextVisualLayout,Local)具體參數(shù)含義可參看VBA幫助,使用都比較簡(jiǎn)單。示例本示例新建一個(gè)工作簿,提示用戶輸入文件名,然后保存該工作簿。Se
11、tNewBook=Workbooks.AddDofName=Application.GetSaveAsFilenameLoopUntilfNameFalseNewBook.SaveAsFilename:=fNameApplication.GetSaveAsFilename為調(diào)出標(biāo)準(zhǔn)的“另存為”對(duì)話框,獲取用戶文件名,但并不真正保存任何文件,然后使用代碼保存文件。還有Application.GetOpenFileName可以調(diào)出標(biāo)準(zhǔn)的“打開”對(duì)話框。5、關(guān)閉文件關(guān)閉文件可以使用Workbooks集合或Workbook對(duì)象的Close方法。前者是關(guān)閉所有打開的工作簿,后者關(guān)閉特定的工作簿。Work
12、book對(duì)象的Close方法語(yǔ)法為:expression.Close(SaveChanges,Filename,RouteWorkbook)SaveChanges參數(shù)表示是否保存更改,對(duì)許多不需要更改的操作,可設(shè)置為False以免彈出保存更改提示的對(duì)話框。FileName可選。以此文件名保存所做的更改。RouteWorkbook可選。如果指定工作簿不需要傳送給下一個(gè)收件人(沒(méi)有傳送名單或已經(jīng)傳送),則忽略該參數(shù)。示例本示例關(guān)閉Book1.xls,并放棄所有對(duì)此工作簿的更改。Workbooks(BOOK1.XLS).CloseSaveChanges:=False本示例關(guān)閉所有打開的工作簿。如果某
13、個(gè)打開的工作簿有改變,MicrosoftExcel將顯示詢問(wèn)是否保存更改的對(duì)話框和相應(yīng)提示。Workbooks.Close6、綜合實(shí)例假如F盤有一個(gè)Excel文件test.xls,現(xiàn)在有另一個(gè)Excel文件要訪問(wèn)test.xls的數(shù)據(jù),我們來(lái)看用VBA代碼如何操作。代碼如下:PublicSubtest()Application.ScreenUpdating=FalseWorkbooks.Openf:test.xlsThisWorkbook.Sheets(1).Range(b1)=ActiveWorkbook.Sheets(1).Range(a2)ActiveWorkbook.CloseAppl
14、ication.ScreenUpdating=TrueEndSub首先關(guān)閉屏幕刷新,是為了防止test.xls在打開時(shí)被看見(jiàn)(有時(shí)候還是看的見(jiàn))。打開后,見(jiàn)test.xls的Sheetl的單元格A2中的值賦給當(dāng)前工作簿的Sheetl的單元格B2,然后關(guān)閉test.xls。當(dāng)要打開的工作簿不確定的時(shí)候,可以通過(guò)調(diào)用打開對(duì)話框來(lái)讓用戶自己選擇??筛臑槿缦拢篜ublicSubtest()Application.ScreenUpdating=FalseDimFilenameasStringFilename=Application.GetOpenFileNameWorkbooks.OpenFilenam
15、eThisWorkbook.Sheets(1).Range(b1)=ActiveWorkbook.Sheets(1).Range(a2)ActiveWorkbook.CloseApplication.ScreenUpdating=TrueEndSub7、總結(jié)利用Excel對(duì)象的方法進(jìn)行文件操作是最簡(jiǎn)單,也是最方便的,適合初學(xué)者。對(duì)于Excel文件格式,如果我們僅僅是讀取其表格中的內(nèi)容,這種方法也是首選。對(duì)于文本文件的操作,使用第二種方法比較方便,若要將文本轉(zhuǎn)換成表格,那么使用此方法也是合適的。丄Excel-VBA操作文件四大方法之二利用VBA文件處理語(yǔ)句來(lái)處理文件VBA包含了許多用于文件操作的
16、語(yǔ)句和函數(shù),可以滿足絕大多數(shù)情況下的文件操作要求。下面我們按照操作目的進(jìn)行一一介紹。(一)文件處理1.Name語(yǔ)句語(yǔ)法:NameoldpathnameAsnewpathname功能:重命名一個(gè)文件、目錄、或文件夾,移動(dòng)一個(gè)文件。說(shuō)明:在一個(gè)已打開的文件上使用Name,將會(huì)產(chǎn)生錯(cuò)誤。進(jìn)行文件操作時(shí),一定要注意錯(cuò)誤處理。示例:OnErrorResumeNext錯(cuò)誤處理Namef:TEST.xlsAsf:TEST123.xls重命名Namef:TEST.xlsAsf:dllTEST.xls移動(dòng)文件Namef:TEST.xlsAsd:TEST123.xls跨驅(qū)動(dòng)器移動(dòng)并重命名文件注意:Name不能移動(dòng)
17、一個(gè)目錄或文件夾。2、FileCopy語(yǔ)句語(yǔ)法:FileCopysource,destination功能:復(fù)制一個(gè)文件。說(shuō)明:如果對(duì)一個(gè)已打開的文件使用FileCopy語(yǔ)句,則會(huì)產(chǎn)生錯(cuò)誤。示例:FileCopyf:TEST.xls,e:TEST.xls從F盤復(fù)制TEST.xls到E盤3、Kill語(yǔ)句語(yǔ)法:Killpathname功能:從磁盤中刪除文件。說(shuō)明:Kill支持多字符(*)和單字符(?)的統(tǒng)配符來(lái)指定多重文件。如果使用Kill來(lái)刪除一個(gè)已打開的文件,則會(huì)產(chǎn)生錯(cuò)誤。示例:Killf:TEST.xls刪除F盤的TEST.xls文件Killf:*.xls刪除F盤所有xls文件4、GetAtt
18、r函數(shù)語(yǔ)法:GetAttr(pathname)功能:獲取一個(gè)文件、目錄、或文件夾的屬性。返回一個(gè)Integer值。返回值由GetAttr返回的值,是下面這些屬性值的總和:常數(shù)值描述vbNormal0常規(guī)vbReadOnly1只讀vbHidden2隱藏vbSystem4系統(tǒng)文件vbDirectory16目錄或文件夾vbArchive32存檔文件vbalias64指定的文件名是別名。只在Macintosh中可用。說(shuō)明:若要判斷是否設(shè)置了某個(gè)屬性,在GetAttr函數(shù)與想要得知的屬性值之間使用And運(yùn)算符與逐位比較。如果所得的結(jié)果不為零,則表示設(shè)置了這個(gè)屬性值。示例:Debug.PrintGetAt
19、tr(F:test.txt)若為存檔文件,在立即窗口可看到值為32Debug.PrintGetAttr(F:test.txt)將屬性高級(jí)可存檔文件的勾去掉后,值為0為判斷一個(gè)文件是否只讀,可用下法:Debug.PrintGetAttr(F:test.txt)AndvbReadOnly若值非零,說(shuō)明時(shí)只讀的。5、SetAttr語(yǔ)句語(yǔ)法:SetAttrpathname,attributes功能:為一個(gè)文件設(shè)置屬性。說(shuō)明:如果想要給一個(gè)已打開的文件設(shè)置屬性,則會(huì)產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。示例:SetAttrF:test.txt,vbHidden設(shè)置隱藏屬性。SetAttrF:test.txt,vbHidden
20、+vbReadOnly設(shè)置隱藏并只讀。6、FileLen函數(shù)語(yǔ)法:FileLen(pathname)功能:獲取一個(gè)文件的長(zhǎng)度,單位是字節(jié)。說(shuō)明:當(dāng)調(diào)用FileLen函數(shù)時(shí),不需要打開文件,如果所指定的文件已經(jīng)打開,則返回的值是這個(gè)文件在打開前的大小。7、FileDateTime函數(shù)語(yǔ)法:FileDateTime(pathname)功能:獲取一個(gè)文件被創(chuàng)建或最后修改后的日期和時(shí)間。示例:Debug.PrintFileDateTime(F:TEST.xls)在立即窗口可看到2007-3-2919:28:27二)目錄處理1、CurDir函數(shù)語(yǔ)法:CurDir(drive)功能:返回當(dāng)前的路徑。說(shuō)明:
21、drive參數(shù)是可選的,它指定一個(gè)存在的驅(qū)動(dòng)器。如果沒(méi)有指定驅(qū)動(dòng)器,或drive是零長(zhǎng)度字符串(),則CurDir會(huì)返回當(dāng)前驅(qū)動(dòng)器的路徑。示例:Debug.PrintCurDir返回CDocumentsandSettingsycMyDocuments。Debug.PrintCurDir(C)返回CDocumentsandSettingsycMyDocuments。Debug.PrintCurDir(D)返回D:。2、ChDir語(yǔ)句語(yǔ)法:ChDirpath功能:改變當(dāng)前的目錄或文件夾。說(shuō)明:ChDir語(yǔ)句改變?nèi)笔∧夸浳恢?,但不?huì)改變?nèi)笔◎?qū)動(dòng)器位置。缺省驅(qū)動(dòng)器一般是C。示例:ChDirD:temp
22、Debug.PrintCurDir返回CDocumentsandSettingsycMyDocuments0Debug.PrintCurDir(D)返回Dtemp。與上例比較,此時(shí)D盤的當(dāng)前目錄已經(jīng)變?yōu)镈temp”,但是缺省驅(qū)動(dòng)器還是C。3、ChDrive語(yǔ)句語(yǔ)法:ChDrivedrive功能:改變當(dāng)前的驅(qū)動(dòng)器。說(shuō)明:如果使用零長(zhǎng)度的字符串(),則當(dāng)前的驅(qū)動(dòng)器將不會(huì)改變。如果drive參數(shù)中有多個(gè)字符,則ChDrive只會(huì)使用首字母。示例:ChDriveDChDirD:tempDebug.PrintCurDir返回Dtemp。Debug.PrintCurDir(D)返回Dtemp。與上例比較,
23、用CurDir返回的是Dtemp”,當(dāng)前驅(qū)動(dòng)器已經(jīng)變?yōu)镈了。4、Dir函數(shù)語(yǔ)法:Dir(pathname,attributes)兩個(gè)參數(shù)都是可選的,attributes表示文件屬性。功能:返回一個(gè)文件名、目錄名或文件夾名稱,它必須與指定的模式或文件屬性、或磁盤卷標(biāo)相匹配。說(shuō)明:在第一次調(diào)用Dir函數(shù)時(shí),必須指定pathname,否則會(huì)產(chǎn)生錯(cuò)誤。如果也指定了文件屬性,那么就必須包括pathname。Dir會(huì)返回匹配pathname的第一個(gè)文件名。若想得到其它匹配pathname的文件名,再一次調(diào)用Dir,且不要使用參數(shù)。如果已沒(méi)有合乎條件的文件,則Dir會(huì)返回一個(gè)零長(zhǎng)度字符串()。一旦返回值為零
24、長(zhǎng)度字符串,并要再次調(diào)用Dir時(shí),就必須指定pathname,否則會(huì)產(chǎn)生錯(cuò)誤。不必訪問(wèn)到所有匹配當(dāng)前pathname的文件名,就可以改變到一個(gè)新的pathname上。但是,不能以遞歸方式來(lái)調(diào)用Dir函數(shù)。以vbDirectory屬性來(lái)調(diào)用Dir不能連續(xù)地返回子目錄。示例:Debug.PrintDir(F:TEST.xls)返回TEST.xlsDebug.PrintDir(F:*.xls)返回按條件第一個(gè)找到的文件名。Debug.PrintDir(F:*.txt,vbReadOnly)返回第一個(gè)只讀的txt文件以下過(guò)程可顯示C盤根目錄下的所有目錄.SubDirC()MyPath=c:MyName
25、=dir(MyPath,vbDirectory)找尋第一項(xiàng)。DoWhileMyName開始循環(huán)。跳過(guò)當(dāng)前的目錄及上層目錄。IfMyName.AndMyName.Then使用位比較來(lái)確定MyName代表一目錄。If(GetAttr(MyPath&MyName)AndvbDirectory)=vbDirectoryThenDebug.PrintMyName如果它是一個(gè)目錄,將其名稱顯示出來(lái)。EndIfEndIfMyName=dir查找下一個(gè)目錄。LoopEndSub以下過(guò)程利用遞歸可以查找目錄和子目錄下的所有文件。PublicSubFindFile(mPathAsString,OptionalsF
26、ileAsString=)OnErrorResumeNextDimsAsString,sDir()AsStringDimiAsLong,dAsLongIfRight(mPath,1)ThenmPath=mPath&EndIf查找目錄下的文件s=dir(mPath&sFile,vbArchive+vbDirectory+vbHidden+vbNormal+vbReadOnly+vbSystem)DoWhilesDebug.PrintmPath&ss=dirLoop查找目錄下的子目錄s=dir(mPath,vbArchive+vbDirectory+vbHidden+vbNormal+vbRead
27、Only+vbSystem)DoWhilesIfs.Ands.ThenIf(GetAttr(mPath&s)AndvbDirectory)=vbDirectoryThend=d+1ReDimPreservesDir(d)sDir(d)=mPath&sEndIfEndIfs=dirLoop開始遞歸Fori=1TodFindFilesDir(d)&NextEndSub5、MkDir語(yǔ)句語(yǔ)法:MkDirpath功能:創(chuàng)建一個(gè)新的目錄或文件夾。說(shuō)明:path可以包含驅(qū)動(dòng)器。如果沒(méi)有指定驅(qū)動(dòng)器,則MkDir會(huì)在當(dāng)前驅(qū)動(dòng)器上創(chuàng)建新的目錄或文件夾。示例:MkDirMYDIR在當(dāng)前目錄建立新的目錄或文件夾。6
28、、RmDir語(yǔ)句語(yǔ)法:RmDirpath功能:刪除一個(gè)存在的目錄或文件夾。說(shuō)明:如果想要使用RmDir來(lái)刪除一個(gè)含有文件的目錄或文件夾,則會(huì)發(fā)生錯(cuò)誤。在試圖刪除目錄或文件夾之前,先使用Kill語(yǔ)句來(lái)刪除所有文件。示例:RmDirMYDIR將MYDIR刪除。(三)處理文本文件1、Open語(yǔ)句語(yǔ)法:OpenpathnameFormodeAccessaccesslockAs#filenumberLen=reclength其中access、lock、reclength為可選參數(shù),一般不用。mode指定打開文件的方式。有5種:Input:以輸入方式打開,即讀取方式。Output:以輸出方式打開,即寫入方
29、式。Append:以追加方式打開,即添加內(nèi)容到文件末尾。Binary:以二進(jìn)制方式打開。Random:以隨機(jī)方式打開,如果未指定方式,則以Random方式打開文件。filenumber是一個(gè)有效的文件號(hào),范圍在1到511之間??梢灾付?,也可使用FreeFile函數(shù)可得到下一個(gè)可用的文件號(hào)。說(shuō)明:如果pathname指定的文件不存在,那么,在用Append、Binary、Output、或Random方式打開文件時(shí),可以建立這一文件。示例:OpenF:TEST.txtForInputAs#1以輸入方式打開OpenF:TEST.xlsForBinaryAs#1以二進(jìn)制方式打開2、Close語(yǔ)句語(yǔ)法:
30、Closefilenumberlistfilenumberlist參數(shù)為一個(gè)或多個(gè)文件號(hào),若省略filenumberlist,則將關(guān)閉Open語(yǔ)句打開的所有活動(dòng)文件。說(shuō)明:打開文件后,必須在使用完后關(guān)閉文件。示例:DimI,FileNameForI=1To3FileName=TEST&I創(chuàng)建文件名。OpenFileNameForOutputAs#I打開文件。Print#I,Thisisatest.將字符串寫入文件。NextIClose將三個(gè)已打開的文件全部關(guān)閉。3、Reset語(yǔ)句語(yǔ)法:Reset功能:關(guān)閉所有用Open語(yǔ)句打開的磁盤文件。說(shuō)明:Reset語(yǔ)句關(guān)閉Open語(yǔ)句打開的所有活動(dòng)文件,
31、并將文件緩沖區(qū)的所有內(nèi)容寫入磁盤。示例:DimFileNumberForFileNumber=1To5OpenTEST&FileNumberForOutputAs#FileNumberWrite#FileNumber,HelloWorld將數(shù)據(jù)寫入文件。NextFileNumberReset關(guān)閉文件并將緩沖區(qū)內(nèi)的數(shù)據(jù)寫到磁盤中。4、FreeFile函數(shù)語(yǔ)法:FreeFile(rangenumber)參數(shù)rangenumber指定一個(gè)范圍,以便返回該范圍之內(nèi)的下一個(gè)可用文件號(hào)。指定0(缺省值)則返回一個(gè)介于1-255之間的文件號(hào)。指定1則返回一個(gè)介于256-511之間的文件號(hào)。功能:提供一個(gè)尚未
32、使用的文件號(hào)。示例:DimfnumAsIntegerfnum=FreeFileOpenF:TEST.txtForInputAs#fnumClose#fnum5、EOF函數(shù)語(yǔ)法:EOF(filenumber)功能:返回一個(gè)Integer,它包含Boolean值True,表明已經(jīng)到達(dá)為Random或順序Input打開的文件的結(jié)尾。6、LOF函數(shù)語(yǔ)法:LOF(filenumber)功能:返回一個(gè)Long,表示用Open語(yǔ)句打開的文件的大小,該大小以字節(jié)為單位。7、Loc函數(shù)語(yǔ)法:LOc(filenumber)功能:返回一個(gè)Long,在已打開的文件中指定當(dāng)前讀/寫位置。8、Input#語(yǔ)句語(yǔ)法:Inp
33、ut#filenumber,varlist功能:從已打開的順序文件中讀出數(shù)據(jù)并將數(shù)據(jù)指定給變量。說(shuō)明:通常用Write#將Input#語(yǔ)句讀出的數(shù)據(jù)寫入文件。為了能夠用Input#語(yǔ)句將文件的數(shù)據(jù)正確讀入到變量中,在將數(shù)據(jù)寫入文件時(shí),要使用Write#語(yǔ)句而不使用Print#語(yǔ)句。使用Write#語(yǔ)句可以確保將各個(gè)單獨(dú)的數(shù)據(jù)域正確分隔開。示例:本示例使用Input#語(yǔ)句將文件內(nèi)的數(shù)據(jù)讀入兩個(gè)變量中。本示例假設(shè)TESTFILE文件內(nèi)含數(shù)行以Write#語(yǔ)句寫入的數(shù)據(jù);也就是說(shuō),每一行數(shù)據(jù)中的字符串部分都是用雙引號(hào)括起來(lái),而與數(shù)字用逗號(hào)隔開,例如,(Hello,234)。DimMyString,M
34、yNumberOpenTESTFILEForInputAs#1打開輸入文件。DoWhileNotEOF(1)循環(huán)至文件尾。Input#1,MyString,MyNumber將數(shù)據(jù)讀入兩個(gè)變量。Debug.PrintMyString,MyNumber在立即窗口中顯示數(shù)據(jù)。LoopClose#1關(guān)閉文件。9、Write#語(yǔ)句語(yǔ)法:Write#filenumber,outputlist功能:將數(shù)據(jù)寫入順序文件。說(shuō)明:通常用Input#從文件讀出Write#寫入的數(shù)據(jù)。如果省略outputlist,并在filenumber之后加上一個(gè)逗號(hào),則會(huì)將一個(gè)空白行打印到文件中。多個(gè)表達(dá)式之間可用空白、分號(hào)或逗
35、號(hào)隔開??瞻缀头痔?hào)等效。用Write#將數(shù)據(jù)寫入文件時(shí)將遵循幾個(gè)通用的約定,使得無(wú)論什么區(qū)域都可用Input#讀出并正確解釋數(shù)據(jù):在寫入數(shù)值數(shù)據(jù)時(shí)總使用句號(hào)作為十進(jìn)制分隔符。對(duì)于Boolean類型的數(shù)據(jù),或者打印#TRUE#或者打印#FALSE#。無(wú)論在什么地區(qū),都不將True和False這兩個(gè)關(guān)鍵字翻譯出來(lái)。使用通用的日期格式將Date類型的數(shù)據(jù)寫入文件中。當(dāng)日期或時(shí)間的部件丟失或?yàn)榱銜r(shí),只將現(xiàn)有部分寫入文件中。如果outputlist的數(shù)據(jù)為Empty,則不將任何數(shù)據(jù)寫入文件。但對(duì)Null數(shù)據(jù),則要寫入#NULL#。如果outputlist數(shù)據(jù)為Null數(shù)據(jù),則將#NULL#寫入文件中。對(duì)
36、于Error類型的數(shù)據(jù),輸出看起來(lái)與#ERRORerrorcode#一樣。無(wú)論在什么地區(qū),都不將關(guān)鍵字Error翻譯出來(lái)。與Print#語(yǔ)句不同,當(dāng)要將數(shù)據(jù)寫入文件時(shí),Write#語(yǔ)句會(huì)在項(xiàng)目和用來(lái)標(biāo)記字符串的引號(hào)之間插入逗號(hào)。沒(méi)有必要在列表中鍵入明確的分界符。Write#語(yǔ)句在將outputlist中的最后一個(gè)字符寫入文件后會(huì)插入一個(gè)新行字符,即回車換行符,(Chr(13)+Chr(10)。示例:OpenF:test.txtForOutputAs#1打開輸出文件。Write#1,HelloWorld,1234寫入以逗號(hào)隔開的數(shù)據(jù)。Write#1,寫入空白行。DimMyBool,MyDate,
37、MyNull,MyError賦值Boolean、Date、Null及Error等。MyBool=False:MyDate=#February12,1969#:MyNull=NullMyError=CVErr(32767)Boolean數(shù)據(jù)以#TRUE#或#FALSE#的格式寫入。日期以通用日期格式寫入,例如:#1994-07-13#代表1994年1月13日。Null數(shù)據(jù)以#NULL#格式寫入。Error數(shù)據(jù)以#ERROR錯(cuò)誤代號(hào)#的格式寫入。Write#1,MyBool;isaBooleanvalueWrite#1,MyDate;isadateWrite#1,MyNull;isanullval
38、ueWrite#1,MyError;isanerrorvalueClose#1關(guān)閉文件。我們可以看到寫入的內(nèi)容為:HelloWorld,1234#FALSE#,isaBooleanvalue#1969-02-12#,isadate#NULL#,isanullvalue#ERROR32767#,isanerrorvalue10、LineInput#語(yǔ)句語(yǔ)法:LineInput#filenumber,varname功能:從已打開的順序文件中讀出一行并將它分配給String變量。說(shuō)明:通常用Print#與LineInput#語(yǔ)句配合使用。LineInput#語(yǔ)句一次只從文件中讀出一個(gè)字符,直到遇到回
39、車符(Chr(13)或回車-換行符(Chr(13)+Chr(10)為止?;剀?換行符將被跳過(guò),而不會(huì)被附加到字符串上。示例:DimTextLineOpenTESTFILEForInputAs#1打開文件。DoWhileNotEOF(1)循環(huán)至文件尾。LineInput#1,TextLine讀入一行數(shù)據(jù)并將其賦予某變量。Debug.PrintTextLine在立即窗口中顯示數(shù)據(jù)。LoopClose#1關(guān)閉文件。11、Input函數(shù)語(yǔ)法:Input(number,#filenumber)其中number指定要返回的字符個(gè)數(shù)。功能:返回String,它包含以Input或Binary方式打開的文件中的
40、字符。說(shuō)明:通常用Print#或Put將Input函數(shù)讀出的數(shù)據(jù)寫入文件。Input函數(shù)只用于以Input或Binary方式打開的文件。與Input#語(yǔ)句不同,Input函數(shù)返回它所讀出的所有字符,包括逗號(hào)、回車符、空白列、換行符、引號(hào)和前導(dǎo)空格等。示例:DimMyCharOpenf:test.txtForInputAs#1DoWhileNotEOF(1)循環(huán)至文件尾。MyChar=Input(1,#1)讀入一個(gè)字符。Debug.PrintMyChar顯示到立即窗口。LoopClose#1下面這個(gè)函數(shù)可以將文本文件的數(shù)據(jù)一次讀入到一個(gè)字符串(但是若包含中文時(shí)會(huì)出錯(cuò),因?yàn)橐粋€(gè)中文字占2個(gè)字節(jié))。
41、PublicFunctionReadText(FileNameAsString)Dimfnum%,isopenAsBooleanOnErrorGoToerrofnum=FreeFile()OpenFileNameForInputAs#fnumisopen=TrueReadText=Input(LOF(fnum),fnum)erro:IfisopenThenClose#fnumIferrThenDebug.Printerr.Number,err.DescriptionEndFunction12、Print#語(yǔ)句語(yǔ)法:Print#filenumber,outputlistoutputlist參數(shù)的
42、設(shè)置如下:Spc(n)|Tab(n)expressioncharposSpc(n)用來(lái)在輸出數(shù)據(jù)中插入空白字符,而n指的是要插入的空白字符數(shù)。Tab(n)用來(lái)將插入點(diǎn)定位在某一絕對(duì)列號(hào)上,這里,n是列號(hào)。使用無(wú)參數(shù)的Tab將插入點(diǎn)定位在下一個(gè)打印區(qū)的起始位置。expression要打印的數(shù)值表達(dá)式或字符串表達(dá)式。charpos指定下一個(gè)字符的插入點(diǎn)。使用分號(hào)將插入點(diǎn)定位在上一個(gè)顯示字符之后。用Tab(n)將插入點(diǎn)定位在某一絕對(duì)的列號(hào)上,用無(wú)參數(shù)的Tab將插入點(diǎn)定位在下一個(gè)打印區(qū)的起始處。如果省略charpos,則在下一行打印下一個(gè)字符。功能:將格式化顯示的數(shù)據(jù)寫入順序文件中。說(shuō)明:通常用Lin
43、eInput#或Input讀出Print#在文件中寫入的數(shù)據(jù)示例:OpenF:test.txtForOutputAs#1打開輸出文件。Print#1,Thisisatest將文本數(shù)據(jù)寫入文件。Print#1,Print#1,Zone1;Tab;Zone2Print#1,Hello;WorldPrint#1,Spc(5);5leadingspacesPrint#1,Print#1,Zone1;Tab;Zone2Print#1,Hello;WorldPrint#1,Spc(5);5leadingspacesPrint#1,Tab(10);Hello數(shù)據(jù)寫入兩個(gè)區(qū)(printzones)。以空格隔開
44、兩個(gè)字符串。在字符串之前寫入五個(gè)空格。將數(shù)據(jù)寫在第十列。賦值Boolean、Date、Null及Error等。DimMyBool,MyDate,MyNull,MyErrorMyBool=False:MyDate=#2/12/1969#:MyNull=NullMyError=CVErr(32767)True、False、Null及Error會(huì)根據(jù)系統(tǒng)的地區(qū)設(shè)置自動(dòng)轉(zhuǎn)換格式日期將以標(biāo)準(zhǔn)的短式日期的格式顯示。Print#1,MyBool;isaBooleanvaluePrint#1,MyDate;isadatePrint#1,MyNull;isanullvaluePrint#1,MyError;is
45、anerrorvalueClose#1以上代碼寫入的內(nèi)容如下:ThisisatestZone1Zone2HelloWorld5leadingspacesHelloFalseisaBooleanvalue1969-2-12isadateNullisanullvalueError32767isanerrorvalue13、Width#語(yǔ)句語(yǔ)法:Width#filenumber,widthwidth必要。范圍在0-255之間的數(shù)值表達(dá)式,在新的一行開始之前,指出在該行上可出現(xiàn)多少字符。如果width等于0,則行的長(zhǎng)度不受限制。width的缺省值為0。功能:將一個(gè)輸出行的寬度指定給用Open語(yǔ)句打開的
46、文件。示例:DimIOpenf:TESTFILE.txtForOutputAs#1Width#1,5ForI=0To9Width#1,5ForI=0To9Print#1,Chr(48+I);NextI設(shè)置輸出行寬為5。循環(huán)10次。每行輸出五個(gè)字符。Close#1以上代碼寫入的內(nèi)容如下0123456789(四)處理二進(jìn)制文件打開二進(jìn)制文件可以使用Open語(yǔ)句的Random和Binary方式打開。二進(jìn)制文件讀寫使用Get和Put語(yǔ)句。1、Put語(yǔ)句語(yǔ)法:Put#filenumber,recnumber,varnamerecnumber可選。Variant(Long)。記錄號(hào)(Random方式的文件
47、)或字節(jié)數(shù)(Binary方式的文件),指明在此處開始寫入。說(shuō)明:通常用Get將Put寫入的文件數(shù)據(jù)讀出來(lái)。示例:DimnumAsLong,textAsStringnum=12345text=astringOpenf:data.binForBinaryAs#1打開或創(chuàng)建一個(gè)二進(jìn)制文件Put#1,numPut#1,textClose#1寫入4個(gè)字節(jié)寫入8個(gè)字節(jié)(字符串長(zhǎng)為8)2、Get語(yǔ)句語(yǔ)法:Get#filenumber,recnumber,varnamerecnumber可選。Variant(Long)。記錄號(hào)(Random方式的文件)或字節(jié)數(shù)(Binary方式的文件),以表示在此處開始讀出數(shù)
48、據(jù)。功能:將一個(gè)已打開的磁盤文件讀入一個(gè)變量之中。說(shuō)明:通常用Put將Get讀出的數(shù)據(jù)寫入一個(gè)文件。示例:讀取以上代碼寫入的內(nèi)容DimnumAsLong,textAsStringOpenf:data.binForBinaryAs#1Get#1,numtext=Space$(8)準(zhǔn)備8個(gè)字節(jié)的字符串Get#1,text讀入Debug.Printnum,textClose#1在立即窗口可以看到如下內(nèi)容:12345astring3、Seek語(yǔ)句語(yǔ)法:Seek#filenumber,position其中position為介于12,147,483,647(相當(dāng)于2人31-1)之間的數(shù)字,指出下一個(gè)讀寫操
49、作將要發(fā)生的位置。功能:在Open語(yǔ)句打開的文件中,設(shè)置下一個(gè)讀/寫操作的位置。說(shuō)明:可以用Seek語(yǔ)句指定Get語(yǔ)句的讀取位置,但在Get及Put語(yǔ)句中指定的記錄號(hào)將覆蓋由Seek語(yǔ)句指定的文件位置。示例:DimMaxSize,NextChar,MyCharOpenTESTFILEForInputAs#1MaxSize=LOF(1)取得文件的總字符數(shù)。用循環(huán)讀入所有記錄,但是從最后的記錄開始往前讀。ForNextChar=MaxSizeTo1Step-1Seek#1,NextChar設(shè)置讀寫位置。MyChar=Input(1,#1)讀入一字符。NextNextCharClose#14、See
50、k函數(shù)語(yǔ)法:Seek(filenumber)功能:返回一個(gè)Long,在Open語(yǔ)句打開的文件中指定當(dāng)前的讀/寫位置。說(shuō)明:在使用Get語(yǔ)句讀取文件時(shí),必須用LOF函數(shù)來(lái)判斷是否到達(dá)文件末尾,而不是用EOF函數(shù)??梢允褂肧eek函數(shù)判斷當(dāng)前位置,然后與LOF的值比較。示例:DoWhileSeek(1)LOF(1)繼續(xù)讀取Loop(五)總結(jié)VBA語(yǔ)句的文件操作涵蓋了文件操作的絕大部分內(nèi)容,很多函數(shù)的使用也很簡(jiǎn)單,一般的文件讀寫也非常方便,特別是對(duì)文本文件。但對(duì)于復(fù)雜的文件讀寫,代碼的結(jié)構(gòu)和維護(hù)性都不好。因此在VB6之后,微軟引入了FileSystemObject對(duì)象模型,提供了面向?qū)ο蟮念悗?kù),來(lái)操作驅(qū)動(dòng)器、文件夾和文件。但對(duì)于二進(jìn)制文件的操作,目前還只能用VBA語(yǔ)句。Excel文件本身就是二進(jìn)制文件,它使用的文件格式叫做BIFF(BinaryInterchangeFileFormat),即二進(jìn)制可交換文件格式(但2007開始使用OOXML格式)。關(guān)于其內(nèi)部的結(jié)構(gòu),本人也在研究中。以二進(jìn)制結(jié)構(gòu)打開Excel文件,不但可以讀取其表格中的數(shù)據(jù),還可以讀取其所有的信息(包括密碼)。注意,以O(shè)pen語(yǔ)句打開文件,并不是我們通常的雙擊一個(gè)文件打開顯示到屏幕上,而是將其存放在磁盤上的數(shù)據(jù)讀入到緩沖區(qū),不是可視化的打開。這種打開是不需要密碼的,即使你的Excel
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國(guó)電子熱管理產(chǎn)品行業(yè)營(yíng)銷創(chuàng)新戰(zhàn)略制定與實(shí)施研究報(bào)告
- 新形勢(shì)下紙質(zhì)文具行業(yè)快速做大市場(chǎng)規(guī)模戰(zhàn)略制定與實(shí)施研究報(bào)告
- 2025-2030年中國(guó)銅板帶箔材行業(yè)資本規(guī)劃與股權(quán)融資戰(zhàn)略制定與實(shí)施研究報(bào)告
- 《花鐘》教案設(shè)計(jì)與教學(xué)策略詳解
- 廣西賀州市八步區(qū)2023-2024學(xué)年五年級(jí)上學(xué)期英語(yǔ)期末試卷
- 二年級(jí)數(shù)學(xué)計(jì)算題專項(xiàng)練習(xí)1000題匯編集錦
- 床具產(chǎn)品知識(shí)培訓(xùn)課件
- 二零二五年度建筑垃圾清運(yùn)勞務(wù)分包協(xié)議3篇
- 二零二五年度建材城商鋪?zhàn)赓U合同廣告位租賃及收益分成協(xié)議3篇
- 2025版加油站高品質(zhì)油品供應(yīng)與倉(cāng)儲(chǔ)管理合同3篇
- 0-3歲嬰幼兒基礎(chǔ)護(hù)理智慧樹知到期末考試答案章節(jié)答案2024年杭州師范大學(xué)
- 工商企業(yè)管理畢業(yè)論文范文(篇一)
- 電動(dòng)叉車充電區(qū)安全規(guī)程
- 手術(shù)室中心吸引突然停止的應(yīng)急預(yù)案
- 選礦廠管理新規(guī)制度匯編
- G -B- 43630-2023 塔式和機(jī)架式服務(wù)器能效限定值及能效等級(jí)(正式版)
- 工作總結(jié)中的不足之處
- 電科院:儲(chǔ)能構(gòu)網(wǎng)控制及并網(wǎng)測(cè)試
- 廣東省初級(jí)中學(xué)學(xué)生學(xué)籍表
- 生鮮超市供貨超市供貨服務(wù)方案
- 銀行營(yíng)銷拆遷戶活動(dòng)方案
評(píng)論
0/150
提交評(píng)論