版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、丄Excel-VBA操作文件四大方法之一利用Excel對象來處理文件在我們?nèi)粘J褂肊xcel的時候,不僅會用到當(dāng)前Excel文件的數(shù)據(jù),還經(jīng)常需要訪問其他的數(shù)據(jù)文件。這些數(shù)據(jù)文件可能是Excel文件、文本文件或數(shù)據(jù)庫文件等。經(jīng)常有朋友會問如何在vba代碼里操作這些數(shù)據(jù)文件?本文就系統(tǒng)地介紹一下在Excel中應(yīng)用VBA操作數(shù)據(jù)文件的方法。本文主要介紹四種常用的方法:1、利用Excel對象來處理文件;2、利用VBA文件處理語句來處理文件;3、利用FileSystemObject對象來處理文件;4、利用API函數(shù)來處理文件。當(dāng)然對于數(shù)據(jù)庫文件,還可以利用ADO+SQL的方法操作,不過論壇已經(jīng)有前輩詳
2、細(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,AddToM
3、ru,Local,CorruptLoad)其中FileName是必選的參數(shù),表示要打開的工作簿名,如果沒有指定路徑,則代表當(dāng)前路徑。另外14個是可選參數(shù),除了密碼參數(shù),其他的一般很少用。具體的含義可以參看VBA的幫助。例:Workbooks.OpenF:test.xls可以打開F盤的test.xls文件。2、打開文本文件使用Open方法也可以打開文本文件,但建議使用OpenText方法。此方法是載入一個文本文件,并將其作為包含單個工作表的工作簿進(jìn)行分列處理,然后在此工作表中放入經(jīng)過分列處理的文本文件數(shù)據(jù)。完整語法如下: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ù)了。在實際的編程中,一般無需對這些復(fù)雜的參數(shù)進(jìn)行處理??梢酝ㄟ^錄制宏來得到打開一個文本文件的VBA代碼。具體方法就是選擇文件打開”然后選擇打開文本文件,就會出現(xiàn)文本導(dǎo)入向?qū)В徊揭?/p>
5、步執(zhí)行完,直到文本打開后,停止錄制。以下是錄制宏得到的代碼:SubMacro1()!Macro1Macro宏由MCSYSTEM錄制,時間: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在實際編程中只要做相應(yīng)的修改就可以使用了。3、打開其他文件利用Excel對象還可以打開XML文件和一些數(shù)據(jù)庫(如Access)文件,對應(yīng)XML文件,需要Excel2003以上的版本。OpenXML方法的語法如下:Workbooks.OpenXML(Filename,Stylesheets,LoadOption)FileNameString類型,必需。要打開的文件名。StylesheetsVariant類型,可選。單個值或值的數(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方法語法如下: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對象的Save或SaveAs方法。Save方法使用簡單,語法為expression.Save,expression是某個Workbook對象。如:Ac
10、tiveWorkbook.Save即保存當(dāng)前活動工作簿。如果是第一次保存工作簿或要另存為,請使用SaveAs方法為該文件指定文件名。其語法為:expression.SaveAs(FileName,FileFormat,Password,WriteResPassword,ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution,AddToMru,TextCodepage,TextVisualLayout,Local)具體參數(shù)含義可參看VBA幫助,使用都比較簡單。示例本示例新建一個工作簿,提示用戶輸入文件名,然后保存該工作簿。Se
11、tNewBook=Workbooks.AddDofName=Application.GetSaveAsFilenameLoopUntilfNameFalseNewBook.SaveAsFilename:=fNameApplication.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)閉特定的工作簿。Work
12、book對象的Close方法語法為:expression.Close(SaveChanges,Filename,RouteWorkbook)SaveChanges參數(shù)表示是否保存更改,對許多不需要更改的操作,可設(shè)置為False以免彈出保存更改提示的對話框。FileName可選。以此文件名保存所做的更改。RouteWorkbook可選。如果指定工作簿不需要傳送給下一個收件人(沒有傳送名單或已經(jīng)傳送),則忽略該參數(shù)。示例本示例關(guān)閉Book1.xls,并放棄所有對此工作簿的更改。Workbooks(BOOK1.XLS).CloseSaveChanges:=False本示例關(guān)閉所有打開的工作簿。如果某
13、個打開的工作簿有改變,MicrosoftExcel將顯示詢問是否保存更改的對話框和相應(yīng)提示。Workbooks.Close6、綜合實例假如F盤有一個Excel文件test.xls,現(xiàn)在有另一個Excel文件要訪問test.xls的數(shù)據(jù),我們來看用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在打開時被看見(有時候還是看的見)。打開后,見test.xls的Sheetl的單元格A2中的值賦給當(dāng)前工作簿的Sheetl的單元格B2,然后關(guān)閉test.xls。當(dāng)要打開的工作簿不確定的時候,可以通過調(diào)用打開對話框來讓用戶自己選擇??筛臑槿缦拢篜ublicSubtest()Application.ScreenUpdating=FalseDimFilenameasStringFilename=Application.GetOpenFileNameWorkbooks.OpenFilenam
15、eThisWorkbook.Sheets(1).Range(b1)=ActiveWorkbook.Sheets(1).Range(a2)ActiveWorkbook.CloseApplication.ScreenUpdating=TrueEndSub7、總結(jié)利用Excel對象的方法進(jìn)行文件操作是最簡單,也是最方便的,適合初學(xué)者。對于Excel文件格式,如果我們僅僅是讀取其表格中的內(nèi)容,這種方法也是首選。對于文本文件的操作,使用第二種方法比較方便,若要將文本轉(zhuǎn)換成表格,那么使用此方法也是合適的。丄Excel-VBA操作文件四大方法之二利用VBA文件處理語句來處理文件VBA包含了許多用于文件操作的
16、語句和函數(shù),可以滿足絕大多數(shù)情況下的文件操作要求。下面我們按照操作目的進(jìn)行一一介紹。(一)文件處理1.Name語句語法:NameoldpathnameAsnewpathname功能:重命名一個文件、目錄、或文件夾,移動一個文件。說明:在一個已打開的文件上使用Name,將會產(chǎn)生錯誤。進(jìn)行文件操作時,一定要注意錯誤處理。示例:OnErrorResumeNext錯誤處理Namef:TEST.xlsAsf:TEST123.xls重命名Namef:TEST.xlsAsf:dllTEST.xls移動文件Namef:TEST.xlsAsd:TEST123.xls跨驅(qū)動器移動并重命名文件注意:Name不能移動
17、一個目錄或文件夾。2、FileCopy語句語法:FileCopysource,destination功能:復(fù)制一個文件。說明:如果對一個已打開的文件使用FileCopy語句,則會產(chǎn)生錯誤。示例:FileCopyf:TEST.xls,e:TEST.xls從F盤復(fù)制TEST.xls到E盤3、Kill語句語法:Killpathname功能:從磁盤中刪除文件。說明:Kill支持多字符(*)和單字符(?)的統(tǒng)配符來指定多重文件。如果使用Kill來刪除一個已打開的文件,則會產(chǎn)生錯誤。示例:Killf:TEST.xls刪除F盤的TEST.xls文件Killf:*.xls刪除F盤所有xls文件4、GetAtt
18、r函數(shù)語法:GetAttr(pathname)功能:獲取一個文件、目錄、或文件夾的屬性。返回一個Integer值。返回值由GetAttr返回的值,是下面這些屬性值的總和:常數(shù)值描述vbNormal0常規(guī)vbReadOnly1只讀vbHidden2隱藏vbSystem4系統(tǒng)文件vbDirectory16目錄或文件夾vbArchive32存檔文件vbalias64指定的文件名是別名。只在Macintosh中可用。說明:若要判斷是否設(shè)置了某個屬性,在GetAttr函數(shù)與想要得知的屬性值之間使用And運(yùn)算符與逐位比較。如果所得的結(jié)果不為零,則表示設(shè)置了這個屬性值。示例:Debug.PrintGetAt
19、tr(F:test.txt)若為存檔文件,在立即窗口可看到值為32Debug.PrintGetAttr(F:test.txt)將屬性高級可存檔文件的勾去掉后,值為0為判斷一個文件是否只讀,可用下法:Debug.PrintGetAttr(F:test.txt)AndvbReadOnly若值非零,說明時只讀的。5、SetAttr語句語法:SetAttrpathname,attributes功能:為一個文件設(shè)置屬性。說明:如果想要給一個已打開的文件設(shè)置屬性,則會產(chǎn)生運(yùn)行時錯誤。示例:SetAttrF:test.txt,vbHidden設(shè)置隱藏屬性。SetAttrF:test.txt,vbHidden
20、+vbReadOnly設(shè)置隱藏并只讀。6、FileLen函數(shù)語法:FileLen(pathname)功能:獲取一個文件的長度,單位是字節(jié)。說明:當(dāng)調(diào)用FileLen函數(shù)時,不需要打開文件,如果所指定的文件已經(jīng)打開,則返回的值是這個文件在打開前的大小。7、FileDateTime函數(shù)語法:FileDateTime(pathname)功能:獲取一個文件被創(chuàng)建或最后修改后的日期和時間。示例:Debug.PrintFileDateTime(F:TEST.xls)在立即窗口可看到2007-3-2919:28:27二)目錄處理1、CurDir函數(shù)語法:CurDir(drive)功能:返回當(dāng)前的路徑。說明:
21、drive參數(shù)是可選的,它指定一個存在的驅(qū)動器。如果沒有指定驅(qū)動器,或drive是零長度字符串(),則CurDir會返回當(dāng)前驅(qū)動器的路徑。示例:Debug.PrintCurDir返回CDocumentsandSettingsycMyDocuments。Debug.PrintCurDir(C)返回CDocumentsandSettingsycMyDocuments。Debug.PrintCurDir(D)返回D:。2、ChDir語句語法:ChDirpath功能:改變當(dāng)前的目錄或文件夾。說明:ChDir語句改變?nèi)笔∧夸浳恢?,但不會改變?nèi)笔◎?qū)動器位置。缺省驅(qū)動器一般是C。示例:ChDirD:temp
22、Debug.PrintCurDir返回CDocumentsandSettingsycMyDocuments0Debug.PrintCurDir(D)返回Dtemp。與上例比較,此時D盤的當(dāng)前目錄已經(jīng)變?yōu)镈temp”,但是缺省驅(qū)動器還是C。3、ChDrive語句語法:ChDrivedrive功能:改變當(dāng)前的驅(qū)動器。說明:如果使用零長度的字符串(),則當(dāng)前的驅(qū)動器將不會改變。如果drive參數(shù)中有多個字符,則ChDrive只會使用首字母。示例:ChDriveDChDirD:tempDebug.PrintCurDir返回Dtemp。Debug.PrintCurDir(D)返回Dtemp。與上例比較,
23、用CurDir返回的是Dtemp”,當(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會返回一個零長度字符串()。一旦返回值為零
24、長度字符串,并要再次調(diào)用Dir時,就必須指定pathname,否則會產(chǎn)生錯誤。不必訪問到所有匹配當(dāng)前pathname的文件名,就可以改變到一個新的pathname上。但是,不能以遞歸方式來調(diào)用Dir函數(shù)。以vbDirectory屬性來調(diào)用Dir不能連續(xù)地返回子目錄。示例:Debug.PrintDir(F:TEST.xls)返回TEST.xlsDebug.PrintDir(F:*.xls)返回按條件第一個找到的文件名。Debug.PrintDir(F:*.txt,vbReadOnly)返回第一個只讀的txt文件以下過程可顯示C盤根目錄下的所有目錄.SubDirC()MyPath=c:MyName
25、=dir(MyPath,vbDirectory)找尋第一項。DoWhileMyName開始循環(huán)。跳過當(dāng)前的目錄及上層目錄。IfMyName.AndMyName.Then使用位比較來確定MyName代表一目錄。If(GetAttr(MyPath&MyName)AndvbDirectory)=vbDirectoryThenDebug.PrintMyName如果它是一個目錄,將其名稱顯示出來。EndIfEndIfMyName=dir查找下一個目錄。LoopEndSub以下過程利用遞歸可以查找目錄和子目錄下的所有文件。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語句語法:MkDirpath功能:創(chuàng)建一個新的目錄或文件夾。說明:path可以包含驅(qū)動器。如果沒有指定驅(qū)動器,則MkDir會在當(dāng)前驅(qū)動器上創(chuàng)建新的目錄或文件夾。示例:MkDirMYDIR在當(dāng)前目錄建立新的目錄或文件夾。6
28、、RmDir語句語法:RmDirpath功能:刪除一個存在的目錄或文件夾。說明:如果想要使用RmDir來刪除一個含有文件的目錄或文件夾,則會發(fā)生錯誤。在試圖刪除目錄或文件夾之前,先使用Kill語句來刪除所有文件。示例:RmDirMYDIR將MYDIR刪除。(三)處理文本文件1、Open語句語法:OpenpathnameFormodeAccessaccesslockAs#filenumberLen=reclength其中access、lock、reclength為可選參數(shù),一般不用。mode指定打開文件的方式。有5種:Input:以輸入方式打開,即讀取方式。Output:以輸出方式打開,即寫入方
29、式。Append:以追加方式打開,即添加內(nèi)容到文件末尾。Binary:以二進(jìn)制方式打開。Random:以隨機(jī)方式打開,如果未指定方式,則以Random方式打開文件。filenumber是一個有效的文件號,范圍在1到511之間??梢灾付ǎ部墒褂肍reeFile函數(shù)可得到下一個可用的文件號。說明:如果pathname指定的文件不存在,那么,在用Append、Binary、Output、或Random方式打開文件時,可以建立這一文件。示例:OpenF:TEST.txtForInputAs#1以輸入方式打開OpenF:TEST.xlsForBinaryAs#1以二進(jìn)制方式打開2、Close語句語法:
30、Closefilenumberlistfilenumberlist參數(shù)為一個或多個文件號,若省略filenumberlist,則將關(guān)閉Open語句打開的所有活動文件。說明:打開文件后,必須在使用完后關(guān)閉文件。示例:DimI,FileNameForI=1To3FileName=TEST&I創(chuàng)建文件名。OpenFileNameForOutputAs#I打開文件。Print#I,Thisisatest.將字符串寫入文件。NextIClose將三個已打開的文件全部關(guān)閉。3、Reset語句語法:Reset功能:關(guān)閉所有用Open語句打開的磁盤文件。說明:Reset語句關(guān)閉Open語句打開的所有活動文件,
31、并將文件緩沖區(qū)的所有內(nèi)容寫入磁盤。示例:DimFileNumberForFileNumber=1To5OpenTEST&FileNumberForOutputAs#FileNumberWrite#FileNumber,HelloWorld將數(shù)據(jù)寫入文件。NextFileNumberReset關(guān)閉文件并將緩沖區(qū)內(nèi)的數(shù)據(jù)寫到磁盤中。4、FreeFile函數(shù)語法:FreeFile(rangenumber)參數(shù)rangenumber指定一個范圍,以便返回該范圍之內(nèi)的下一個可用文件號。指定0(缺省值)則返回一個介于1-255之間的文件號。指定1則返回一個介于256-511之間的文件號。功能:提供一個尚未
32、使用的文件號。示例:DimfnumAsIntegerfnum=FreeFileOpenF:TEST.txtForInputAs#fnumClose#fnum5、EOF函數(shù)語法:EOF(filenumber)功能:返回一個Integer,它包含Boolean值True,表明已經(jīng)到達(dá)為Random或順序Input打開的文件的結(jié)尾。6、LOF函數(shù)語法:LOF(filenumber)功能:返回一個Long,表示用Open語句打開的文件的大小,該大小以字節(jié)為單位。7、Loc函數(shù)語法:LOc(filenumber)功能:返回一個Long,在已打開的文件中指定當(dāng)前讀/寫位置。8、Input#語句語法:Inp
33、ut#filenumber,varlist功能:從已打開的順序文件中讀出數(shù)據(jù)并將數(shù)據(jù)指定給變量。說明:通常用Write#將Input#語句讀出的數(shù)據(jù)寫入文件。為了能夠用Input#語句將文件的數(shù)據(jù)正確讀入到變量中,在將數(shù)據(jù)寫入文件時,要使用Write#語句而不使用Print#語句。使用Write#語句可以確保將各個單獨(dú)的數(shù)據(jù)域正確分隔開。示例:本示例使用Input#語句將文件內(nèi)的數(shù)據(jù)讀入兩個變量中。本示例假設(shè)TESTFILE文件內(nèi)含數(shù)行以Write#語句寫入的數(shù)據(jù);也就是說,每一行數(shù)據(jù)中的字符串部分都是用雙引號括起來,而與數(shù)字用逗號隔開,例如,(Hello,234)。DimMyString,M
34、yNumberOpenTESTFILEForInputAs#1打開輸入文件。DoWhileNotEOF(1)循環(huán)至文件尾。Input#1,MyString,MyNumber將數(shù)據(jù)讀入兩個變量。Debug.PrintMyString,MyNumber在立即窗口中顯示數(shù)據(jù)。LoopClose#1關(guān)閉文件。9、Write#語句語法:Write#filenumber,outputlist功能:將數(shù)據(jù)寫入順序文件。說明:通常用Input#從文件讀出Write#寫入的數(shù)據(jù)。如果省略outputlist,并在filenumber之后加上一個逗號,則會將一個空白行打印到文件中。多個表達(dá)式之間可用空白、分號或逗
35、號隔開??瞻缀头痔柕刃АS肳rite#將數(shù)據(jù)寫入文件時將遵循幾個通用的約定,使得無論什么區(qū)域都可用Input#讀出并正確解釋數(shù)據(jù):在寫入數(shù)值數(shù)據(jù)時總使用句號作為十進(jìn)制分隔符。對于Boolean類型的數(shù)據(jù),或者打印#TRUE#或者打印#FALSE#。無論在什么地區(qū),都不將True和False這兩個關(guān)鍵字翻譯出來。使用通用的日期格式將Date類型的數(shù)據(jù)寫入文件中。當(dāng)日期或時間的部件丟失或為零時,只將現(xiàn)有部分寫入文件中。如果outputlist的數(shù)據(jù)為Empty,則不將任何數(shù)據(jù)寫入文件。但對Null數(shù)據(jù),則要寫入#NULL#。如果outputlist數(shù)據(jù)為Null數(shù)據(jù),則將#NULL#寫入文件中。對
36、于Error類型的數(shù)據(jù),輸出看起來與#ERRORerrorcode#一樣。無論在什么地區(qū),都不將關(guān)鍵字Error翻譯出來。與Print#語句不同,當(dāng)要將數(shù)據(jù)寫入文件時,Write#語句會在項目和用來標(biāo)記字符串的引號之間插入逗號。沒有必要在列表中鍵入明確的分界符。Write#語句在將outputlist中的最后一個字符寫入文件后會插入一個新行字符,即回車換行符,(Chr(13)+Chr(10)。示例:OpenF:test.txtForOutputAs#1打開輸出文件。Write#1,HelloWorld,1234寫入以逗號隔開的數(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錯誤代號#的格式寫入。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#語句語法:LineInput#filenumber,varname功能:從已打開的順序文件中讀出一行并將它分配給String變量。說明:通常用Print#與LineInput#語句配合使用。LineInput#語句一次只從文件中讀出一個字符,直到遇到回
39、車符(Chr(13)或回車-換行符(Chr(13)+Chr(10)為止?;剀?換行符將被跳過,而不會被附加到字符串上。示例:DimTextLineOpenTESTFILEForInputAs#1打開文件。DoWhileNotEOF(1)循環(huán)至文件尾。LineInput#1,TextLine讀入一行數(shù)據(jù)并將其賦予某變量。Debug.PrintTextLine在立即窗口中顯示數(shù)據(jù)。LoopClose#1關(guān)閉文件。11、Input函數(shù)語法:Input(number,#filenumber)其中number指定要返回的字符個數(shù)。功能:返回String,它包含以Input或Binary方式打開的文件中的
40、字符。說明:通常用Print#或Put將Input函數(shù)讀出的數(shù)據(jù)寫入文件。Input函數(shù)只用于以Input或Binary方式打開的文件。與Input#語句不同,Input函數(shù)返回它所讀出的所有字符,包括逗號、回車符、空白列、換行符、引號和前導(dǎo)空格等。示例:DimMyCharOpenf:test.txtForInputAs#1DoWhileNotEOF(1)循環(huán)至文件尾。MyChar=Input(1,#1)讀入一個字符。Debug.PrintMyChar顯示到立即窗口。LoopClose#1下面這個函數(shù)可以將文本文件的數(shù)據(jù)一次讀入到一個字符串(但是若包含中文時會出錯,因為一個中文字占2個字節(jié))。
41、PublicFunctionReadText(FileNameAsString)Dimfnum%,isopenAsBooleanOnErrorGoToerrofnum=FreeFile()OpenFileNameForInputAs#fnumisopen=TrueReadText=Input(LOF(fnum),fnum)erro:IfisopenThenClose#fnumIferrThenDebug.Printerr.Number,err.DescriptionEndFunction12、Print#語句語法:Print#filenumber,outputlistoutputlist參數(shù)的
42、設(shè)置如下:Spc(n)|Tab(n)expressioncharposSpc(n)用來在輸出數(shù)據(jù)中插入空白字符,而n指的是要插入的空白字符數(shù)。Tab(n)用來將插入點(diǎn)定位在某一絕對列號上,這里,n是列號。使用無參數(shù)的Tab將插入點(diǎn)定位在下一個打印區(qū)的起始位置。expression要打印的數(shù)值表達(dá)式或字符串表達(dá)式。charpos指定下一個字符的插入點(diǎn)。使用分號將插入點(diǎn)定位在上一個顯示字符之后。用Tab(n)將插入點(diǎn)定位在某一絕對的列號上,用無參數(shù)的Tab將插入點(diǎn)定位在下一個打印區(qū)的起始處。如果省略charpos,則在下一行打印下一個字符。功能:將格式化顯示的數(shù)據(jù)寫入順序文件中。說明:通常用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ù)寫入兩個區(qū)(printzones)。以空格隔開
44、兩個字符串。在字符串之前寫入五個空格。將數(shù)據(jù)寫在第十列。賦值Boolean、Date、Null及Error等。DimMyBool,MyDate,MyNull,MyErrorMyBool=False:MyDate=#2/12/1969#:MyNull=NullMyError=CVErr(32767)True、False、Null及Error會根據(jù)系統(tǒng)的地區(qū)設(shè)置自動轉(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#語句語法:Width#filenumber,widthwidth必要。范圍在0-255之間的數(shù)值表達(dá)式,在新的一行開始之前,指出在該行上可出現(xiàn)多少字符。如果width等于0,則行的長度不受限制。width的缺省值為0。功能:將一個輸出行的寬度指定給用Open語句打開的
46、文件。示例:DimIOpenf:TESTFILE.txtForOutputAs#1Width#1,5ForI=0To9Width#1,5ForI=0To9Print#1,Chr(48+I);NextI設(shè)置輸出行寬為5。循環(huán)10次。每行輸出五個字符。Close#1以上代碼寫入的內(nèi)容如下0123456789(四)處理二進(jìn)制文件打開二進(jìn)制文件可以使用Open語句的Random和Binary方式打開。二進(jìn)制文件讀寫使用Get和Put語句。1、Put語句語法:Put#filenumber,recnumber,varnamerecnumber可選。Variant(Long)。記錄號(Random方式的文件
47、)或字節(jié)數(shù)(Binary方式的文件),指明在此處開始寫入。說明:通常用Get將Put寫入的文件數(shù)據(jù)讀出來。示例:DimnumAsLong,textAsStringnum=12345text=astringOpenf:data.binForBinaryAs#1打開或創(chuàng)建一個二進(jìn)制文件Put#1,numPut#1,textClose#1寫入4個字節(jié)寫入8個字節(jié)(字符串長為8)2、Get語句語法:Get#filenumber,recnumber,varnamerecnumber可選。Variant(Long)。記錄號(Random方式的文件)或字節(jié)數(shù)(Binary方式的文件),以表示在此處開始讀出數(shù)
48、據(jù)。功能:將一個已打開的磁盤文件讀入一個變量之中。說明:通常用Put將Get讀出的數(shù)據(jù)寫入一個文件。示例:讀取以上代碼寫入的內(nèi)容DimnumAsLong,textAsStringOpenf:data.binForBinaryAs#1Get#1,numtext=Space$(8)準(zhǔn)備8個字節(jié)的字符串Get#1,text讀入Debug.Printnum,textClose#1在立即窗口可以看到如下內(nèi)容:12345astring3、Seek語句語法:Seek#filenumber,position其中position為介于12,147,483,647(相當(dāng)于2人31-1)之間的數(shù)字,指出下一個讀寫操
49、作將要發(fā)生的位置。功能:在Open語句打開的文件中,設(shè)置下一個讀/寫操作的位置。說明:可以用Seek語句指定Get語句的讀取位置,但在Get及Put語句中指定的記錄號將覆蓋由Seek語句指定的文件位置。示例: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ù)語法:Seek(filenumber)功能:返回一個Long,在Open語句打開的文件中指定當(dāng)前的讀/寫位置。說明:在使用Get語句讀取文件時,必須用LOF函數(shù)來判斷是否到達(dá)文件末尾,而不是用EOF函數(shù)??梢允褂肧eek函數(shù)判斷當(dāng)前位置,然后與LOF的值比較。示例:DoWhileSeek(1)LOF(1)繼續(xù)讀取Loop(五)總結(jié)VBA語句的文件操作涵蓋了文件操作的絕大部分內(nèi)容,很多函數(shù)的使用也很簡單,一般的文件讀寫也非常方便,特別是對文本文件。但對于復(fù)雜的文件讀寫,代碼的結(jié)構(gòu)和維護(hù)性都不好。因此在VB6之后,微軟引入了FileSystemObject對象模型,提供了面向?qū)ο蟮念悗?,來操作?qū)動器、文件夾和文件。但對于二進(jìn)制文件的操作,目前還只能用VBA語句。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語句打開文件,并不是我們通常的雙擊一個文件打開顯示到屏幕上,而是將其存放在磁盤上的數(shù)據(jù)讀入到緩沖區(qū),不是可視化的打開。這種打開是不需要密碼的,即使你的Excel
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度鋼鐵行業(yè)產(chǎn)業(yè)鏈上下游綜合合作協(xié)議2篇
- 二零二五年度黃牛票務(wù)購銷代理服務(wù)協(xié)議9篇
- 天然氣入職合同(2篇)
- 二零二五年高空吊裝作業(yè)安全責(zé)任承包協(xié)議樣本3篇
- 二零二五年度新能源產(chǎn)業(yè)抵押保證服務(wù)協(xié)議3篇
- 二零二五年國際貨物保險合同標(biāo)準(zhǔn)文本2篇
- 二零二五年度煤炭采礦權(quán)質(zhì)押借款合同93篇
- 2025年統(tǒng)編版小學(xué)語文二年級下冊期末綜合檢測卷(含答案)
- 【小升初語文閱讀專題訓(xùn)練】考點(diǎn)26 名著閱讀-統(tǒng)編版2025年小升初語文閱讀專題訓(xùn)練(含答案)
- 二零二五年度豪華別墅季度租金及物業(yè)管理服務(wù)合同3篇
- 2024年-2025年全民“科學(xué)素養(yǎng)提升行動”競賽考試題庫(含各題型)
- (高清版)DZT 0073-2016 電阻率剖面法技術(shù)規(guī)程
- 2025年蛇年春聯(lián)帶橫批-蛇年對聯(lián)大全新春對聯(lián)集錦
- 小學(xué)六年級數(shù)學(xué)計算題100道(含答案)
- 二重積分的概念
- PPK-CPK(自動生成)
- 熱電偶、熱電阻產(chǎn)品選型樣本
- 鉆孔壓水試驗計算EXCEL表格
- 磁鐵表磁計算器
- 中餐燃?xì)獬床嗽钍褂谜f明書(共4頁)
- 梁平法施工圖鋼筋表示法.5頁
評論
0/150
提交評論