gpt4 book ai didi

python - 在 VBA 中,如何使用 Shell.Run 而不是 Shell.Exec 来捕获 shell 输出?

转载 作者:行者123 更新时间:2023-12-01 09:07:16 25 4
gpt4 key购买 nike

我尝试执行以下操作:

我想使用answer中描述的代码(解决方案 1)在 excel-VBA 和 Python 之间传递数据数组。原因是我找不到 VBA 的 scipy 方法,因此我这样做。为了捕获来自 python 的错误消息,我尝试实现类似 this 的东西.

我的 VBA 代码如下所示:

Sub Usage2()
Dim outputarr() As Double
Dim oShell As Object, oCmd As String
Dim oExec As Object, oOutput As Object
Dim arg As Variant
Dim s As String, sLine As String

Set oShell = CreateObject("WScript.Shell")
oCmd = "<fullpathtopython> " & """" & "<fullpathtoscript>" & """"
' Make the data available via GetData()'
Cache = Array(4, 6, 8, 9)

Set oExec = oShell.Exec(oCmd)
Set oOutput = oExec.StdOut

While Not oOutput.AtEndOfStream
sLine = oOutput.ReadLine
If sLine <> "" Then s = s & sLine & vbNewLine
Wend

Debug.Print s
' Handle the returned data '
Debug.Assert Cache(3) = 8

Set oOutput = Nothing: Set oExec = Nothing
Set oShell = Nothing
End Sub

我的 python 脚本如下所示:

import win32com.client
import numpy as np
import os
import matplotlib.pyplot as plt
import win32com.client
from scipy.interpolate import LSQUnivariateSpline, UnivariateSpline

print "Hello, User!"

# get the running instance of Excel
app = win32com.client.GetObject(Class="Excel.Application")

# get some data from Excel
data = app.run("GetData") # this OR

ssc=np.array(data) # this probably makes an error
print ssc

#do some fitting ...

# return some data to excel
app.run("SetData", sscnew)

这个想法很简单:

  • 使用 shell.run 或 shell.exec(oCmd) 调用 python 脚本

  • Python 脚本从 VBA 获取输入

  • Python 可以做一些事情

  • Python 将数据传回 VBA

  • 打印发生的错误消息

此 VBA 代码的问题是,Python.exe 打开但程序未执行。它看起来像这样:

enter image description here

打开 shell 并闪烁光标。 “你好,用户”不会被打印,因此程序不会被执行,因为这通常在程序中发生任何错误之前运行。如果我关闭此窗口,“您好,用户!”在 VBA 中打印,但没有其他内容。

具体问题:如何通过此 VBA-Python 接口(interface)输入和输出数组并获取错误消息以在 VBA-shell 中打印它们?

最佳答案

  1. 一种选择是使用 pandas 处理“东西”并保存为 csv,然后将其作为数组拉入 VBA,甚至之前在 python 中执行所有操作将最终结果提取到 VBA 中以进行格式化、电子邮件发送以及任何您需要 VBA 的用途。

  2. 关于该错误,遇到了几乎相同的问题,并且能够解决,感谢@MichaelButscherlink 。基本上你需要使用错误重定向,如

    导入系统
    path_err = r'\\yourpath\test\err.txt'
    path_out = r'\\yourpath\test\out.txt'
    sys.stderr = open(path_err, 'w')
    sys.stdout = open(path_out, 'w')
    路径 = r'\\yourpath\test\test1.txt'
    将 open (path, "w") 作为 f:
    f.write("测试1")
    引发索引错误

跟踪 fatal error (err.txt) 或预期输出 (out.txt)。

希望这有帮助

关于python - 在 VBA 中,如何使用 Shell.Run 而不是 Shell.Exec 来捕获 shell 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51947269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com