我从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。