使用xlwings操作用户表单

时间:2017-08-29 18:05:32

标签: python excel-vba xlwings vba excel

我试图在Excel中找出userform ComboBox的pywin32对象的方法,但老实说我不知道​​我在做什么,无处可去。

VBA代码(将组合框对象发送到python):

Private Sub ComboBox1_Change()
    s = test(ComboBox1)
End Sub

Python代码:

@xw.func
def test(obj):
    print(obj._dict__)

所以,上面的印刷品返回了这个:

{'_oleobj_': <PyIDispatch at 0x03957A90 with obj at 0x01218C8C>, '_username_': 'IMdcCombo', '_olerepr_': <win32com.client.build.LazyDispatchItem object at 0x03FB0FD0>, '_mapCachedItems_': {}, '_builtMethods_': {}, '_enum_': None, '_unicode_to_string_': None, '_lazydata_': (<PyITypeInfo at 0x03957B50 with obj at 0x0121919C>, <PyITypeComp at 0x03957B68 with obj at 0x012196F4>)}

我想我希望在VBA中看到相同的方法/属性,但我不知道从中获取什么。

任何人都知道使用xlwings直接从python操作userform / controls的方法吗?

具体来说,我正在寻找动态添加新控件到userform,读取/修改控件属性,以及理想地修改它们的事件,所有这些都是通过python实现的。

2 个答案:

答案 0 :(得分:1)

Shape下查看documentation下的xlWings时,似乎可以访问所有属性。

missing features下,您可以找到使用.api访问所有vba方法的变通方法。通过这个,您可以创建和修改控件,就像在VBA中一样。

您还可以使用macro(name) - 函数在VBA中创建函数来修改,创建comboboxes并将值传递给函数,即创建combobox at位置x,y,宽度,高度,并通过python传递这些参数。

看起来,您无法通过xlWings访问事件。但我发现IronPython,它使用.NET互操作工具来访问excel对象和事件。正如您在documentation下看到的那样,您可以像在C#, VB.NET等中一样使用excel对象。

作为结论,我建议你查阅两者的文件。因为他们都向python展示了excel对象,你应该能够用其中一个做你想做的事。

答案 1 :(得分:1)

  

我想我希望在VBA中看到相同的方法/属性,但我不知道从中获取什么。

您可以从中获取任何内容,但不是真正的Combobox,也不是来自COM环境的内容 - 它只是一个“包装器“COM对象上的对象,通过IDispatch接口实现,并且可能归功于win32com依赖。

因为没有类似“intellisense”的功能,但你仍然可以使用属性/方法:

@xw.func
def test(obj):
    #   accesing method
    obj.AddItem('Hello world!')
    #   accesing property
    obj.Enabled = False

您也可以将UserForm作为obj传递给add一个新控件:

@xw.func
def test(obj):
    #   add new label
    control = obj.Add('Forms.Label.1')
    #   accesing property
    control.Caption = 'Hello world!'