从VBA运行时,xlwings不会“获取所选内容”

2024-09-30 22:10:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我写这篇文章的时候有点不确定它是否就是问题所在。我试着和Spyder一起调试这个问题,更确定的是没有用。你知道吗

问题是,当使用Workbook.set_mock_caller(path)选项时,我的脚本在Spyder中的解释器中运行良好,但在VBA中运行不好。你知道吗

<>我怀疑^ {< CD2>}得到了一个空的选择,但是我不能肯定,因为我不能停止中间的代码。你知道吗

无论如何,我的脚本是我第一次尝试使用这个包,所以对于以前使用过它的人来说不会太复杂。该函数所做的是将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运行。这会帮助我解决它。你知道吗

谢谢你的帮助


Tags: keyinforvbaworkbooksortedspydercaller
1条回答
网友
1楼 · 发布于 2024-09-30 22:10:25

我只在没有选择任何单元格时才得到你的错误。所以是的,你可能是对的,因为某些原因它没有得到选择。你怎么称呼RunPython?有按钮吗?你知道吗

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

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

  1. 添加一些日志语句(请参见here

  2. 使用PyCharm、PyDev(Eclipse)或visualstudio的远程调试,可以找到一些信息here

相关问题 更多 >