VBA中讀取文件的步驟

2021-12-08 14:31 更新

你已經(jīng)從前面的章節(jié)里知道了如何使用VBA打開一個(gè)電子表格,例如指令:


Application.Workbooks.Open Filename:= "C:\Excel\Report.xls"



打開位于文件夾C:\Excel里面的文件Report.xls。除了使用專門的應(yīng)用程序打開文件之外,你如果也想要?jiǎng)?chuàng)建VBA過(guò)程能夠打開其它類型的文件并使用它們的內(nèi)容的話,你就應(yīng)該學(xué)習(xí)一些關(guān)于被稱為低級(jí)別的文件I/O(input/output)。接下來(lái)關(guān)于順序,隨機(jī)和二進(jìn)制文件的章節(jié)將會(huì)帶你直接接觸你的數(shù)據(jù)。

文件訪問(wèn)類型

計(jì)算機(jī)使用的文件類型有三種:

①順序訪問(wèn)文件是指按儲(chǔ)存相同的順序找回?cái)?shù)據(jù)的文件。例如以CSV格式(逗號(hào)分割文本),TXT格式(以Tab鍵分割的文本)或者PRN格式(以空格分隔的文本)儲(chǔ)存的文件。順序文件訪問(wèn)經(jīng)常用來(lái)寫文本文件,例如錯(cuò)誤日志,參數(shù)設(shè)定和報(bào)告。順序文件有下列模式:Input,Output和Append。模式?jīng)Q定了文件打開后你如何使用它。

②隨機(jī)訪問(wèn)文件是文本文件,它的數(shù)據(jù)以同等長(zhǎng)度儲(chǔ)存并在一個(gè)以逗號(hào)分割的區(qū)域了。隨機(jī)訪問(wèn)文件只有一個(gè)模式——Random

③二進(jìn)制訪問(wèn)文件是圖形文件和其它非文本文件。二進(jìn)制文件只能夠在Binary模式下訪問(wèn)。

使用順序文件

你的電腦硬盤上有成百上千的順序文件。參數(shù)文件,錯(cuò)誤日志,HTML文件以及所有類型的無(wú)格式文本文件都是順序文件。這些文件以字母順序在硬盤上儲(chǔ)存。新文本行的開始以兩個(gè)專門的字符表示,一個(gè)叫做carriage return (回車),另一個(gè)叫l(wèi)ine feed(換行)。當(dāng)你使用順序文件時(shí),你從文件的開頭始,一個(gè)字符一個(gè)字符的向前移動(dòng),一行接一行,直到文件的結(jié)尾。順序文件容易打開和操作,任何文本編輯器都可以。


技巧:什么是順序文件?

順序文件就是訪問(wèn)它里面的記錄時(shí)必須按它占據(jù)的順序進(jìn)行的文件,這意味著在你想訪問(wèn)第三個(gè)記錄之前,你必須先訪問(wèn)第一個(gè)記錄,接著是第二個(gè)記錄。


技巧:使用Open語(yǔ)句打開文件

當(dāng)你使用順序訪問(wèn)來(lái)打開一個(gè)文件時(shí),該文件必須是已經(jīng)存在的。


讀取儲(chǔ)存于順序文件里的數(shù)據(jù)

我們來(lái)用一個(gè)已經(jīng)在你電腦上的順序文件并且在Excel  VB編輯器窗口直接使用VBA來(lái)讀取它的內(nèi)容。要從一個(gè)文件讀取數(shù)據(jù),你就必須先使用Open語(yǔ)句打開該文件。這是它的語(yǔ)法:
Open pathname For mode [Access access][lock] As [#]filenumber [Len=reclength]
Open語(yǔ)句有三個(gè)必須的參數(shù),它們是pathname, mode, 和 filenumber。上面的語(yǔ)法里,這三個(gè)參數(shù)前面都有用粗體顯示的關(guān)鍵字。

①Pathname是你要打開的文件名稱

②Pathname可以包括驅(qū)動(dòng)器和文件夾名稱

③Mode是個(gè)決定文件如何打開的關(guān)鍵字。順序文件可以以下列模式之一來(lái)打開:Input,Output  或Append。使用Input讀文件,Output寫文件,將覆蓋任何存在的文件,以及Append來(lái)寫入文件,同時(shí)附加上任何已經(jīng)存在的信息。

④Access是決定決定文件讀寫的關(guān)鍵字,Access可以是:Shared(共享),Lock Read(鎖定讀),Lock Write(鎖定寫)或Lock Read Write(鎖定讀寫)。

⑤Lock決定了哪些文件的操作是允許其它過(guò)程進(jìn)行的。例如,如果某文件是在網(wǎng)絡(luò)環(huán)境下打開的,“鎖定”決定了其他人如何訪問(wèn)它。下述鎖定關(guān)鍵字是可以用的:Read,Write 或者 ReadWrite。

⑥Filenumber是從1到511的數(shù)字,該數(shù)字用來(lái)指向順序操作中的文件。通過(guò)使用VB內(nèi)置函數(shù)FreeFile,你可以獲得一個(gè)唯一的文件號(hào)碼。

⑦Open語(yǔ)句里的最后一個(gè)成員reclength明確順序文件里總字符數(shù),或者是隨機(jī)文件里記錄大小。

考慮一下前面的例子,為了讀取數(shù)據(jù),要打開C:\Autoexec.bat或者其它順序文件,你應(yīng)該使用下面的指令:
Open "C:\Autoexec.bat" For Input As #1
如果某文件已經(jīng)打開輸入了,那么從它讀取數(shù)據(jù)。在打開一格順序文件后,你就可以使用下面的語(yǔ)句讀取它的內(nèi)容:Line Input #或者 Input # 或者使用Input 函數(shù)。

逐行讀取文件

使用下面的語(yǔ)句來(lái)逐行讀取Autoexec.bat或者其它任何順序文件里的內(nèi)容:

Line Input #filenumber, variableName

#filenumber是用Open語(yǔ)句打開文件時(shí)使用的數(shù)字,variableName是個(gè)String或者Variant變量,用來(lái)儲(chǔ)存讀取的行。


Line Input #語(yǔ)句僅讀取一開啟順序文件里的一行并且儲(chǔ)存在一變量里。記住,Line Input # 語(yǔ)句一次讀取順序文件里的一個(gè)字符,直到它遇到回車字符(Chr(13))或者回車-換行字符(Chr(13)& Chr(10))。這些字符(回車,換行)在讀取過(guò)程中返回的文本里是會(huì)忽略掉的。

接下來(lái)的過(guò)程ReadMe示范如何使用Open和Line Input #語(yǔ)句逐行讀取Autoexec.bat文件的內(nèi)容。試試用同樣的方法來(lái)讀取其它順序文件。

1. 在當(dāng)前工程里面插入新模塊并重命名為SeqFiles

2. 輸入下列過(guò)程ReadMe:

Sub ReadMe()
Dim rLine As String
Dim i As Integer ' line number
i = 1
Open "C:\Autoexec.bat" For Input As #1
' stay inside the loop until the end of file is reached
Do While Not EOF(1)
Line Input #1, rLine
MsgBox "Line " & i & " in Autoexec.bat reads: " _
& Chr(13) & Chr(13) & rLine
i = i + 1
Loop
MsgBox i & " lines were read."
Close #1
End Sub

3. 按下F8,逐句運(yùn)行該過(guò)程

為了讀取內(nèi)容,過(guò)程ReadMe將文件Autoexec.bat在模式Input里作為文件號(hào)碼1打開。Do…While循環(huán)告訴VB一直執(zhí)行循環(huán)里面的語(yǔ)句,直到到達(dá)文件結(jié)尾。文件的結(jié)尾由函數(shù)EOF的結(jié)果決定。


EOF函數(shù)當(dāng)下個(gè)要讀取的字符已經(jīng)過(guò)了文件結(jié)尾時(shí),返回邏輯值True。注意,EOF要求一個(gè)參數(shù)——你要檢查的打開了的文件號(hào)碼,是前面Open語(yǔ)句使用的同一個(gè)數(shù)字。使用EOF函數(shù)來(lái)確保VB不會(huì)超出文件結(jié)尾處。


Line Input # 語(yǔ)句將每行內(nèi)容儲(chǔ)存于變量rLine里,然后,信息框顯示行號(hào)和它的內(nèi)容。之后如果函數(shù)EOF的結(jié)果還是為假(還未到達(dá)文件結(jié)尾處)的話,VBA給行計(jì)數(shù)器增加1,并且開始讀取下一行。當(dāng)函數(shù)EOF結(jié)果為真是,VB就會(huì)退出循環(huán)。在VBA結(jié)束前,還會(huì)再運(yùn)行兩條語(yǔ)句,顯示讀取行的總數(shù),以及關(guān)閉該打開的文件。




 







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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)