VBA通过相对路径(%~dp0)调用批处理文件(bat)运行RScrip

背景

vba中用Shell函数执行.bat文件,来调用RScript。每次换不同的电脑或者路径,都需要重新设置路径。利用%~dp0传输相对路径时,发现vbalCurDir会影响结果。
这个

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.txtE:\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)路径

posted @ 2022-04-21 15:06  Xeonilian  阅读(1307)  评论(0编辑  收藏  举报