Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
被VBA调用时,Python脚本突然不再运行_Python_Vba_Shell_Wsh - Fatal编程技术网

被VBA调用时,Python脚本突然不再运行

被VBA调用时,Python脚本突然不再运行,python,vba,shell,wsh,Python,Vba,Shell,Wsh,编辑:我在下面发帖时犯了一个错误,说它在从终端运行时起作用(我必须在前面测试过)。这个问题是通过在安装的环境(env)文件夹pycharm中使用python.exe程序解决的,而不是我最初进行的单机安装 EDIT#2:问题再次存在,但没有更改任何VBA或python脚本。(仍在使用pycharm环境文件夹python.exe) 我有一个VBA sub,它创建一个WScript.Shell对象,然后执行一个python脚本,该脚本在过去几周内运行良好。在继续构建python脚本(salesHist

编辑:我在下面发帖时犯了一个错误,说它在从终端运行时起作用(我必须在前面测试过)。这个问题是通过在安装的环境(env)文件夹pycharm中使用python.exe程序解决的,而不是我最初进行的单机安装

EDIT#2:问题再次存在,但没有更改任何VBA或python脚本。(仍在使用pycharm环境文件夹python.exe)

我有一个VBA sub,它创建一个WScript.Shell对象,然后执行一个python脚本,该脚本在过去几周内运行良好。在继续构建python脚本(salesHist.py)中的代码之后,python脚本不再正确运行,并生成退出代码“1”。通过pyCharm或console运行脚本时,脚本完全正确执行,退出代码为0

我尝试了下面包含的代码的一些不同变体。python.exe和salesHist.py的目录都是正确的,并且不包含任何空格(我知道这是一个常见错误)

还添加了参考资料: Visual Basic for Applications, Microsoft Excel 16.0对象库, OLE自动化, Microsoft Office 16.0对象库, Microsoft HTML对象库, Microsoft脚本运行时, Microsoft XML,v3.0, Windows脚本主机对象模型

子运行pythonscript(pyScript作为字符串)
“声明变量
Dim objShell作为对象
Dim PythonExe,PythonScript作为字符串
Dim waitOnReturn为布尔值,WindowsStyle为整数,retVal为长值
waitOnReturn=True
windowStyle=0
'创建新对象外壳
设置objShell=VBA.CreateObject(“WScript.Shell”)
'尝试设置objShell CreateObject(“WScript.Shell”)
'提供Python Exe的文件路径
PythonExe=“C:\Users\steve.levy\AppData\Local\Programs\Python\Python37-32\Python.exe”
'PC1:C:\Users\Steven\AppData\Local\Programs\Python\Python37-32\Python.exe
'PC2:C:\Users\steve.levy\AppData\Local\Programs\Python\Python37-32\Python.exe
'如果文件路径名中有空格,请确保使用三重引号。如果没有,单引号也可以
'处理Python脚本的文件路径
PythonScript=“C:\Users\steve.levy\Documents\elberon\api\”&pyScript
'PC1:C:\Users\Steven\Documents\api\
'PC2:C:\Users\steve.levy\Documents\elberon\api\
Debug.Print(PythonExe)
Debug.Print(PythonScript)
'运行Python脚本
'尝试:调用objShell.Run(PythonExe&''&PythonScript,0,True)
'尝试:retVal=objShell.Run(PythonExe&''&PythonScript,0,True)
retVal=objShell.Run(“C:\Users\steve.levy\AppData\Local\Programs\Python\Python37-32\Python.exe C:\Users\steve.levy\Documents\elberon\api\salesHist.py”,0,True)
如果retVal=0,则
“什么也不做
其他的
MsgBox“脚本无法运行。程序退出,错误代码为“&retVal&”
如果结束
端接头
副主席()
调用executePython.RunPythonScript(“salesHist.py”)
端接头
程序存在并显示消息框:
“脚本无法运行。程序退出,错误代码为1。”

首先需要获取Python调用的输出。单凭退出代码是没有帮助的。阅读此线程()并相应地调整VBA代码。查看Python进程的stdout和stderr。会有一些有意义的错误消息。我通读了该线程(以及相应的MSDN文档),但无法使其正常工作。我一直在WScript.Sleep行周围发现错误。这个变量没有定义(甚至没有设置(我不确定我会设置它为什么)。下面是MSDN示例:
vba Dim WshShell,oExec set WshShell=CreateObject(“WScript.Shell”)set oExec=WshShell.Exec(“C:\Users\steve.levy\Documents\elberon\venv\Scripts\python.exe C:\Users\steve.levy\Documents\elberon\api\salesHist.py”)Do While oExec.Status=0 WScript.Sleep 100循环WScript.Echo oExec.Status
No,VBA中没有WScript.Sleep,这是VBScript独有的。我建议使用“DoEvents()在While循环中”方法作为替代方法。请参阅