如何调试从Excel VBA脚本调用的Python脚本?

时间:2018-08-22 08:29:13

标签: python excel excel-vba pywin32

我从VBA调用python脚本来执行excel无法做到的拟合,而scipy具有便捷的功能。因此,我使用此代码来调用该函数并在VBA中获取并设置数据:

Public Function GetData()
  GetData = Cache
  Cache = Empty
End Function

Public Sub SetData(data)
  Dim ok As Boolean
  Cache = data
End Sub

Sub LSQCBSplineIO(targetrng As Range)
Dim oShell As Object
Dim OutputArr() As Double
Dim InputArr() As Double
Dim ok As Boolean

Call getinputarray(targetrng, InputArr) ' This works, tested it
Set oShell = VBA.CreateObject("WScript.Shell")

' Make the data available via GetData()'
Cache = InputArr

Debug.Assert 0 = oShell.Run("<FullpathtoScript>.py", 0, True)

' Handle the returned data '
targetrng = Cache

End Sub

这确实符合this问题的答案。

我调用的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")
ssc=np.array(data)

# do fitting ...
<insert fitting code here>

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

程序基本上是这样的:

  • VBA调用Python

  • Python调用VBA并获取数据

  • Python做的事

  • Python调用VBA并设置数据

  • Python完成,VBA再次接管

如果现在Python出现错误,VBA将卡住。 VBA不会收到错误消息,并且会永远挂在那里,从而导致excel崩溃。因此,python中的错误意味着以后需要强制退出excel。可以从VBA调用上面的python脚本,因为只有这样,所需的数据才会在正确的位置被收集。

现在的问题是:无法在python和VBA中进行调试。

在python中,该程序无法正常工作,因为它并不意味着可以那样工作,而在VBA中,我没有收到任何错误消息,并且程序被卡住了。

那么如何调试这样的东西?

甚至更好

是否有更聪明的方式在python和VBA之间移动数据?

脚注:我最初使用.txt文件进行中间操作,因此python将具有input.txt和output.txt。但是,这很慢,并且问题全速运行。见我的other question

0 个答案:

没有答案