Каким образом можно сделать вывод команды Capturing с помощью Shell.Run вместо Shell.Exec в VBA?

1

Я стараюсь сделать следующее:

Я хочу использовать код, описанный в этом ответе (решение 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 открывается, но программа не выполняется. Это выглядит так:

Изображение 174551

Откройте оболочку и мигающий курсор. "Привет, Пользователь" не печатается, поэтому программа не запускается, так как обычно это выполняется до того, как в программе возникнут какие-либо ошибки. Если я закрою это окно, "Привет, Пользователь!" печатается в VBA, но больше ничего.

Конкретный вопрос: как один входной и выходной массивы через этот интерфейс VBA-Python И получить ошибки, чтобы печатать их в VBA-оболочке?

  • 0
    Не ответ, но в блоге Ньютона Экселя Баха есть множество материалов о том, как позвонить Скипу из VBA.
Теги:
excel-vba

1 ответ

1
Лучший ответ
  1. Один из вариантов - обработка "stuff" с помощью pandas и сохранение в виде csv, затем вставка в VBA в виде массива или даже выполнение всего на python, прежде чем вытащить конечный результат в VBA для форматирования, отправки по электронной почте, что вам нужно для VBA.

  2. относительно ошибки, имел почти ту же проблему и смог разрешить благодарность @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).

надеюсь, это поможет

  • 0
    Я решил свои проблемы, используя второй ответ @Florent B., который более сложный, но и гораздо более надежный. Первый, безусловно, легко реализовать, но монстр Франкенштейнов в исполнении. VBA вызывает Shell для вызова python, который затем вызывает VBA.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню