我写这个有一些不确定性,这是确切的问题。我尝试用Spyder调试这个问题,更确定没有用。
问题是我的脚本在使用Workbook.set_mock_caller(path)
选项时从Spyder中的解释器运行良好,但它在VBA内运行不佳。
我怀疑get_selection()
得到了一个空的选择,但后来我无法确定,因为我无法在中间停止代码。
在任何情况下,我的脚本都是我第一次尝试使用该软件包,因此对于之前使用它的人来说,它不会非常复杂。该函数的作用是通过第一列合并Excel选择表,并将其余列添加到一起。
def xl_consolidate():
thisWB = xl.Workbook.caller()
thisSlctn = thisWB.get_selection(asarray=True, atleast_2d=True)
thisTable = thisSlctn.value
(m,n) = thisSlctn.shape
r = thisSlctn.row
c = thisSlctn.column
tableDict = dict()
tableVals = thisTable[:, 1:].astype(np.float)
for i in range(m):
thisKey = thisTable[i, 0]
if thisKey not in tableDict:
tableDict[thisKey] = tableVals[i, :]
else:
tableDict[thisKey] += tableVals[i, :]
modTable = sorted(tableDict.keys(), key = lambda k:(-tableDict[k][0], k))
modTable = [np.hstack((key, tableDict[key])) for key in modTable]
thisSlctn.clear()
xl.Range((r, c)).value = modTable
错误发生在sorted
函数中,它说明如下:
Error
modTable = sorted(tableDict.keys(), key = lambda k:(-tableDict[k][0], k))
IndexError: index 0 is out of bounds for axis 0 with size 0
我在从VBA调用函数时做了选择。
作为一个额外的问题,我想知道从VBA运行时是否可以调试代码。这将有助于我解决它。
感谢您的帮助
答案 0 :(得分:0)
当我没有选择任何单元格时,我只会收到您的错误。所以,是的,你可能是正确的,由于某种原因,它没有得到选择。你怎么称RunPython
?用按钮?
但是,您没有正确连接modTable
:而不是numpy数组列表(类似[array([ 2., 8., 8.]), array([ 3., 6., 6.])]
),您应该构建一个数组:array([[ 2., 8., 8.],[3., 6., 6.]])
(如果你试图引入一个数组列表,Python3的xlwings甚至会抱怨。)
至于调试:我可以想到两种可能性(两者都在等待更好的文档):