时 间:2014-07-11 08:16:32
作 者:摘 要:VBA中为我们提供了很多功能强大使用简单的函数,但一些函数的功能我们甚少使用,甚至根本不了解它们的相关用途。本文就Shell函数的用途做一些讲解,说明如何用Shell函数实现诸如打开文件、打开文件夹,复制文件、替换文件等功能。
正 文:
VBA中的Shell函数是一个功能强大简单易用的函数,但很多朋友只用它来简单的打开一个有绝对路径的可执行文件,其实它还有很多其它功能,很多可以从“开始菜单——运行”中执行的命令行都可以用Shell函数来完成。Shell函数有两个参数:pathname和Windowstyle,Windowstyle参数在帮助文档里面已经有了详细说明,这样就不再重复,主要讲一下pathname参数。
在帮助文档里面关于pathname参数的说明如下:
pathname必要参数。Variant(String),要执行的程序名,以及任何必需的参数或命令行变量,可能还包括目录或文件夹,以及驱动器。
我们可以看到,帮助里的说明过于简略,甚至有些语焉不详,让人很难理解。一般也就用它来运行可执行文件,类似于Shell “C:\test.exe”这样简单的使用一下。下面就讲一下pathname参数的详细使用方法。
1、运行可执行程序(扩展名为.exe)
对于普通可执行程序:将pathname参数直接设为该程序文件的路径名即可,如:Shell "D:\新建文件夹\test.exe"。
对于某些特殊系统文件夹(如Windows、system、system32等)中的可执行程序,或在注册表子项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths下注册过的程序,可以不用指定路径,甚至扩展名也可以不用指定,如打开计算器我们就可以直接这样调用:
Shell "calc",vbNormalFocus
否则必须要指定打开程序的路径名,如:
Shell "F:\MyNotepad.exe D:\test.txt",vbNormalFocus。
2、打开非可执行文件,如文本文件(.txt)、Word文档(.doc)等
我们必须先指定一个用来打开这个文件的程序,程序名放在前面,文件路径名放在后面。例如我们要用记事本打开一个文本文件D:\test.txt,Shell函数的调用方式就应该是:
Shell "notepad D:\test.txt",vbNormalFocus。
当文件名或路径名中存在空格时,必须要使用英文半角双引号(")来对其进行界定,但这个双引号同时又是VBA中的字符串界定符,所以按照VBA的语法规定,我们要在字符串中使用双引号,就必须用两个双引号来表明这是一个用在字符串中的双引号。如:
Shell Shell "notepad ""D:\test 1.exe""", vbNormalFocus
如果我们要用一个变量来代表这个路径名,就应该是:
Dim strPathName As String
strPathName="D:\test 1.exe"
Shell Shell "notepad """ & strPathName & """", vbNormalFocus
另外由于Shell函数支持命令行,所以我们还可以使用命令行参数来实现一些相关功能,下面是一些在Access VBA中进行运用的举例:
打开计算器:
Shell "calc", vbNormalFocus
打开写字板:
Shell "write", vbNormalFocus
打开记事本:
Shell "notepad", vbNormalFocus
打开文件夹:
Shell "explorer C:\我的文件夹", vbNormalFocus
用Word打开doc文档:
Shell "winword C:\myword.doc",vbNormalFocus
打开mdb数据库文件:
Shell "msaccess C:\mydb.mdb",vbNormalFocus
打开mdb数据库文件(文件名含有空格):
Shell "msaccess ""C:\my db.mdb""",vbNormalFocus
打开mdb数据库文件(以运行时方式):
Shell "msaccess ""C:\my db.mdb"" /runtime",vbNormalFocus
将文件夹D:\back中的test.mdb文件替换为D:\test.mdb文件(强制替换,即使被替换的文件已经被打开):
Shell "replace D:\test.mdb D:\back"
将数据库文件D:\test.mdb复制到备份文件夹D:\back中(文件已存在时命令无效):
Shell "replace D:\test.mdb D:\back /a"
将文件夹D:\back及其所有子文件夹中的test.mdb文件替换为D:\test.mdb文件:
Shell "replace D:\test.mdb D:\back /s"
将文件夹D:\back中的文件test.mdb替换为D:\test.mdb(用来替换的源文件比被替换的文件新的时候才有效):
Shell "replace D:\test.mdb D:\back /u"