excel_vba_编程教程(完整版)-第43部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
要更改当前驱动的话,你就应该使用ChDrive语句,按如下格式:
ChDrive 驱动
“驱动”是你将要设置的新的缺省驱动名称。例如,在立即窗口里输入下述指令将缺省驱动设置为
D驱或者E驱:
139
… 页面 156…
ChDrive 〃D〃
或者
ChDrive 〃E〃
如果你指向一个并不存在的驱动,你就会看到一个信息框“设备不可用”
8。创建和删除文件夹(MkDir 语句和 RmDir 语句)
依照下面的MkDir语句语法,你可以创建一个新文件夹:
MkDir Path
Path明确你要创建的新文件夹名称。如果你没有写驱动器的名称的话,VB就将在当前的驱动上创建
新文件夹。现在,我们来看几个例子:
1。 在立即窗口里输入指令,在C盘上创建一个叫“Mail”的文件夹:
MkDir 〃C:Mail〃
2。 将缺省文件夹更改为“C:Mail”:
ChDir 〃C:Mail〃
3。 获取当前文件夹名称:
?CurDir
使用RmDir函数来删除不需要的文件夹。该函数的语法如下:
RmDir Path
Path明确你要删除的文件夹名称。Path可以包含驱动名称,如果你忽略了驱动名称,那么VB就会试
图删除当前驱动下的相同名称的文件夹,如果存在的话;否则,VB将显示错误信息:“路径未找到”
4。 删除刚才创建的文件夹C:Mail:
RmDir 〃C:Mail〃
技巧8…3 RmDir移除空文件夹
如果文件夹里有东西,你不可以删除它(使用RmDir)。你应该先用Kill语句删除这些文件(在本章
后面讨论)
9。复制文件(FileCopy 语句)
使用FileCopy语句,可以在文件夹之间复制文件:
FileCopy 来源; 目的地
该语句的第一个参数是文件来源,明确你要复制的文件名称,该名称可以包含驱动名称。第二个参
数是复制的目的地,可以包括驱动和文件夹的地址。两个参数都是必须的。假设你要将用户确定的
一个文件复制到一个叫做“C:Abort”的文件夹,下面的过程示范如何完成它:
Sub CopyToAbort()
Dim folder As String
Dim source As String
Dim dest As String
Dim msg1 As String
Dim msg2 As String
Dim p As Integer
Dim s As Integer
Dim i As Long
On Error GoTo ErrorHandler
folder = 〃C:Abort〃
msg1 = 〃The selected file is already in this folder。〃
msg2 = 〃was copied to〃
p = 1
i = 1
' get the name of the file from the user 从用户处获取文件名称
source = Application。GetOpenFilename
' don’t do anything if cancelled 如果取消则不进行任何操作
If source = 〃False〃 Then Exit Sub
140
… 页面 157…
' get the total number of backslash characters 〃” in the source 获取文件来源字符
串中的反斜杠数
' variable’s contents
Do Until p = 0
p = InStr(i; source; 〃”; 1)
If p = 0 Then Exit Do
s = p
i = p + 1
Loop
' create the destination file name 创建目的文件名称
dest = folder & Mid(source; s; Len(source))
' create a new folder with this name 创建同名文件夹
MkDir folder
' check if the specified file already exists in the 检查该文件是否在目的地已经存
在
' destination folder
If Dir(dest) 〃〃 Then
MsgBox msg1
Else
' copy the selected file to the C:Abort folder 复制所选文件到文件夹“C:Abort”
FileCopy source; dest
MsgBox source & 〃 〃 & msg2 & 〃 〃 & dest
End If
Exit Sub
ErrorHandler:
If Err = 〃75〃 Then
Resume Next
End If
If Err = 〃70〃 Then
MsgBox 〃You can’t copy an open file。〃
Exit Sub
End If
End Sub
过程CopyToAbort使用了Excel应用程序的方法GetOpenFilename从用户那里获取文件名称。该方法
导致弹出内置的打开对话框。使用该对话框,你可以在任何驱动的任何文件夹里选择任何文件。如
果用户取消了,VB就返回值“False”并且程序结束。如果用户选取了某个文件并且点击了打开,
那么该选中的文件就会赋值到变量source。因为复制的目的,你只需要文件名称(而不需路径名),
所以Do…Until循环用来找到最后一个反斜杠(“”)在变量source里的位置。
接下来,VB给FileCopy语句的第二个参数准备了一个字母字符串,并且将其赋值到变量dest。该变
量储存的字符串是目标文件夹(C:Abort)和用户指定的文件名前面加反斜杠连接起来的。函数
MkDir创建了一个叫C:Abort的文件夹,如果它不存在于C盘上的话。如果这样的文件夹已经存在的
话,那么VB就需要去处理错误75了。这个错误会被在程序后面的错误处理代码捕获。注意,错误处
理器是一代码片断,它用ErrorHandler带冒号标志。
当VB遇到Resume Next语句时,就会继续执行过程里面导致错误的代码行下面的代码。这意味着语
句MkDir folder不会被执行。在这之后,程序将检查被选择的文件是否已经存在于目的文件夹。如
果文件在那,那么用户将收到储存于变量msg1里面的信息;如果文件不存在于目的文件夹并且该文
件当前没有打开的话,VB就会将文件复制到指定的文件夹,并且用相应的信息通知用户。如果该文
件被打开了,VB将遇到运行时间错误70,并且因此而运行ErrorHandler里面的相应指令。
1。 在一名为FileCopyStatement的信魔窟里输入过程CopyToAbort
2。 运行该程序几次,从不同的文件夹里选择文件
141
… 页面 158…
3。 试着复制该程序之前复制过的文件到文件夹C:Abort
4。 打开某个文件,并且在其开着的情况下试图用过程CopyToAbort来复制它
5。 运行本章前面准备的过程MyFiles,在立即窗口里列出文件夹C:Abort里面的内容
注意,不要删除文件夹C:Abort和你复制的文件,你将在下一节里面使用一个叫RemoveMe的VBA过
程来同时删除文件和文件夹。
10。删除文件(Kill 语句)
你已经从前面的章节里知道了不能删除含有文件的文件夹,要从文件夹里面删除文件的话,可以使
用下面的Kill语句:
Kill 文件路径名
文件路径名明确一个或多个你要删除的文件的名称,随你意,也可以将驱动器和文件夹名称包括在
里面。你可以在文件路径名参数里使用通配符(*或?)来确保快速删除文件。你不能删除开启的文
件。
如果你是跟着前面的练习一步一步过来的,那么你的硬盘上应该有了文件夹C:Abort和好几个文件
了里面了。在下面的练习里,你将首先删除文件夹Abort里面的所有文件,然后再删除文件夹本身:
1。 在当前工程里插入新模块,并重命名为KillStatement
2。 在过程RemoveMe里输入代码,如下所示:
Sub RemoveMe()
Dim folder As String
Dim myFile As String
‘assign the name of folder to the folder variable
‘notice the ending backslash 〃”
folder = 〃C:Abort”
myFile = Dir(folder; vbNormal)
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,你可以获得一个唯一的文件号码。
*