如何使用xlwings从Python向UserForm上的组合框添加项?

2024-06-12 06:49:00 发布

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

伙计们,我已经搜索了几天,找不到解决这个问题的方法。以下是我试图做的:

  1. 在Excel中打开一个UserForm(我可以做得很好)
  2. 使用xlwings在用户表单上填充一个组合框,其中包含Python字典中的名称

以下是我迄今为止所做的工作:

  • 向图纸中添加了下拉表单控件
  • 从Python填充该控件
  • 使用xlwings操作许多其他电子表格项目(因此我知道它工作正常)

以下代码适用于特定工作表上的表单控件-我使用xlwings附带的RunPython模块执行,并按预期工作:

def fill_name_cb():
    WS_MAIN = xw.Book("Assessment.xlsm").sheets['Assessment']
    cb = WS_MAIN.shapes("cbNames").api.ControlFormat
    cb.RemoveAllItems()
    for name in ATTR_DICT["names"]: # This is filled in elsewhere, and resolves to a list of names
        cb.AddItem(name)
    cb.ListIndex = 1

这很好用

现在,我需要对UserForm上的combobox执行类似的操作,我正在尝试找出如何填充该combobox。我不知道如何引用UserForm,更具体地说,是该UserForm上的combobox。我假设在Python中是这样的:

cb = xw.Book("Assessment.xlsm").userform("frmForm").Control("cbxNames")

我尝试了几种不同的方法,但是我没有找到有效的组合

仅供参考:我确实找到并尝试了this。第一个答案建议将引用传递给对象(combobox或userform)。我试图这样做:

Dim cbo As ComboBox
    Set cbo = cbxListOfNames
    RunPython ("import helpers; helpers.fill_user_name_cbx('" & cbo & "')")

相应的Python脚本是:

def fill_user_name_cbx(cbx):
    cbx.AddItem("New name")

该解决方案成功地将其添加到Python脚本中(我在执行的cbx.AddItem行之前添加了另一行),但随后出现了cbx.AddItem("New name") AttributeError: 'str' object has no attribute 'AddItem'错误

这告诉我没有传递对象引用,只是传递对象名称的字符串

有人知道如何做到这一点吗?谢谢你的帮助


Tags: 对象方法name名称表单xlwingsfill控件