VBA通过相对路径(%~dp0)调用批处理文件(bat)运行RScrip
背景
vba
中用Shell函数
执行.bat
文件,来调用RScript
。每次换不同的电脑或者路径,都需要重新设置路径。利用%~dp0
传输相对路径时,发现vbal
的CurDir
会影响结果。
这个
1. 条件设置:excel的当前路径(CurDir)和excel文件本身不在同一个盘符
- bat文件在
E:\Desktop\1.bat
dir > openyes.txt
cd %~dp0
dir > iamhere1.txt
cd /d %~dp0
dir > iamhere2.txt
- excel文件在
E:\Desktop\2.xlsm
2. 确认vba中的路径
当前路径
vba的立即窗口中运行Msgbox CurDir
返回什么都有可能,这里在F盘新建一个test文件夹,并设置为CurDir。不要设置 C盘,可能因为无法读写不能再现下面的代码,要是没有F盘,就换个盘。
ChDrive "F"
ChDir "F:\test"
再运行Msgbox CurDir
,返回的是F:\test
ThisWorkbook.path
vba立即窗口运行 Msgbox ThisWorkbook.path
返回 E:\Desktop
3.vba中运行 bat 文件
立即窗口中运行
retval = Shell(ThisWorkbook.path & "\1.bat", 1)
运行结果:
openyes.txt
文件在F:\test
iamhere1.txt
也在 F:\test
iamhere2.txt
在E:\Desttop
说明:
- 能够找到并运行bat文件,bat运行后的起始路径是 CurDir。
- 如果要用cd修改,要加上/d,不然会因为在不同的盘失败,所以iamhere1.txt还是在当前路径。
- 所以使用相对路径的核心就是
cd /d %~dp0
相关知识
1. Shell函数
功能:运行可执行程序并在成功时返回表示程序的任务 ID 的 Variant (Double);否则返回零。
RetVal = Shell("C:\WINDOWS\NOTEPAD.EXE", 1) ' Open Notepad.
2. RScript
通过命令行运行R代码,不知道说明用不着。
3. bat文件
bat文件是dos下的批处理文件,包含一条或多条命令。在CMD中输入批处理文件名(当前路径与bat文件路径相同时)可运行。
4. %~dp0
获得bat文件本身路径的方式
%0表示bat文件本身
%~0表示去掉双引号
%~dp0表示去掉双引号,显示d(drive)盘符和p(path)路径
----ฅ(*ΦωΦ)ฅ---- cognata ad sidera tendit...