背景
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)路徑