靠谱电子书 > 经管其他电子书 > excel_vba_编程教程(完整版) >

第45部分

excel_vba_编程教程(完整版)-第45部分

小说: excel_vba_编程教程(完整版) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



      Dim lname As String   
      Dim fname As String   
      Dim birthdate As Date   
      Dim s As Integer   
      Open 〃C:My DocumentsFriends。txt〃 For Output As #1   
      lname = 〃Smith〃   
      fname = 〃Gregory〃   
      birthdate = #1/2/63#   
      s = 3   
      Write #1; lname; fname; birthdate; s   
      lname = 〃Conlin〃   
      fname = 〃Janice〃   
      birthdate = #5/12/48# s = 1   
      Write #1; lname; fname; birthdate; s   
      lname = 〃Kaufman〃   
      fname = 〃Steven〃   
      birthdate = #4/7/57#   
      s = 0   
      Write #1; lname; fname; birthdate; s   
      Close #1   
End Sub   
上面的过程打开文件C:My DocumentsFriends。txt来写入数据。因为该文件还不存在于你的硬盘 
上,所以VB就创建了一个全新的文件并写入三个记录。写入文件的数据储存在变量上。注意,这些 
字符串由双引号分隔,而生日则有井号包围起来了。  
当你使用Windows记事本打开文件Friends。txt是,你将看到下述输入:  
〃Smith〃;〃Gregory〃;#1963…01…02#;3   
〃Conlin〃;〃Janice〃;#1948…05…12#;1   

                                          147 

… 页面 164…

〃Kaufman〃;〃Steven〃;#1957…04…07#;0   
注意,Write #语句自动在每个数据之间插入逗号并且将行结束字符(Chr(13) & Chr(10))放在每行 
文本的后面,以至于每行新纪录都从新的行开始。在上面的例子里面,每行文本显示一条记录—— 
每条记录以姓开始,以同胞数目结束。  
如果你想要将数据显示在一列中,而不是用逗号分隔数据,那么就使用Print #语句。例如,如果 
将上面的程序DataEntry里的Write #语句用Print #语句代替的话,那么VB就会按下面的方式写入 
数据:  
Smith       Gregory      1/2/63      3   
Conlin      Janice       5/12/48     1   
Kaufman     Steven       4/7/57      0   
尽管Print #语句和Write #语句的语法一样,但是,Print #以一个准备打印的格式将数据写入顺 
序文件。清单里的变量可能用分号或者空格分隔。要打印多个空格的话,你就应该使用Spc(n)指令, 
这里n是空格数。类似地,要将数据输入到第五列的话,你就应该使用指令Tab(5)。  
我们来看一些格式例子:  
* 使用带逗号的Write #语句,往文件里输入空行  
Write #1;  
* 在第五列输入文本“fruits”  
Write #1; Tab(5); “fruits”  
* 用五个空格分隔开单词“fruits”和“vegetables”  
Write #1; “fruits”; Spc(5); “vegetables”  

20。操作随机文件  

当某文件包含结构数据时,就以随机模式打开它。以随机模式打开文件让你能够:  
* 同时读写  
* 快速访问某特别记录  
在随机文件里,所有记录都是等长度的,并且每条记录都有相同数目的固定大小区域。记录或者区 
域的长度必须在文件写入数据之前就确定。如果写入某区域的字符串长度小于该区域的大小,那么 
VB就会自动在该字符串后面加空格来填充区域。如果写入的文本比区域长度长的话,超出的字符就 
不会被写入。  
要知道如果操作随机文件,你现在就需要创建一个小数据库用作外语学习。该数据库将包含由两个 
区域组成的记录,储存英语词组和其外语等同语。  
技巧8…8 随机文件是什么?  
随机文件是储存的记录可以随机访问的文件,这意味着随机文件里的任何记录都可以读取,而不必 
读取它之前的每条记录。  

21。创建用户定义的数据类型  

除了第三章里介绍的内置数据类型之外,VB允许你在模块的上面使用Type…End Type语句定义一个 
非标准的数据类型。该非标准数据类型也经常成为用户自定义的数据类型。用户自定义数据类型可 
以包括各种数据类型(字符串,整型,日期等等)的内容。当你使用随机访问的文件时,你经常要 
创建一用户定义的变量,因为,该变量使你可以轻易地访问个别记录。  
1。 在当前工程里插入新模块并且重命名为RandomFiles  
2。 在模块上面,紧接着Option Explicit语句下面,输入下述类型定义:  
Option Explicit   
' define a user…defined type   
Type Dictionary   
      en As String * 16 ' English word up to 16 characters   
      sp As String * 20 ' Spanish word up to 20 characters   
End Type   
用户定义的名为Dictionary的类型包括两个声明为String(字符串)的项目,并且有特定的大小。 
成员en可以接受最多16个字符,第二个项目sp的大小不能超过20个字符。如果你将这两个成员的长 
度加起来,那么记录长度将为36(16+20)。如果模块了已经有了Option Explicit语句的话,你就 
                                          148 

… 页面 165…

不必再输入它了。  
3。 输入下面的过程EnglishToSpanish  
Sub EnglishToSpanish()   
     Dim d As Dictionary   
     Dim RecNr As Long   
     Dim choice As String   
     Dim totalRec As Long   
     RecNr = 1   
      'open the file for random access 打开文件作随机访问  
     Open 〃Translate。txt〃 For Random As #1 Len = Len(d)   
     Do   
           ' get the English word 活动英文词语  
           choice = InputBox(〃Enter an English word〃; 〃ENGLISH〃)   
           d。en = choice   
           ' exit the loop if cancelled 如取消则退出循环  
           If choice = 〃〃 Then Exit Do   
           choice = InputBox(〃Enter the Spanish equivalent for 〃 _   
           & d。en; 〃SPANISH EQUIVALENT 〃 & d。en)   
           If choice = 〃〃 Then Exit Do   
           d。sp = choice  
           ' write to the record 写入记录  
           Put #1; RecNr; d   
           ' increase record counter 增加记录计数器  
           recNr = recNr + 1   
     Loop Until choice = 〃〃 'ask for words until Cancel 询问词语直到取消  
      totalRec = LOF(1) / Len(d)   
     MsgBox 〃This file contains 〃 & totalRec & 〃 record(s)。〃   
      ' close the file   
     Close #1   
End Sub   
过程EnglishToSpanish开始时,声明四个变量,变量d声明为用户定义的类型Dictionary。该类型 
在前面就用Type语句声明了(见第二步)。在给变量RecNr赋予了初始值之后,VB打开文件 
Translate。txt,并且将其作为文件编码1随机访问。指令Len(d)告诉VB每条记录的大小为36字符。 
接下来VB执行Do…Until循环里面的语句,直到你取消。循环里的第一条语句提示你输入一个英语 
单词,并且将其赋予变量choice,然后该值被传递给用户定义d的第一个成员(d。en)。  
一旦你停止输入数据,VB就会退出Do循环,并且执行程序里的最后的语句计算和显示文件里的记录 
总数。最后一条语句将文件关闭。如果你输入了英文词语并点击确定,那么下个对话框就会提示你 
输入外语等同语。当然,如果你决定现在就退出的话,VB就会跳出循环并且继续剩下的语句。如果 
一切正常,你输入了外语翻译,那么VB就会将它赋予变量choice并且传递给用户自定义变量d的第 
二个成员(d。sp),接下来,VB使用下述语句将整条记录写入到文件里:  
Put #1; recNr; d   
写入第一条记录后,VB会给记录计数器增加1,然后重复循环里的语句。过程EnglishToSpanish允 
许你在你的字典里输入任意多条记录。当你退出提出词语时,过程使用LOF和Len函数来计算文件里 
的总记录数。VB在显示信息后关闭该文本文件(Translate。txt)。  
创建随机文件仅仅是个开始,接下来,过程VocabulartDrill示范如何使用一个开启的随机文件的 
记录。这里,你将学习让你快速找到你文件中适合的数据的语句。  
技巧8…9 理解Type语句  
Type命令允许你创建一个自定义组,包括混合的变量类型,称为“用户自定义数据类型”。Type语 
句通常用于随机文件,将信息作为区域储存为固定大小的记录。我们可以将随机文件用的区域使用 
Type语句集中成为一个用户自定义,而不必为每个区域都声明一个变量。例如,如下所示定义一个 

                                          149 

… 页面 166…

包含三个区域的记录:  
Type MyRecord   
country As String * 20   
city As String * 14   
rank As Integer   
End Type   
一旦定义了类型,你必须给使用这种类型的变量名称:  
Dim myInfo As MyRecord   
使用变量名称后面加上句号和内部变量可以访问内部变量(country; city; rank),例如,要明确 
城市,输入:  
MyInfo。city = 〃Warsaw〃   
4。 在过程EnglishToSpanish下面输入下面显示的过程VocabularDrill,代码的介绍在其后面。  
Sub VocabularyDrill()   
      Dim d As Dictionary   
      Dim totalRec As Long   
      Dim recNr As Long   
      Dim randomNr As Long   
      Dim question As String   
      Dim answer As String   
      ' open a random access file 打开随机访问文件  
      Open 〃Translate。txt〃 For Random As #1 Len = Len(d)   
      ' print the total number of bytes in this file 打印本文件的总字节数  
      Debug。Print 〃There are 〃 & LOF(1) & 〃 bytes in this file。〃  
      ' find out and print out the total number of records 找到并且打印总记录数  
      recNr = LOF(1) / Len(d)   
      Debug。Print 〃Total number of records: 〃 & recNr   
      Do   
           ' get a random record number 获取随机记录数  
           randomNr = Int(recNr * Rnd) + 1   
           Debug。Print randomNr   
           ' find the random record 找到该随机记录  
           Seek #1; randomNr   
           ' read the record 读取记录  
           Get #1; randomNr; d   
           Debug。Print Trim(d。en); 〃 〃; Trim(d。sp)   
           ' assign answer to a variable 将答案赋予变量  
           answer = InputBox(〃What's the Spanish equivalent?〃; d。en)   
           ' finish if cancelled 如取消则介绍  
           If answer = 〃〃 Then Close #1: Exit Sub   
           Debug。Print answer   
           ' check if the answer is correct 检查答案是否正确  
           If answer = Trim(d。sp) Then   
              MsgBox 〃Congratulations!〃   
           Else   
              MsgBox 〃Invalid Answer!!!〃   
           End If   
           ' keep on asking questions; until Cancel is pressed 不断提问,直到按下取消  
      Loop While answer  〃〃   
      ' close file 关闭文件  
      Close #1   

                                          150 

… 页面 167…

End Sub   
声明变量之后,过程VocabularyDrill打开一个随机访问文件,并且告诉VB每个记录的长度Len =  
Len(d),接下来,在立即窗口里打印文件的总字节数和总记录数。字节数是由语句LOF(1)返回的。  
记录数是总字节数(LOF)除以一个记录的长度——Len(d)。接下来,VB执行循环里的语句直到按 
下Esc键或者取消按钮。循环里的第一条语句将函数Rnd的结果赋予变量randomNr。接下来的语句将 
这个数字写入立即窗口,指令Seek #1; randomNr在开启的文件

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的