excel_vba_编程教程(完整版)-第45部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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在开启的文件