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

下载本书

添加书签

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
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架