0

我安装了 Add-on PyXll,一切正常。

我在excel中定义了一个函数来获取一个数组,它在函数下,我想在许多数组上重新使用这个函数,所以我想使用参考L1C1来与函数相关。

当我这样做时,我的功能在 A1 上:

xl = xl_app()
specific_range = xl.ActiveSheet.Range.("A2:B5")

效果很好!

但如果我这样做:

xl = xl_app()
specific_range = xl.ActiveSheet.Range("L(1)C(0):L(4)C(1)")

或者

specific_range = xl.ActiveSheet.Range("L1C0:L4C1")

不行 ! ##com_error: (-2147352567, 'Une exception s'est produite.', (0, None, None, None, 0, -2146827284), None)

如何配置具有参考 L1C1 ?或者它是另一种方式来获得我的结果?

非常感谢

4

1 回答 1

0

暴露给 Python 的 Excel API 与您可能在 VBA 中使用的 API 相同。一般来说,如果你能弄清楚如何在 VBA 中做你想做的事,那么你可以将它翻译成 Python。PyXLL 文档中的以下页面应该会有所帮助: https ://www.pyxll.com/docs/userguide/vba.html 。

要获取相对于当前函数的范围,您可以使用 Application.Caller 属性: https ://docs.microsoft.com/en-us/office/vba/api/Excel.Application.Caller

获得调用范围后,您可以使用 Offset 属性来获取相邻的单元格: https ://docs.microsoft.com/en-us/office/vba/api/Excel.Range.Offset

例如,

from pyxll import xl_app

xl = xl_app()
caller = xl.Caller
specific_range = caller.GetOffset(1, 2)

您可以从左上角和右下角的单元格构造一个范围,例如

xl = xl_app()
top_left = xl.Caller
bottom_right = caller.GetOffset(1, 2)
specific_range = xl.Range(top_left, bottom_right)

要查看的另一件事是 PYXLL 下载的“automation.py”示例中包含的“automation_example”函数。此示例使用类似但略有不同的方式来获取调用单元格下方的范围,并使用 PyXLL 的 async_call 函数安排函数在 Excel 完成计算后写入该范围。

您可以改为将范围传递给您的函数。这是将这样的数据传递到函数中的更常用方法。以下文档应该有所帮助

这样做的好处是您不需要在代码中获取范围,您只需将其传递给函数,并且每次该范围内的值发生变化时,都会调用您的函数。

例如,你可以做

from pyxll import xl_app

@xl_func("var[][]: str")
def test(values):
    return str(values)

# In Excel...
# A1: =test(A2:B6)
# E1: =test(E2:F6) 
于 2021-01-28T11:52:45.400 回答