![Office VBA开发经典:中级进阶卷](https://wfqqreader-1252317822.image.myqcloud.com/cover/711/26542711/b_26542711.jpg)
3.1 Shell调用WinRAR
WinRAR是一个文件压缩管理共享软件,由Eugene Roshal(所以RAR的全名是Roshal ARchive)开发。首个公开版本RAR 1.3发布于1993年。
WinRAR可以把文件(夹)压缩为.rar或.zip格式,如图3-1所示。
WinRAR可以解压的格式有:.CAB、.ARJ、.LZH、.TAR、.GZ、.ACE、.UUE、.BZ2、.JAR、.ISO、.Z、.7Z、.RAR5。
启动WinRAR软件,单击WinRAR软件的菜单【选项/设置】,弹出“设置”对话框,切换到“集成”选项卡,可以设置WinRAR能够解压的文件格式,如图3-2所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/877.jpg?sign=1739140555-KTDYw99Gsm8I6zky5BfTvCXKWNAG7WM3-0-d4e57b04a1354d9f8b3fe7874ee799dd)
图3-1 “压缩文件名和参数”对话框
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/878.jpg?sign=1739140555-n0oZQgsDFvzzH623mCzpIN85bfT4FjWL-0-085fea2556b7a7698a4096c48a37ba45)
图3-2 勾选关联的扩展名
3.1.1 获取WinRAR可执行文件路径
WinRAR的执行文件一般情况下位于C:\Program Files\WinRAR\WinRAR.exe,如果个别计算机把这个软件安装到其他位置,使用前面讲过的WshShell对象的RegRead方法读取注册表可以获取其路径。
下面的GetSetupPath函数用来获取指定程序名的安装路径。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/879.jpg?sign=1739140555-se8lVXXZRDS71zNHY6grqOiUk5TutcIe-0-07724070a34dbc2291808f755e58a110)
运行下面的过程,可以获取WinRAR软件的安装路径以及PowerPoint的安装路径。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/880.jpg?sign=1739140555-1Dk8MubStvVN1ifrJim6NkBbcWcMjaOo-0-64d585eb994740913a56ad4970d290df)
上述程序的运行结果如图3-3所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/881.jpg?sign=1739140555-LSmDceZtbC2ORM9cYeNcYP5uv4BwU5vP-0-d166137c8a2022eaaba71286bec8eceb)
图3-3 从注册表中获取应用程序的所在路径
3.1.2 命令和开关
获取到WinRAR.exe的所在路径,就可以使用Shell函数调用这个可执行文件完成压缩和解压缩操作。
调用格式如下。
Shell "WinRAR.exe的路径 命令 开关 压缩包路径 文件路径",vbNormalFocus(或者vbHide)
下面通过一个实例来介绍一下各参数的构造方法。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/883.jpg?sign=1739140555-ZkcRyRbk53xfQi1LjQTtq6eILfg52V66-0-48d85b5b8f89e1c3894fa31e2644befa)
以上语句的功能是,调用WinRAR.exe把65.png图片文件压缩到Regdll.rar这个压缩包中。可以看出各个参数之间用空格隔开,全部放入双引号内,形成了一个长的字符串。其中的A就是一个命令,表示压缩,上面这个实例没有用到开关参数。
下面分别介绍一下WinRAR的命令参数和开关参数。命令参数的功能是告知WinRAR要执行什么操作,是压缩、解压缩还是删除。开关参数是对命令参数的补充说明。
WinRAR命令参数
单击WinRAR的菜单【帮助/帮助主题】,可以打开其帮助文件,依次展开节点“命令行模式/命令行”,可以看到所有命令参数的说明,如图3-4所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/882.jpg?sign=1739140555-Yfj3bd7Sj8BBdM9Zm1vsdwmXQ8mnFCVa-0-3b1c4843cc1dd881d8b86ab2aa9d8595)
图3-4 WinRAR的命令参数帮助
最常用的4个命令参数及其功能如下。
A:压缩,添加到压缩文件中。
D:删除,从压缩包中删除文件。
E:解压缩到当前目录。
X:以完全路径解压。
可以看出,从压缩包中解压出内容,有E和X两个命令参数。其实,E命令参数等价于WinRAR解压参数中的“不要提取路径”;X命令参数等价于“提取完整路径”,使用WinRAR软件解压一个压缩包时,在“高级”选项卡里可以看到解压方式选项,如图3-5所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/884.jpg?sign=1739140555-csDfMdDb4BJzRl0keGSh5v9noaIbJTFM-0-91f1654bc77d920e5060a9a2c6bca161)
图3-5 命令参数相应的含义
简言之,E就是忽略压缩包中的路径,释放所有文件到目标文件夹,而X则按照压缩包原有的路径结构释放到目标文件夹。
WinRAR开关参数
在WinRAR软件的帮助文件中,依次展开节点“命令行模式/参数”,可以看到所有开关参数的说明,如图3-6所示。
下面是比较常用的开关参数。
-ep:忽略路径。
-ep1:忽略基准路径,但保持现有文件层次结构。
-p或-hp:压缩时加密码。
-df:压缩后删除原文件。
-dr:压缩后删除原文件到回收站。
大致了解命令参数和开关参数后,下面通过具体实例加深学习。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/001.jpg?sign=1739140555-LuMoMIPVi8d4jcTHYGmeXvIvJX4KOHxv-0-fe3295377b8dcf9483c87a62c80c3678)
图3-6 WinRAR开关参数帮助
3.1.3 压缩
假设文件夹“东北三省”中的内容如图3-7所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/002.jpg?sign=1739140555-93ooR6L3Dkwwi5UR1if5ZGoWorWUQtiu-0-6e609f0f739bc1f4ccb79251a0b2fb10)
图3-7 文件夹内容的示意图
如果采用命令A-ep则是忽略所有路径,也就是忽略文件夹及其子文件夹,把“东北三省”下面管辖的所有文件(含递归)压缩进去。完整代码如下。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/004.jpg?sign=1739140555-dOjwWAiYSbJQaK7BeRGVFAzJSMS3TtZ4-0-31078c7c789983f1b7e42a92646a3fd3)
代码分析:函数GetSetupPath用来获取WinRAR软件的安装目录,函数AddQuote用来处理Shell命令路径中的空格。要注意Command中要保留必要的空格。
以上代码段中,最重要的一句就是最后Shell函数的应用。
运行上面的“文件夹及其内容添加到压缩包”过程,会在E:盘下生成package1.rar压缩包,手工打开后,如图3-8所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/003.jpg?sign=1739140555-PuUjHXnZ7UYXdnU6JqupieDAxX7cyuAG-0-6a49327d91581c0cc12445e057d11daf)
图3-8 自动执行压缩
可以看到,A-ep命令把文件夹中所有的“文件”掏出来,放入压缩包,而不管这些文件原先在何处。
现在只需把上述代码中的Command换成"A-ep1",删除原先的压缩包,再运行一次程序,效果如图3-9所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/005.jpg?sign=1739140555-m1iRGbA69zlgMbaNAtB7mrLDf9N8mFqG-0-c377852146ccb5bddf228247d6354be3)
图3-9 连文件夹一起压缩
可以看出,该命令保留了原先文件结构。因此,可以简单地理解为-ep参数只压缩文件,-ep1带文件夹压缩。
在实际应用中,根据需要选择开关参数即可。
3.1.4 解压缩
解压缩是将压缩包中的内容释放到磁盘下的操作。解压缩的命令有E和X。
下面的过程把压缩包package1.rar中所有的文件解压到Destination文件夹下。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/007.jpg?sign=1739140555-nTstcqDJDmAg1rkDaKzMbaqukdMLUQEr-0-5fc7adae82678d7e7cbe358358852041)
运行上述程序,把压缩包中的文件直接释放到目标文件夹,如图3-10所示。
如果把Command改为Command = " X ",再次运行上述程序,压缩包中的文件夹和文件一律解压到目标文件夹中,如图3-11所示。
上面的实例把压缩包中所有内容解压到目标文件夹,使用以下代码可以解压压缩包中指定路径的文件,而不是解压全部文件。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/006.jpg?sign=1739140555-28bSaZ3IhjHEjaMt4ggaoryq5sFPgGxS-0-ee4635e26d417061eef4219bcfae2754)
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/008.jpg?sign=1739140555-5rpZvULqhCK5PH0JljR2Njz37aqXu3zp-0-84e142007d6090f079e641efea21a2eb)
图3-10 自动解压
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/009.jpg?sign=1739140555-KjAlnUF3v8ZbaHjUuJLpdgztQLq6G9mw-0-73b4aae2ee9538e9251d3ec3d294ae47)
图3-11 连文件夹一起解压
3.1.5 删除
WinRAR使用命令D删除压缩包中的文件或路径。
下面的实例把package1.rar压缩包中的“吉林”文件夹删除。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/011.jpg?sign=1739140555-Y24WZnnAemLQ80EcHHnZf87tY4ft53tt-0-e827e4c8e3bf6b154cdff7d27dc4b842)
运行上述程序,删除压缩包中的“吉林”文件夹,如图3-12所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/010.jpg?sign=1739140555-3RBXjfQ5Ulip3ya2DaIMbMx62NmCOxi4-0-ab63a68a2cb35c1d59a23b8c956d9b80)
图3-12 删除压缩包中指定的文件夹
3.1.6 使用通配符
无论是压缩、解压缩,还是删除命令,路径设置中均可使用通配符。*表示0个以上任意字符,?表示1个任意字符。
下面的程序把文件夹下所有4位扩展名的Word文档添加到Word.rar压缩包中。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/013.jpg?sign=1739140555-I5k7eUYrM5T2ZeX4HyoqhcphD3a2DRp9-0-396c24864e56fb0218f8f281c244f99a)
运行上述程序,将文件夹中所有的Word文档添加到压缩包,如图3-13所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/012.jpg?sign=1739140555-ivcb889jeBofWPFOoOXOhEagQ6ii8IJm-0-7b38bbdaabdc2083b6c078442b2a1d77)
图3-13 批量压缩特定类型的文件
下面的代码从Word.rar压缩包中删除启用宏的Word文档(扩展名为.docm)。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/014.jpg?sign=1739140555-VcQwxdAe0sx1ITTCTdhHdj0Qjkx4HbGy-0-9add001d1336f37323de7c225cd74dba)
需要注意的是,由于是从压缩包里面删除内容,所以代码中Content的赋值不需要WorkDir。
运行上述程序,删除压缩包中扩展名为docm的文件,如图3-14所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/015.jpg?sign=1739140555-qPnTl9ilegktP5Xk3cDc7PcknRkgDsz3-0-772dc49656a7e34103e838ce311097c5)
图3-14 从压缩包中删除指定扩展名的文件
3.1.7 处理压缩包的密码
使用-p或-hp开关参数,可以压缩为加密的文件,也可以从添加了密码的压缩包中解压文件。-p后面带上密码,表示普通加密,手工双击压缩包,会看到压缩包中的文件列表,每个文件后面有*。
下面的程序把文件夹中所有扩展名为.pdf的文件添加到压缩包,并且设置解压密码为ryueifu。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/017.jpg?sign=1739140555-oehddipXf9Z1p5ldThaBuhYrWAgeU7cP-0-9af475529552d37f78fc834bd8fb8eb6)
运行上述程序,然后打开压缩包,会看到处于加密状态,如图3-15所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/016.jpg?sign=1739140555-0489v8R2NYCYSZmvSx0g5grRoAYMIBa4-0-c134b8c624f3c947a5c66a49656c4caf)
图3-15 自动压缩并设置解压密码
如果使用开关参数-hp,表示高度加密,这种方式生成的压缩包,连其中的文件列表也看不到,如图3-16所示。
对于设置了密码的压缩包,可以在解压命令中把密码传递进去。
下面的程序把刚刚加密生成的Lock.rar解压到test文件夹中。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/019.jpg?sign=1739140555-Ugu1lD5hPSsWWnSTo28pOidPPw8rFYXU-0-f96d3440f2460b81318167ddb0e5d1ac)
图3-16 使用-hp参数高度加密
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/020.jpg?sign=1739140555-we6NXj5SZ5gDCF3Oy29HzeRY8GelaTF4-0-c1c6d34fe7cb332de70734a4797a46e7)
3.1.8 使用WinRAR修改Office文档
Office 2007以上版本的Office文档(.docx、.xlsx、.pptx等格式)其实是一种压缩包格式,使用WinRAR可以直接打开。下面介绍一下用WinRAR查看和修改Excel文件的方法。
实例文件“example01.xlsx”有3个工作表,表名从左到右依次分别为Jan、Feb、Mar,如图3-17所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/018.jpg?sign=1739140555-uB3PdUvjahHoI7wkGRNXtBxkfPLktjp1-0-041e6387a0dc6907eb53588d375a9a74)
图3-17 Excel工作簿文件
在Excel中关闭该文件,然后打开WinRAR软件,按下快捷键【Ctrl+O】,浏览到example01.xlsx,如图3-18所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/021.jpg?sign=1739140555-1Z314nqYk7Pk8crE3jfgSuWenRMbLI0d-0-cdf54a4f2e0438cf85a53120894983b9)
图3-18 使用WinRAR打开Excel文件
在WinRAR中看到Excel文件由3个文件夹和一个文件构成,继续展开名为xl的文件夹,可以看到和工作表信息有关的内容,如图3-19所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/022.jpg?sign=1739140555-6jws7Y8lDwWfKPwEaWyWPXPezqTrTwSS-0-514670a1be2655b01c048cf9cf70b93f)
图3-19 查看Excel文件的内容
手工把example01.xlsx解压到磁盘下,生成了一些扩展名为.xml的文件。双击Workbook.xml,会在IE浏览器中打开该文件,如图3-20所示。
其中<Sheets>这个节点中存储的就是各个工作表的名称和顺序。
xml文件可以用记事本程序编辑,因此接下来用记事本程序打开Workbook.xml文件,把Jan这个工作表移动到最后,并且把Feb这个表的名称修改为“二月”。修改好后,在IE中再次预览,如图3-21所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/023.jpg?sign=1739140555-3ATt3hRZZhE0EsOnb73C2IZL1bvuZ0ZY-0-8910b78de8e0e2154a74d3c54a8690c9)
图3-20 查看Excel文件内部的部署清单
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/024.jpg?sign=1739140555-7CVQcggAtUyPadsTNhfZYpaMCnEsF3RF-0-e6099dbebb3b2dfebe8df02fb23a96fa)
图3-21 调整工作表的XML代码
然后把修改了的Workbook.xml文件压入example01.xlsx工作簿中,在Excel中再次打开,看到工作表的名称和次序发生了变化,如图3-22所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/025.jpg?sign=1739140555-MAytNNiYuOj2NY6dKWcib1oFQsWXdxFs-0-d585133e8efb0eec094bf9608ff5e5f8)
图3-22 修改后Excel文件的内容
可以看到Jan工作表移到了最后,Feb工作表被重命名。
Word、PowerPoint文档也是压缩文件,可以用WinRAR查看和打开。以上演示的是手工使用WinRAR查看、修改Office文档,当然也可以用Shell调用WinRAR进行自动解压。
下面的过程把example01.xlsx文件中的Workbook.xml部分解压到Destination文件夹中。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/027.jpg?sign=1739140555-KySSyNhdqtE0I5bNOlfqofO0O4VeFKAP-0-cebd0c85cb64625d025f29e5a74bc5e0)
如果是带有自定义功能区的文档,用压缩包打开后,里面有更多的内容,这些在稍后的章节讲解。
以上内容的源代码文件为“实例文档10.xlsm”。