久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Excel-VBA操作文件四大方法之二

 xiangtui 2010-02-10
 (三)處理文本文件

1、Open 語句

語法:Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

其中access、lock,、reclength為可選參數(shù),,一般不用。
mode 指定打開文件的方式,。有5種:
Input:以輸入方式打開,,即讀取方式。
Output:以輸出方式打開,,即寫入方式,。
Append:以追加方式打開,即添加內(nèi)容到文件末尾,。
Binary:以二進(jìn)制方式打開,。
Random:以隨機(jī)方式打開,如果未指定方式,,則以 Random 方式打開文件,。

filenumber  是一個(gè)有效的文件號,范圍在 1 到 511 之間,??梢灾付ǎ部墒褂?FreeFile 函數(shù)可得到下一個(gè)可用的文件號,。

說明:如果 pathname 指定的文件不存在,,那么,在用 Append,、Binary,、Output、或 Random 方式打開文件時(shí),,可以建立這一文件,。

示例:
Open "F:\TEST.txt" For Input As #1  '以輸入方式打開
Open "F:\TEST.xls" For Binary As #1  '以二進(jìn)制方式打開

2、Close 語句

語法:Close [filenumberlist]
     filenumberlist 參數(shù)為一個(gè)或多個(gè)文件號,,若省略 filenumberlist,,則將關(guān)閉 Open 語句打開的所有活動文件。

說明:打開文件后,,必須在使用完后關(guān)閉文件,。

示例:
Dim I, FileName
For I = 1 To 3   
    FileName = "TEST" & I    ' 創(chuàng)建文件名。
    Open FileName For Output As #I    ' 打開文件,。
    Print #I, "This is a test."    ' 將字符串寫入文件,。
Next I
Close    ' 將三個(gè)已打開的文件全部關(guān)閉。

3,、Reset 語句

語法:Reset

功能:關(guān)閉所有用 Open 語句打開的磁盤文件,。

說明:Reset 語句關(guān)閉 Open 語句打開的所有活動文件,,并將文件緩沖區(qū)的所有內(nèi)容寫入磁盤。

示例:
Dim FileNumber
For FileNumber = 1 To 5   
    Open "TEST" & FileNumber For Output As #FileNumber
    Write #FileNumber, "Hello World"    ' 將數(shù)據(jù)寫入文件,。
Next FileNumber
Reset    ' 關(guān)閉文件并將緩沖區(qū)內(nèi)的數(shù)據(jù)寫到磁盤中,。

4、FreeFile 函數(shù)

語法:FreeFile[(rangenumber)]
      參數(shù) rangenumber指定一個(gè)范圍,,以便返回該范圍之內(nèi)的下一個(gè)可用文件號,。指定 0(缺省值)則返回一個(gè)介于 1 – 255 之間的文件號。指定 1 則返回一個(gè)介于 256 – 511 之間的文件號,。

功能:提供一個(gè)尚未使用的文件號,。

示例:
Dim fnum As Integer

fnum = FreeFile

Open "F:\TEST.txt" For Input As #fnum

Close #fnum


5、EOF 函數(shù)

語法:EOF(filenumber)

功能:返回一個(gè) Integer,,它包含 Boolean 值 True,,表明已經(jīng)到達(dá)為 Random 或順序 Input 打開的文件的結(jié)尾。

6,、LOF 函數(shù)

語法:LOF(filenumber)

功能:返回一個(gè) Long,,表示用 Open 語句打開的文件的大小,該大小以字節(jié)為單位,。

7,、Loc 函數(shù)

語法:LOc(filenumber)

功能:返回一個(gè) Long,在已打開的文件中指定當(dāng)前讀/寫位置,。


8,、Input # 語句

語法:Input #filenumber, varlist

功能:從已打開的順序文件中讀出數(shù)據(jù)并將數(shù)據(jù)指定給變量。

說明:通常用 Write # 將 Input # 語句讀出的數(shù)據(jù)寫入文件,。為了能夠用 Input # 語句將文件的數(shù)據(jù)正確讀入到變量中,,在將數(shù)據(jù)寫入文件時(shí),要使用 Write # 語句而不使用 Print # 語句,。使用 Write # 語句可以確保將各個(gè)單獨(dú)的數(shù)據(jù)域正確分隔開,。

示例:
本示例使用 Input # 語句將文件內(nèi)的數(shù)據(jù)讀入兩個(gè)變量中。本示例假設(shè) TESTFILE文件內(nèi)含數(shù)行以 Write # 語句寫入的數(shù)據(jù),;也就是說,,每一行數(shù)據(jù)中的字符串部分都是用雙引號括起來,而與數(shù)字用逗號隔開,,例如,,("Hello", 234)。

Dim MyString, MyNumber
Open "TESTFILE" For Input As #1      ' 打開輸入文件,。
Do While Not EOF(1)       ' 循環(huán)至文件尾,。
    Input #1, MyString, MyNumber      ' 將數(shù)據(jù)讀入兩個(gè)變量。
    Debug.Print MyString, MyNumber      ' 在立即窗口中顯示數(shù)據(jù),。
Loop
Close #1         ' 關(guān)閉文件,。

9,、Write # 語句

語法:Write #filenumber, [outputlist]

功能:將數(shù)據(jù)寫入順序文件。

說明:通常用 Input # 從文件讀出 Write # 寫入的數(shù)據(jù),。
如果省略 outputlist,并在 filenumber 之后加上一個(gè)逗號,,則會將一個(gè)空白行打印到文件中,。多個(gè)表達(dá)式之間可用空白、分號或逗號隔開,??瞻缀头痔柕刃А?/p>

用 Write # 將數(shù)據(jù)寫入文件時(shí)將遵循幾個(gè)通用的約定,,使得無論什么區(qū)域都可用 Input # 讀出并正確解釋數(shù)據(jù):

·在寫入數(shù)值數(shù)據(jù)時(shí)總使用句號作為十進(jìn)制分隔符,。

·對于 Boolean 類型的數(shù)據(jù),或者打印 #TRUE# 或者打印 #FALSE#,。無論在什么地區(qū),,都不將 True 和 False 這兩個(gè)關(guān)鍵字翻譯出來。

·使用通用的日期格式將 Date 類型的數(shù)據(jù)寫入文件中,。當(dāng)日期或時(shí)間的部件丟失或?yàn)榱銜r(shí),,只將現(xiàn)有部分寫入文件中。

·如果 outputlist 的數(shù)據(jù)為 Empty,,則不將任何數(shù)據(jù)寫入文件,。但對 Null 數(shù)據(jù),則要寫入 #NULL#,。

·如果 outputlist 數(shù)據(jù)為 Null 數(shù)據(jù),,則將 #NULL# 寫入文件中。

·對于 Error 類型的數(shù)據(jù),,輸出看起來與 #ERROR errorcode# 一樣,。無論在什么地區(qū),都不將關(guān)鍵字 Error 翻譯出來,。
與 Print # 語句不同,,當(dāng)要將數(shù)據(jù)寫入文件時(shí),Write # 語句會在項(xiàng)目和用來標(biāo)記字符串的引號之間插入逗號,。沒有必要在列表中鍵入明確的分界符,。Write # 語句在將 outputlist 中的最后一個(gè)字符寫入文件后會插入一個(gè)新行字符,即回車換行符,,(Chr(13) + Chr(10)),。

示例:
Open "F:\test.txt" For Output As #1      ' 打開輸出文件。
Write #1, "Hello World", 1234      ' 寫入以逗號隔開的數(shù)據(jù),。
Write #1,         ' 寫入空白行,。

Dim MyBool, MyDate, MyNull, MyError
' 賦值 Boolean,、Date、Null 及 Error 等,。
MyBool = False : MyDate = #February 12, 1969# : MyNull = Null
MyError = CVErr(32767)
' Boolean 數(shù)據(jù)以 #TRUE# 或 #FALSE# 的格式寫入,。
' 日期以通用日期格式寫入,例如:#1994-07-13# 代表
' 1994 年 1 月 13 日,。Null 數(shù)據(jù)以 #NULL# 格式寫入,。
' Error 數(shù)據(jù)以 #ERROR 錯(cuò)誤代號# 的格式寫入。
Write #1, MyBool; " is a Boolean value"
Write #1, MyDate; " is a date"
Write #1, MyNull; " is a null value"
Write #1, MyError; " is an error value"
Close #1    ' 關(guān)閉文件,。

我們可以看到寫入的內(nèi)容為:
"Hello World",1234

#FALSE#," is a Boolean value"
#1969-02-12#," is a date"
#NULL#," is a null value"
#ERROR 32767#," is an error value"

10,、Line Input # 語句

語法:Line Input #filenumber, varname

功能:從已打開的順序文件中讀出一行并將它分配給 String 變量。

說明:通常用 Print # 與 Line Input # 語句配合使用,。
Line Input # 語句一次只從文件中讀出一個(gè)字符,,直到遇到回車符 (Chr(13)) 或回車–換行符 (Chr(13) + Chr(10)) 為止?;剀?#8211;換行符將被跳過,,而不會被附加到字符串上。

示例:
Dim TextLine
Open "TESTFILE" For Input As #1     ' 打開文件,。
Do While Not EOF(1)       ' 循環(huán)至文件尾,。
    Line Input #1, TextLine      ' 讀入一行數(shù)據(jù)并將其賦予某變量。
    Debug.Print TextLine      ' 在立即窗口中顯示數(shù)據(jù),。
Loop
Close #1        ' 關(guān)閉文件,。

11、Input 函數(shù)

語法:Input(number, [#]filenumber)
其中number 指定要返回的字符個(gè)數(shù),。

功能:返回 String,,它包含以 Input 或 Binary 方式打開的文件中的字符。

說明:通常用 Print # 或 Put 將 Input 函數(shù)讀出的數(shù)據(jù)寫入文件,。Input 函數(shù)只用于以 Input 或 Binary 方式打開的文件,。
與 Input # 語句不同,Input 函數(shù)返回它所讀出的所有字符,,包括逗號,、回車符、空白列,、換行符,、引號和前導(dǎo)空格等。

示例:
Dim MyChar
Open "f:\test.txt" For Input As #1
Do While Not EOF(1)       ' 循環(huán)至文件尾,。
    MyChar = Input(1, #1)      ' 讀入一個(gè)字符,。
    Debug.Print MyChar      ' 顯示到立即窗口。
Loop
Close #1

下面這個(gè)函數(shù)可以將文本文件的數(shù)據(jù)一次讀入到一個(gè)字符串(但是若包含中文時(shí)會出錯(cuò),因?yàn)橐粋€(gè)中文字占2個(gè)字節(jié)),。

Public Function ReadText(FileName As String)

Dim fnum%, isopen As Boolean
On Error GoTo erro
fnum = FreeFile()
Open FileName For Input As #fnum
isopen = True
ReadText = Input(LOF(fnum), fnum)

erro:
    If isopen Then Close #fnum
    If err Then Debug.Print err.Number, err.Description

End Function

12,、Print # 語句

語法:Print #filenumber, [outputlist]

outputlist 參數(shù)的設(shè)置如下:
[{Spc(n) | Tab[(n)]}] [expression_r] [charpos]

Spc(n) 用來在輸出數(shù)據(jù)中插入空白字符,而 n 指的是要插入的空白字符數(shù),。
Tab(n) 用來將插入點(diǎn)定位在某一絕對列號上,,這里,n 是列號,。使用無參數(shù)的 Tab 將插入點(diǎn)定位在下一個(gè)打印區(qū)的起始位置,。
expression_r 要打印的數(shù)值表達(dá)式或字符串表達(dá)式。
charpos 指定下一個(gè)字符的插入點(diǎn),。使用分號將插入點(diǎn)定位在上一個(gè)顯示字符之后,。用 Tab(n) 將插入點(diǎn)定位在某一絕對的列號上,,用無參數(shù)的 Tab 將插入點(diǎn)定位在下一個(gè)打印區(qū)的起始處,。如果省略 charpos,則在下一行打印下一個(gè)字符,。


功能:將格式化顯示的數(shù)據(jù)寫入順序文件中,。

說明:通常用 Line Input # 或 Input 讀出 Print # 在文件中寫入的數(shù)據(jù)。

示例:
Open "F:\test.txt" For Output As #1         ' 打開輸出文件,。
Print #1, "This is a test"                  ' 將文本數(shù)據(jù)寫入文件,。
Print #1,                                   ' 將空白行寫入文件。
Print #1, "Zone 1"; Tab; "Zone 2"           ' 數(shù)據(jù)寫入兩個(gè)區(qū)(print zones),。
Print #1, "Hello"; " "; "World"             ' 以空格隔開兩個(gè)字符串,。
Print #1, Spc(5); "5 leading spaces "       ' 在字符串之前寫入五個(gè)空格。
Print #1, Tab(10); "Hello"                  ' 將數(shù)據(jù)寫在第十列,。

' 賦值 Boolean,、Date、Null 及 Error 等,。
Dim MyBool, MyDate, MyNull, MyError
MyBool = False: MyDate = #2/12/1969#: MyNull = Null
MyError = CVErr(32767)
' True,、False、Null 及 Error 會根據(jù)系統(tǒng)的地區(qū)設(shè)置自動轉(zhuǎn)換格式,。
' 日期將以標(biāo)準(zhǔn)的短式日期的格式顯示,。
Print #1, MyBool; " is a Boolean value"
Print #1, MyDate; " is a date"
Print #1, MyNull; " is a null value"
Print #1, MyError; " is an error value"
Close #1

以上代碼寫入的內(nèi)容如下:
This is a test

Zone 1        Zone 2
Hello World
     5 leading spaces
         Hello
False is a Boolean value
1969-2-12  is a date
Null is a null value
Error 32767 is an error value

13、Width # 語句

語法:Width #filenumber, width
width 必要,。范圍在 0–255 之間的數(shù)值表達(dá)式,,在新的一行開始之前,指出在該行上可出現(xiàn)多少字符,。如果 width 等于 0,,則行的長度不受限制。width 的缺省值為 0,。

功能:將一個(gè)輸出行的寬度指定給用 Open 語句打開的文件,。

示例:
Dim I
Open "f:\TESTFILE.txt" For Output As #1
Width #1, 5                                 ' 設(shè)置輸出行寬為 5,。
For I = 0 To 9                              ' 循環(huán) 10 次。
    Print #1, Chr(48 + I);                  ' 每行輸出五個(gè)字符,。
Next I
Close #1

以上代碼寫入的內(nèi)容如下:
01234
56789

 

(四)處理二進(jìn)制文件
打開二進(jìn)制文件可以使用Open語句的Random和Binary方式打開,。二進(jìn)制文件讀寫使用Get和Put語句。

1,、Put 語句

語法:Put [#]filenumber, [recnumber], varname

recnumber 可選,。Variant (Long)。記錄號(Random 方式的文件)或字節(jié)數(shù)(Binary 方式的文件),,指明在此處開始寫入,。

說明:通常用 Get 將 Put 寫入的文件數(shù)據(jù)讀出來。

示例:
Dim num As Long, text As String
num = 12345
text = "a string"
Open "f:\data.bin" For Binary As #1     '打開或創(chuàng)建一個(gè)二進(jìn)制文件
Put #1, , num                           '寫入4個(gè)字節(jié)
Put #1, , text                          '寫入8個(gè)字節(jié)(字符串長為8)
Close #1


2,、Get 語句

語法:Get [#]filenumber, [recnumber], varname

recnumber 可選,。Variant (Long)。記錄號(Random 方式的文件)或字節(jié)數(shù)(Binary 方式的文件),,以表示在此處開始讀出數(shù)據(jù),。

功能:將一個(gè)已打開的磁盤文件讀入一個(gè)變量之中。

說明:通常用 Put 將 Get 讀出的數(shù)據(jù)寫入一個(gè)文件,。

示例:讀取以上代碼寫入的內(nèi)容
Dim num As Long, text As String
Open "f:\data.bin" For Binary As #1
Get #1, , num
text = Space$(8)                        '準(zhǔn)備8個(gè)字節(jié)的字符串
Get #1, , text                          '讀入
Debug.Print num, text
Close #1

在立即窗口可以看到如下內(nèi)容:
 12345       a string


3,、Seek 語句

語法:Seek [#]filenumber, position
其中position 為介于 1~ 2,147,483,647(相當(dāng)于 2^31 – 1)之間的數(shù)字,指出下一個(gè)讀寫操作將要發(fā)生的位置,。

功能:在 Open 語句打開的文件中,,設(shè)置下一個(gè)讀/寫操作的位置。

說明:可以用Seek語句指定Get語句的讀取位置,,但在 Get 及 Put 語句中指定的記錄號將覆蓋由 Seek 語句指定的文件位置,。

示例:
Dim MaxSize, NextChar, MyChar
Open "TESTFILE" For Input As #1     
MaxSize = LOF(1)       ' 取得文件的總字符數(shù)。
' 用循環(huán)讀入所有記錄,,但是從最后的記錄開始往前讀,。
For NextChar = MaxSize To 1 Step -1   
    Seek #1, NextChar      ' 設(shè)置讀寫位置。
    MyChar = Input(1, #1)      ' 讀入一字符,。
Next NextChar
Close #1  

4,、Seek 函數(shù)

語法:Seek(filenumber)

功能:返回一個(gè) Long,在 Open 語句打開的文件中指定當(dāng)前的讀/寫位置,。

說明:在使用Get語句讀取文件時(shí),,必須用LOF函數(shù)來判斷是否到達(dá)文件末尾,而不是用EOF函數(shù),??梢允褂肧eek函數(shù)判斷當(dāng)前位置,然后與LOF的值比較。

示例:
Do While Seek(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(Binary Interchange File Format),即二進(jìn)制可交換文件格式(但2007開始使用OOXML格式),。關(guān)于其內(nèi)部的結(jié)構(gòu),,本人也在研究中,。以二進(jìn)制結(jié)構(gòu)打開Excel文件,,不但可以讀取其表格中的數(shù)據(jù),還可以讀取其所有的信息(包括密碼),。注意,,以O(shè)pen語句打開文件,并不是我們通常的雙擊一個(gè)文件打開顯示到屏幕上,,而是將其存放在磁盤上的數(shù)據(jù)讀入到緩沖區(qū),,不是可視化的打開。這種打開是不需要密碼的,,即使你的Excel文件設(shè)置了打開密碼,,還是照打開不誤,,這也正是Excel文件不安全的根源所在。我以前發(fā)過一篇關(guān)于破解的文章,,里面破解VBA工程密碼的方法就是用二進(jìn)制替換,。由于論壇不讓討論破解的話題,這里就不再詳細(xì)分析代碼了,,感興趣的請自行研究,。當(dāng)然,Excel的其他密碼也是可類似破解的,前提是你必須十分了解Excel的內(nèi)部結(jié)構(gòu),,知道密碼放在哪里,,才能替換。知道的解密的方法,,自然可以針對性的改進(jìn)加密的方法,。好了,這里就不再羅嗦了,,如果對Excel的內(nèi)部結(jié)構(gòu)感興趣,,可以先看這篇文章,看懂再說,。
 

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多