0

我写这篇文章时不确定它是否是确切的问题。我尝试用 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 运行时是否可以调试代码。这将帮助我解决它。

谢谢您的帮助

4

1 回答 1

0

当我不选择任何单元格时,我只会收到您的错误。所以是的,你可能是对的,由于某种原因它没有得到选择。你怎么叫RunPython?用按钮?

但是,您没有正确连接modTable:而不是 numpy 数组列表(类似于[array([ 2., 8., 8.]), array([ 3., 6., 6.])]),您应该构造一个数组:(array([[ 2., 8., 8.],[3., 6., 6.]])如果您尝试引入数组列表,带有 Python3 的 xlwings 甚至会抱怨。)

至于调试:我能想到两种可能性(都在等待更好的文档):

  1. 添加一些日志语句(见这里

  2. 从 PyCharm、PyDev (Eclipse) 或 Visual Studio 使用远程调试,一些信息可以在这里找到

于 2016-01-04T20:23:25.003 回答