从VBA(或命令行)启动Anaconda提示[已解决]

时间:2020-04-22 03:47:10

标签: python python-3.x vba powershell anaconda

到目前为止,我可以通过执行以下操作来使用Excel VBA启动python脚本:

Sub ratesmarkup()
Ratespath = "python " & """S:\Market Risk\Middle Office\Corporate Treasury\Politique Investissement\Python\JTD\Rates Markup.py"""
Cmd_Line = Shell("cmd.exe /S /K" & Ratespath & "&" & "exit", vbHide)
End Sub

到目前为止,哪个工作状况都很好。我开始使用Anaconda测试新脚本,而我的新脚本使用了通过Anaconda导入的pyxlsb模块,因为我无法将该模块与常规PyCharm一起使用。长话短说,我想知道如何修改此脚本以启动Anaconda提示符,而不是常规的cmd.exe命令行。

当我在Anaconda Prompt中启动它时,它会起作用:

python "S:\Market Risk\Middle Office\Corporate Treasury\Politique Investissement\Python\PCBONDS.py"

但是当我尝试从常规命令行启动它时,会在终端中显示此错误:

"ValueError: Unknown engine: pyxlsb"

但是,当我尝试安装上述pyxlsb模块时(尽管据我所知),它说:

Requirement already satisfied: pyxlsb in c:\python\python-3.5.1\lib\site-packages (1.0.6)

Anaconda上的python是3.7,而普通的是3.5。我以这种方式使用pyxlsb引擎:

 pandas.read_excel(engine = "pyxlsb") 

如果我了解需要特定版本的Python,可以通过Anaconda提供给我。这是在工作,所以我不能像这样安装不同版本的独立Python。因此,基本上是否有任何可能的方法,可以通过修改我目前已经存在的子程序,通过VBA启动基于anaconda的python脚本?无法找到直接回答此问题的方法。

谢谢!

2 个答案:

答案 0 :(得分:0)

您需要首先启动虚拟环境。第二步是在虚拟环境中运行脚本。创建一个批处理文件,包括执行和通过VB脚本执行批处理文件所需的所有步骤。 假设您的Windows用户是TMF,而您的虚拟环境是myenv

批处理文件

@echo on
set root=C:\Users\TMF\Anaconda3
call %root%\Scripts\activate.bat %root%
call activate myenv
"C:\Users\TMF\Anaconda3\envs\myenv\python.exe" "S:\Market Risk\Middle Office\Corporate Treasury\Politique Investissement\Python\PCBONDS.py"
pause

答案 1 :(得分:0)

对那些喜欢结论的人大声笑。

我的.bat文件最终看起来像这样:

Sub VABONDS()
User = Environ("UserName")

batpath = "pushd " & """S:\Market Risk\Middle Office\Corporate Treasury\Politique 
Investissement\Python\"""
bathfile = "PCBONDS.bat "

Set CMD = VBA.CreateObject("WScript.Shell")
CMD.Run "cmd.exe /S /K" & batpath & "&" & bathfile & User & "&" & "exit", 
vbNormalFocus, True

End Sub

%1%存放我将通过VBA脚本传递的变量的值,在这种情况下,当前使用PC的用户的用户名。

VBA脚本如下:

public class CreateList(){
    List<Object> myList = new ArrayList<>();

    public List<Object> createList(){
        myList.add();
        myList.add();
        ....
        ....
        return myList();
    }

其中User = Environ(“ UserName”)允许我动态获取用户的用户名。

只是以为我会分享,因为它可以帮助别人!