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

下载本书

添加书签

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


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
     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在开启的文件中移动光标到变量randomNr明确的 
记录处,在下来的指令读取找到的记录内容。要在打开的随机访问文件中读取数据,你必须使用Get 
语句。指令:  
Get #1; randomNr; d   
告诉VB要读取的记录号码(randomNr)以及要读取数据的变量(d)。随机文件中的第一个记录在位 
置1,第二个记录在位置2,依次类推。忽略记录号码会导致VB读取下一个记录。然后,用户定义的 
类型字典的两个成员都被写入了立即窗口。函数Trim(d。en)和Trim(d。sp)将读取的记录前后可能含 
有的空格。接下来,VB显示信息,提示用户提供显示单词的外语等同语。该单词赋予变量answer, 
如果你按下Esc而不是点击确定的话,VB就会关闭文件并且接受程序,否则,VB将打印你的答案到 
立即窗口,并且通知你,你的答案是否正确。当你要退出单词训练程序,随时可以按下Esc或者点 
击对话框的取消按钮。  
如果你决定继续并且点击了确定按钮,程序就会产生一个新随机号码,并且会找回一个英语单词并 
且问你相对应的西班牙译语。  
你可以修改该过程VocabularyDrill,因此你可以将每个不正确翻译的单词写到工作表。同样,你 
也许想要将文件Translate。txt里的所有记录到写到工作表里,这样你就总可以知道你的字典内容。 
你可以在本书带的CD里找到这两个程序。  

                                                                                                   
图8…3 在记事本里打开随机文件的内容  

                                                                             
图8…4 试图用Microsoft Excel打开随机文件的内容。注意,Excel正确的认识了原始的数据类型— 
—随机文件里的数据是固定宽度的。  
技巧8…10 随机文件的优势与劣势  
不想顺序文件,随机文件里的数据可以被很快地访问,而且,这些文件在往里面写信息和读信息期 
间不需要关闭文件。随机访问文件不必按顺序读写。因为它们的记录和区域都有固定的长度,不管 
储存的字符有多少,使用的字节数总是一样的,因此,如果有些区域是空的或者比声明的区域短时, 

                                          151 

… 页面 168…

就会浪费许多空间。  

22。操作二进制文件  

不象随机文件那样以固定长度储存数据,二进制文件是一些长度变化的记录的集合。例如,文件包 
含的第一个记录可以使10个字节,第二个记录可以只有5个字节,而第三个却可以使15个字节。这 
种储存数据的方法节省很多的硬盘空间,因为VB不需要在要储存的字符串后面加上多余的空格来确 
保它们有相同的长度(象往随机文件里写数据那样),在二进制文件里没有空间浪费。这就不奇怪 
二进制文件比前面所讲的两种文件占用的硬盘空间要少。正如随机文件,二进制文件也可以打开同 
时进行读和写的操作。然而,因为二进制文件里的记录是不同长度的,所以,这些文件的操作是更 
苦难一些的。要找回正确的数据的话,你就必须将每个区域和记录的大小信息储存起来。  
你将使用下述四种语句来操作二进制文件:  
* 使用Get语句来读取数据  
* Put语句允许你往二进制文件输入新数据  
* Loc语句返回所读的最后字节数(在随机文件里,Loc语句返回最后所读记录的数字)  
* Seek语句将光标移动到文件中合时的位置。  
为了快速掌握上面语句的使用,我们来打开立即窗口,并且将下面表格里左边的指令输入到立即窗 
口。本练习的目的是在一个叫做MyData。txt文件里输入你的姓和名,然后再找回你输入的数据。  
  
    立即窗口输入代码                          解释  
    Open 〃MyData。txt〃 For Binary As #1        打开文件“MyData。txt”作为文件编号1来作二 
                                              进制访问  
    MsgBox 
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架