我正在尝试运行一个VBA模块,该模块在继续执行其他操作之前使用外壳程序脚本运行ipython笔记本(使用runipy),但是我的ipython笔记本脚本需要输入,这些输入是使用环境变量设置的。
这是我到目前为止的VBA:
rundate = Range("b1").Value
shellScript = "runipy C:\argstest.ipynb"
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1
Set wshSystemEnv = wsh.Environment("SYSTEM")
wshSystemEnv("CURRWK") = rundate
如果我随后运行:
MsgBox (wshSystemEnv("CURRWK"))
结果是正确的:
2015-04-17
但是,如果我继续执行我的shellscript,则无法识别此变量
Set WshShellExec = wsh.exec(shellScript)
Range("a1").Value = WshShellExec.StdErr.ReadAll
告诉我,当python运行时,它得到一个关键错误:
KeyError: 'CURRWK'
如果删除VBA并直接从命令行运行此命令,则将执行以下操作:
set CURRWK=2015-04-17
runipy C:\Python27\Programs\ipython\ACT\argstest.ipynb
如何在VBA中创建外壳程序以创建新的环境变量,以便python脚本在执行时可以看到它?
谢谢!
最佳答案
您是否尝试过Process
而不是SYSTEM
?您的VBA可能无权修改系统级变量。 (您说:“但是它可以在设置后读回它。”是的,但是您的脚本可能启用了注册表虚拟化。)进程最类似于命令行SET
语句,因为更改仅适用于当前进程,并且子进程,并且不持久。