按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
response = InputBox(〃Enter a name of animal:〃)
If response = 〃〃 Then Exit Sub
zoo(i) = response
i = i + 1
Loop
For i = LBound(zoo) To UBound(zoo)
MsgBox zoo(i)
Next
End Sub
133
… 页面 150…
另外一个使用数组时经常碰到的错误是类型不匹配。要避免这类错误,就要牢记一个数组的每个成
员都必须具有相同的数据类型。如果你试图给数组成员赋予和数组声明的数据类型矛盾的数据的
话,你就将在执行代码时收到“类型不匹配”的错误。要让一个数组出错不同类型的数据类型的话,
你就得声明数组为Variant类型。
14。数组作为参数
在第四章里面,你学习了数据可以在子过程或者函数过程之间作为必须或者可选参数传递。如果传
递的参数不是过程执行一定要的话,那么这个参数名称就应该在前面加关键字Optional。然而,有
些时候,你事先并不知道你要传递多少个参数。一个典型的例子就是加法。你可能想要将两个数字
加和,或者,你也许要加和3个,10个,或者15个数字。使用关键字ParamArray,你就可以将一个
包含任意个成员的数组传递给你的子过程和函数过程。下面的函数过程AddMultipleArgs将加和你
所需要的任何多个数字。该函数以数组myNumbers的声明开始,注意关键字ParamArray的使用。该
数组必须声明为Variant类型,并且它必须是函数过程的最后一个参数。
1。 在当前工程里插入一新模块,命名为ParameterArrays
2。 输入如下函数过程AddMultipleArgs:
Function AddMultipleArgs(ParamArray myNumbers() As Variant)
Dim mySum As Single
Dim myValue As Variant
For each myValue in myNumbers
mySum=mySum+myValue
Next
AddMultipleArgs = mySum
End Function
3。 激活立即窗口来试验上面的函数,在立即窗口里输入指令:
?AddMultipleArgs(1; 23。24; 3; 24; 8; 34)
当你按下回车键,VB就会返回上面参数的总和:93。24。你可以提供无限制的参数数目。注意,每
个函数的参数之间要用逗号分开。
15。接下来…
在本章里,你学习了通过创建数组,你可以编写需要大量变量的过程。通过例子,示范了如何声明
和使用一维数组(清单)和二维数组(表)。你也学习了静态数组和动态数组之间的差别。本章的
结尾介绍了五个VBA内置函数和关键字ParamArray,它们经常使用于数组。
现在你已经知道了可以使你的程序更智能的控制结构了:条件语句,循环和数组。在本书的后面,
你将学习如何使用集合代替数组来操作更大量的数据。通过使用从第一到第七章学到的知识,你现
在可以开始编写VBA过程让你的任务自动化了,而这些在你开始学习本书之前似乎是不可能的事情。
接下来的一章将讲述文件和文件夹的管理。
第八章 利用 VBA 操纵文件和文件夹
作者:Julitta Korol 翻译:Tiger Chen Mar 5’ 2005
在工作过程中,你肯定访问、创建、复制和删除过成百上千的文件和文件夹。然而,你可能从未用
程序执行过这些任务。所以,现在就是机会。本章侧重于专门处理文件和文件夹的VBA函数和指令。
通过使用这些函数,你将能够:
* 获得当前文件夹的名称(CurDir函数)
* 更改文件和文件夹名称(Name函数)
* 检查某文件或文件夹是否存在于某硬盘上(Dir函数)
* 获取某文件最后修改的时间和时间(FileDateTime函数)
* 获取文件大小(FileLen函数)
* 检查和更改文件属性(GetAttr和SetAttr函数)
* 更改缺省文件夹或者硬盘(ChDir和ChDrive语句)
* 创建和删除文件夹(MkDir和RmDir语句)
* 复制和删除文件或文件夹(FileCopy和Kill语句)
134
… 页面 151…
此外,本章也给你往三类文件写入或者读取数据的知识:连续的,随机的和二进制的文件。除了使
用Excel应用软件界面之外,你将学习如何直接操作文件。在本章的最后,将给你介绍最新的操作
文件和文件夹的方法,通过利用称为Windows Scripting Host (WSH)的工具来操作文件和文件夹。
操作文件和文件夹
本节将讨论多种操作文件和文件夹的函数。
1。获取当前文件夹的名称(CurDir 函数)
当你使用文件时,经常会需要知道当前文件夹的名称,你使用CurDir函数轻易地获取该信息:
CurDir('drive')
Drive是一可选参数,如果你忽略它,VBA将使用当前驱动(drive)。
CurDir函数返回一个文件路径作为Variant(变量)。如果要返回作为字符串(String)的路径的话,
就得使用CurDir(这里的是字符串的类型声明字符)。让我们在立即窗口里做些练习,练习使用
这些函数吧:
1。 打开一个新工作簿,并且切换到VB编辑器窗口
2。 激活立即窗口并敲入下述代码:
?CurDir
当你按下回车,VB就显示当前文件夹名称,例如:
C:
如果你有第二个硬盘(或者光驱)的话,你可以获取D盘上的当前文件夹,例如:
?CurDir(“D:”)
如果你提供了一个并不存在的驱动字母的话,VB就将显示下述错误信息:“设备不可用”
3。 要储存当前驱动名称到变量myDrive,可以输入下述指令:
myDrive = Left(CurDir;1)
当你按下回车键时,VB将当前驱动器的字母储存到变量myDrive
敲入下述指令并回车,可以检查变量myDrive的内容:
?myDrive
你还可以将上面的指令改为如下:
myDrive = left(CurDir;1) & 〃:〃
VB将返回驱动器字母,后面带有一个冒号。
2。更改文件或文件夹名称(Name 函数)
使用函数Name可以重命名文件或者文件夹,例如:
Name old_pathname As new_pathname
Old_pathname是你想用重命名的文件或文件夹的名称和路径,New_pathname则明确文件或文件夹的
新名称和位置。使用函数Name,你可以将一个文件从一个文件夹移动到另外一个文件夹,但是,你
不可以移动文件夹。
请在立即窗口里试演该函数(用你文件的实际名称替换示例名称)。这里有些需要考虑的注意事项:
* 在New_pathname里的文件名称不要指向已经存在的文件
Name 〃C:System。1st 〃 As 〃C:test。txt〃
因为文件C:test。txt已经存在于C盘,VB将显示错误信息:“文件已存在”,同样,如果你要重命名
的文件不存在的话,就会出现“文件未找到”的错误信息。
* 如果New_pathname已经存在,并且和Old_pathname不同,函数Name必要时将文件移动到新文件
夹并且更改它的名称。
Name 〃C:System。1st 〃 As 〃D:test。txt〃
因为文件test。txt在D盘的根目录下并不存在,VB将C:System。1st移动到指定的驱动盘,然而,并
不重命名该文件。(译者:本段与上面的内容似乎矛盾,而且未能试验成功,未知是原书失误与否。
读者应仔细验证)
* 如果New_pathname和Old_pathname指向不同的目录,以及提供的文件名称相同,那么Name函数
将指定的文件移到新地址,不用更改文件名。
Name 〃D:test。txt 〃 As 〃C:DOStest。txt〃
上面的指令将test。txt移动到C盘下的DOS文件夹里。
135
… 页面 152…
技巧8…1 你不能重命名开启的文件
在重命名文件之前,你必须关闭该文件。文件名称里不能包含通配符“*”或者“?”。
3。检查文件或文件夹是否存在(Dir 函数)
Dir函数,返回文件或者文件夹名称,语法如下:
Dir'(pathname'; attributes')'
Dir函数的两个参数都是可选的,pathname是文件或文件夹名称,对于参数attributes,你可以下
列常量或者数值之一:
表8…1 文件属性
常量 数值 属性名称
vbNormal 0 Normal 普通文件
vbHidden 2 Hidden 隐藏文件
vbSystem 4 System 系统文件
vbVolume 8 Volume label 卷标
vbDirectory 16 Directory or Folder 目录或文件夹
Dir函数常用来检查某个文件或文件夹是否存在,如果不存在,那么就返回空字符串(””)。我们
到立即窗口里试验几个Dir函数的练习:
1。 在立即窗口,输入下述指令:
?Dir(〃C:”; vbNormal)
你一旦按下回车键,VB就会返回该文件夹下的第一个文件名。普通文件(vbNormal)就是除隐藏,
卷标,目录,文件夹或系统文件之外的任何文件。
要返回当前目录下的其它文件名称的话,就使用不带参数的Dir函数:
?Dir (并且回车)
2。 在立即窗口里输入下列指令,并且在你回车时检查其结果:
mfile = Dir(〃C:”; vbHidden)
?mfile
mfile = Dir
?mfile
mfile = Dir
?mfile
3。 在立即窗口输入下述指令:
If