《excel_vba_编程教程(完整版)》

下载本书

添加书签

excel_vba_编程教程(完整版)- 第49节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
      Do While myFile  〃〃   
          Kill folder & myFile   
          myFile = Dir   
      Loop   
      RmDir folder   
End Sub   
3。 运行过程RemoveMe,当程序运行结束,点击Windows文件浏览器看看该文件夹是否已经被删除了。  

11。从文件读取和写入数据(Input/Output)  

你已经从前面的章节里知道了如何使用VBA打开一个电子表格,例如指令:  
Application。Workbooks。Open Filename:= 〃C:ExcelReport。xls〃   
打开位于文件夹C:Excel里面的文件Report。xls。除了使用专门的应用程序打开文件之外,你如果 
也想要创建VBA过程能够打开其它类型的文件并使用它们的内容的话,你就应该学习一些关于被称 
为低级别的文件I/O(input/output)。接下来关于顺序,随机和二进制文件的章节将会带你直接接 
触你的数据。  

12。文件访问类型  

计算机使用的文件类型有三种:  
* 顺序访问文件是指按储存相同的顺序找回数据的文件。例如以CSV格式(逗号分割文本),TXT 
    格式(以Tab键分割的文本)或者PRN格式(以空格分隔的文本)储存的文件。顺序文件访问经 
    常用来写文本文件,例如错误日志,参数设定和报告。顺序文件有下列模式:Input; Output 和  
    Append。模式决定了文件打开后你如何使用它。  
* 随机访问文件是文本文件,它的数据以同等长度储存并在一个以逗号分割的区域了。随机访问 
    文件只有一个模式——Random  
* 二进制访问文件是图形文件和其它非文本文件。二进制文件只能够在Binary模式下访问。  

                                           142 

… 页面 159…

13。使用顺序文件  

你的电脑硬盘上有成百上千的顺序文件。参数文件,错误日志,HTML文件以及所有类型的无格式文 
本文件都是顺序文件。这些文件以字母顺序在硬盘上储存。新文本行的开始以两个专门的字符表示, 
一个叫做carriage return (回车),另一个叫line feed(换行)。当你使用顺序文件时,你从文 
件的开头始,一个字符一个字符的向前移动,一行接一行,直到文件的结尾。顺序文件容易打开和 
操作,任何文本编辑器都可以。  
技巧8…4 什么是顺序文件?  
顺序文件就是访问它里面的记录时必须按它占据的顺序进行的文件,这意味着在你想访问第三个记 
录之前,你必须先访问第一个记录,接着是第二个记录。  
技巧8…5 使用Open语句打开文件  
当你使用顺序访问来打开一个文件时,该文件必须是已经存在的。  

14。读取储存于顺序文件里的数据  

我们来用一个已经在你电脑上的顺序文件并且在Excel VB编辑器窗口直接使用VBA来读取它的内 
容。要从一个文件读取数据,你就必须先使用Open语句打开该文件。这是它的语法:  
Open pathname For mode 'Access access''lock' As '#'filenumber 'Len=reclength'   
Open语句有三个必须的参数,它们是pathname; mode; 和 filenumber。上面的语法里,这三个参 
数前面都有用粗体显示的关键字。  
* Pathname是你要打开的文件名称  
* Pathname可以包括驱动器和文件夹名称  
* Mode是个决定文件如何打开的关键字。顺序文件可以以下列模式之一来打开:Input; Output 或 
    Append。使用Input读文件,Output写文件,将覆盖任何存在的文件,以及Append来写入文件, 
    同时附加上任何已经存在的信息。  
* Access是决定决定文件读写的关键字,Access可以是:Shared(共享),Lock Read(锁定读), 
    Lock Write(锁定写)或Lock Read Write(锁定读写)。  
* Lock决定了哪些文件的操作是允许其它过程进行的。例如,如果某文件是在网络环境下打开的, 
     “锁定”决定了其他人如何访问它。下述锁定关键字是可以用的:Read; Write 或者 Read Write。  
* Filenumber是从1到511的数字,该数字用来指向顺序操作中的文件。通过使用VB内置函数 
    FreeFile,你可以获得一个唯一的文件号码。  
* Open语句里的最后一个成员reclength明确顺序文件里总字符数,或者是随机文件里记录大小。  
考虑一下前面的例子,为了读取数据,要打开C:Autoexec。bat或者其它顺序文件,你应该使用下 
面的指令:  
Open 〃C:Autoexec。bat〃 For Input As #1   
如果某文件已经打开输入了,那么从它读取数据。在打开一格顺序文件后,你就可以使用下面的语 
句读取它的内容:Line Input #或者 Input # 或者使用Input 函数。  

15。逐行读取文件  

使用下面的语句来逐行读取Autoexec。bat或者其它任何顺序文件里的内容:  
Line Input #filenumber; variableName   
#filenumber是用Open语句打开文件时使用的数字,variableName是个String或者Variant变量,用 
来储存读取的行。  
Line Input #语句仅读取一开启顺序文件里的一行并且储存在一变量里。记住,Line Input # 语 
句一次读取顺序文件里的一个字符,直到它遇到回车字符(Chr(13))或者回车…换行字符(Chr(13)  
& Chr(10))。这些字符(回车,换行)在读取过程中返回的文本里是会忽略掉的。  
接下来的过程ReadMe示范如何使用Open和Line Input #语句逐行读取Autoexec。bat文件的内容。试 
试用同样的方法来读取其它顺序文件。  
1。 在当前工程里面插入新模块并重命名为SeqFiles  
2。 输入下列过程ReadMe:  
Sub ReadMe()   
      Dim rLine As String   

                                            143 

… 页面 160…

      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,逐句运行该过程  
为了读取内容,过程ReadMe将文件Autoexec。bat在模式Input里作为文件号码1打开。Do…While循 
环告诉VB一直执行循环里面的语句,直到到达文件结尾。文件的结尾由函数EOF的结果决定。  
EOF函数当下个要读取的字符已经过了文件结尾时,返回逻辑值True。注意,EOF要求一个参数—— 
你要检查的打开了的文件号码,是前面Open语句使用的同一个数字。使用EOF函数来确保VB不会超 
出文件结尾处。  
Line Input # 语句将每行内容储存于变量rLine里,然后,信息框显示行号和它的内容。之后如果 
函数EOF的结果还是为假(还未到达文件结尾处)的话,VBA给行计数器增加1,并且开始读取下一 
行。当函数EOF结果为真是,VB就会退出循环。在VBA结束前,还会再运行两条语句,显示读取行的 
总数,以及关闭该打开的文件。  

16。从顺序文件中读取字符  

假设你的程序需要检查文件Autoexec。bat里出现了多少个冒号,你可以使用函数Input来返回特定 
的字符数,而不必读取整行。接下来,If语句用来比较获取的字符和你寻找的字符。在写过程之前, 
我们来看看函数Input的语法:  
Input(number; '#'filenumber)   
Input函数的两个参数都是必须的,number明确你要读取的字符数,而filenumber是Open语句用来 
打开文件的同一个数字。Input函数返回所有读取的字符,包括逗号,回车,文件结束字符,引号 
和前导空格。  
1。 在SeqFile模块里输入下述过程Colons:  
Sub Colons()   
      Dim counter As Integer   
      Dim char As String   
      counter = 0   
      Open 〃C:Autoexec。bat〃 For Input As #1   
      Do While Not EOF(1)   
           char = Input(1; #1)   
           If char = 〃:〃 Then   
           counter = counter + 1   
           End If   
      Loop   
      If counter  0 Then   
           MsgBox 〃Characters found: 〃 & counter   
           Else   
           MsgBox 〃The specified character has not been found。〃   
      End If   
      Close #1   

                                          144 

… 页面 161…

End Sub   
2。 逐句执行该过程  
3。 将冒号换成其它你想寻找的字符并且重新执行该程序。Input函数允许你返回顺序文件的任何字 
    符。如果你使用VB函数LOF作为Input函数的第一个参数时,你将能够快速地读取顺序文件里的 
    内容,而不需要在整个文件上循环。LOF函数返回一个文件上的字节数。每个字节对应了文本文 
    件里的一个字符。过程ReadAll将文件System。ini的内容读取到立即窗口里:  
Sub ReadAll()   
      Dim all As String   
      Open 〃C:WINNTSystem。ini。bat〃 For Input As #1   
      all = Input(LOF(1); #1)   
      Debug。Print all   
      Close #1   
End Sub   
除了将文件内容打印到立即窗口之外,你还可以将其读取到一个文本框并且放置到工作表中去(见 
图8…2):  
Sub WriteToTextBox()   
      Dim mysheet As Worksheet   
      Set mysheet = ActiveWorkbook。Worksheets(1)   
      On Error GoTo CloseFile   
      Open 〃C:WINNTSystem。ini〃 For Input As #1   
      mysheet。Shapes(1)。Select   
      Selection。Characters。Text = Input(LOF(1); #1)   
      CloseFile:   
      Close #1   
End Sub   

                                                               
图8…2 文件TDate。ini(译者:原文为System。ini)的内容显示在工作表中的文本框里  
在你运行上面的程序之前,你得在工作表里画一个文本框。注意,On Error GoTo CloseFile语句 
激活错误捕捉,如果错误在程序的执行过程中发生了,就会立即跳到CloseFile标签处,Close #1 
语句无论有无错误发生都会被执行。  

17。读取分隔文本文件  

在某些文本文件中(文件通常保存为CSV;TXT或PRN格式)输入在每行的数据由逗号,Tab或者空格 
分隔。这种类型的文件用Input # 语句可以比前面介绍的Line Input #语句读取更快些。Input # 
语句允许你从一个打开的文件中读取数据到好几个变量,该函数如下所示:  
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架