从Excel vba shell更改工作目录

Changing working directory from Excel vba shell

为了工作,我尝试从Excel VBA宏运行一个python脚本。

宏如下-

1
2
3
4
5
Sub Plot()

Shell"C:\Users\maheshda\AppData\Local\Continuum\Anaconda3\python.exe C:\Users\maheshda\Tool\Tool\Main.py", vbNormalFocus

End Sub

从命令行运行时,脚本运行得很好,但不幸的是,因为我在python脚本中使用了相对的文件路径(在某一点上,我从".../input/"调用文件),所以脚本崩溃,因为当前的工作目录不是C:usersmaheshda ool ool。

如何从宏中更改工作目录?谢谢您!


这是vba中的一项小任务,使用ChDir

ChDir Statement

Changes the current directory or folder.

Syntax

ChDir path

The required path argument is a string expression that identifies which directory or folder becomes the new default directory or folder. The path may include the drive. If no drive is specified, ChDir changes the default directory or folder on the current drive.

由于您的main.py位于C:\Users\maheshda\Tool\Tool\中,请在调用python脚本之前使用以下权限:

1
ChDir"C:\Users\maheshda\Tool\Tool"

或者(因为它在驱动器C上):

1
ChDir"\Users\maheshda\Tool\Tool"


扩展wiktor stribi?电子战的答案和评论,下面的子可以用来在任何情况下更改当前目录。

1
2
3
4
5
6
7
8
Public Sub Change_Current_Directory(NewDirectoryPath as string)
    Dim CurrentDirectoryPath as string
    CurrentDirectoryPath = curdir
    if Strings.StrComp(Strings.Left(CurrentDirectoryPath,2), Strings.Left(NewDirectoryPath,2), vbTextCompare) then
        ChDrive Strings.Left(NewDirectoryPath,1)
    end if
    ChDir NewDirectoryPath
End Function

快乐编码!


fcastro,你为什么要为strcomp系列产品烦恼?就这点而言,为什么还要考虑字符串对象呢?

我想如果驱动器是外部的,并且还没有被访问过,可能需要一段时间,但是只要路径不是预期的USB/CD/DVD/等,那么:

1
2
3
4
Public Sub Change_Current_Directory(NewDirectoryPath as string)
    ChDrive Left(NewDirectoryPath,1)
    ChDir NewDirectoryPath
End Function

如果您的行为是打开一个Excel窗口,然后打开最近的文件,请注意不要忘记添加更改驱动器,然后将目录更改为您的VBA代码。

因为Excel总是以默认目录开始,即使它只是打开最近的文件!

1
2
3
4
5
6
7
8
9
Dim ThisWorkbookPath As String
Dim ThisWorkbookPathParts As Variant

ThisWorkbookPath = ThisWorkbook.Path
ThisWorkbookPathParts = Split(ThisWorkbookPath, _
                        Application.PathSeparator)

ChDrive ThisWorkbookPathParts(LBound(ThisWorkbookPathParts))
ChDir ThisWorkbookPath