VBA中讀取文件的步驟

2021-12-08 14:31 更新

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


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



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

文件訪問類型

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

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

②隨機(jī)訪問文件是文本文件,它的數(shù)據(jù)以同等長度儲存并在一個以逗號分割的區(qū)域了。隨機(jī)訪問文件只有一個模式——Random

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

使用順序文件

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


技巧:什么是順序文件?

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


技巧:使用Open語句打開文件

當(dāng)你使用順序訪問來打開一個文件時,該文件必須是已經(jīng)存在的。


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

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

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

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

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

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

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

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

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

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

逐行讀取文件

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

Line Input #filenumber, variableName

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


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

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

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

2. 輸入下列過程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)行該過程

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


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


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




 







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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號