Я стараюсь сделать следующее:
Я хочу использовать код, описанный в этом ответе (решение 1), для передачи массивов данных между excel-VBA и Python. Причина этого в том, что я не могу найти scipy-метод для VBA, и поэтому я делаю это так. Чтобы поймать сообщения об ошибках из python, я попытался реализовать что-то вроде этого.
Мой код 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)
Идея проста:
вызвать скрипт python с помощью shell.run или shell.exec(oCmd)
скрипт python получает его от VBA
python делает вещи
python передает данные обратно в VBA
выводить сообщения об ошибках печати
Проблема с этим кодом VBA заключается в том, что Python.exe открывается, но программа не выполняется. Это выглядит так:
Откройте оболочку и мигающий курсор. "Привет, Пользователь" не печатается, поэтому программа не запускается, так как обычно это выполняется до того, как в программе возникнут какие-либо ошибки. Если я закрою это окно, "Привет, Пользователь!" печатается в VBA, но больше ничего.
Конкретный вопрос: как один входной и выходной массивы через этот интерфейс VBA-Python И получить ошибки, чтобы печатать их в VBA-оболочке?
Один из вариантов - обработка "stuff" с помощью pandas
и сохранение в виде csv
, затем вставка в VBA в виде массива или даже выполнение всего на python, прежде чем вытащить конечный результат в VBA для форматирования, отправки по электронной почте, что вам нужно для VBA.
относительно ошибки, имел почти ту же проблему и смог разрешить благодарность @MichaelButscher. ссылка. В основном вам необходимо использовать переадресацию ошибок, как в
import sys 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') path = r'\\yourpath\test\test1.txt' with open (path, "w") as f: f.write("test1") raise IndexError
для отслеживания фатальных ошибок (err.txt) или ожидаемого вывода (out.txt).
надеюсь, это поможет