excel_vba_编程教程(完整版)-第48章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
果函数返回一个非零数值,那么该文件或文件夹具有和你测试的属性一样的属性。
C:MsDos。sys的属性是什么呢?你可以在立即窗口里快速获得:
?getattr(〃C:MsDos。sys〃) AND vbReadOnly
1
?getattr(〃C:MsDos。sys〃) AND vbHidden
138
… 页面 155…
2
?getattr(〃C:MsDos。sys〃) AND vbSystem
4
?getattr(〃C:MsDos。sys〃) AND vbArchive
32
现在,我们来将这些信息一起放在一个过程里:
1。 插入新模块,并重命名为GetAttrFunction
2。 输入下述过程GetAttributes:
Sub GetAttributes()
Dim attr As Integer
Dim msg As String
attr = GetAttr(〃C:MSDOS。SYS〃)
msg = 〃〃
If attr AND vbReadOnly Then msg = msg & 〃Read…Only (R)〃
If attr AND vbHidden Then msg = msg & Chr(10) & 〃Hidden (H)〃
If attr AND vbSystem Then msg = msg & Chr(10) & 〃System (S)〃
If attr AND vbArchive Then msg = msg & Chr(10) & 〃Archive (A)〃
MsgBox msg; ; 〃MSDOS。SYS〃
End Sub
3。 当你运行上面的过程时,你将看到如图8…1的信息框
图8…1 使用GetAttr函数可以获得任何文件的属性
GetAttr函数的相反函数是SetAttr函数,它允许你设置一个文件或文件夹的属性。语法如下:
SetAttr 文件路径名; 属性
文件路径名确定你要设置的文件或文件夹,第二个参数,属性,是一个或多个你要设置的属性常量。
参见表8…1本章前面介绍的常量清单。
假设你有一个叫做“C:stamps。txt”的文件,并且要设置两个属性,“只读”和“隐藏”。在立即
窗口里输入下述指令来设置文件属性(可以找个你硬盘上存在的文件来试验):
SetAttr 〃C:stamps。txt〃; vbReadOnly + vbHidden
技巧8…2 调用SetAttr语句
你不能给打开的文件设置属性,在使用SetAttr函数之前,你必须关闭该文件。
7。更改缺省文件夹或驱动器(ChDir 语句和 ChDrive 语句)
使用ChDir语句,你可以轻易更改缺省文件夹,例如:
ChDir Path
在上面的语句中,Path是新的缺省文件夹名称。Path可以包含驱动器名称。如果Path没有包括驱动
名称,那么缺省文件夹将会更改为当前驱动。当前驱动不变。
假设缺省文件夹为“C:DOS”,语句:
ChDir 〃D:MyFiles〃
将缺省文件夹更改为“D:MyFiles”,然而,当前驱动仍然是C盘。
要更改当前驱动的话,你就应该使用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