使用VBA(Excel)编程添加组合框

3
我正在尝试在VBA中创建、放置和填充ComboBox元素。我不知道我缺少什么,但我无法弄清楚如何做到这一点。我的API中没有MSForms(即我无法编写Dim someComboBox As MSForms.ComboBox因为它失败了)。是否有可能以某种方式导入它?有人可以指点我正确的方向吗?
我想要实现的是,当用户单击按钮时,会创建一个新表单,并包含各种项目(ComboBoxes、RadioButtons等),因此我希望以编程方式完成这个过程。
2个回答

14

您可以依赖以下代码:

 Set curCombo = ActiveSheet.Shapes.AddFormControl(xlDropDown, Left:=Cells(1, 1).Left, Top:=Cells(2, 1).Top, Width:=100, Height:=20)
 With curCombo
        .ControlFormat.DropDownLines = 2
        .ControlFormat.AddItem "Item 1", 1
        .ControlFormat.AddItem "item 2", 2
        .Name = "myCombo"
        .OnAction = "myCombo_Change"
 End With

@varocarbas 如果我在“Workbook_Open”中加载此控件,那么当工作簿再次关闭时,如何删除它?我发现每次打开工作簿时都会创建一个控件,显然会覆盖现有的控件。如果有500个控件叠加在一起,这可能会成为一个问题... - Alfa Bravo
1
@AlfaBravo 有几个基本的想法,你似乎不太清楚。请不要生气:1. 我/这个回答并不是为了给你提供个性化的解决方案(我会因此而得到报酬)。两年前我写这篇回答时情况可能不同,但现在肯定不是这样了。在SO中,主要的想法是为OP的问题提供一些帮助,最好尽可能通用。实际上,我的这个回答可能被认为对于所问的问题和回答者的预期行为来说过于具体了... - varocarbas
1
@AlfaBravo... 2. 你所问的与我的答案/代码或原始问题完全无关。实际上(再次不想冒犯您),这似乎甚至对于VBA或任何其他语言来说都不是一个太明智的问题。让我重新表述一下,以帮助您理解我的观点:“为什么我创建了500个东西,但在创建后没有将它们删除?”答案似乎很清楚,不是吗?那么,您可以尝试以下其中一种方法:之后删除它们(例如,在关闭工作簿事件中)或依靠更智能的... - varocarbas
1
@AlfaBravo... 创建过程,例如在确认不存在任何形状后才添加新形状,或者简单地不保存对文件的更改(即添加形状,使用它执行任何操作,然后关闭工作簿而不保存它)。总之,您的问题不是关于此问题/答案或VBA,而是似乎您无法充分理解所给出的情况作为必要的前置步骤,然后考虑可能是最佳解决方案。永远不要忘记的技巧:实际键入命令以及其他任何内容... - varocarbas
2
@AlfaBravo...编程语言通常是软件开发过程中不太重要的部分。你应该把大部分精力放在正确理解给定情况和明确如何进行的想法上。即使你是一个新手(总体或在那种语言中),你也应该在开始打字、复制/粘贴、询问等之前仔细思考。 - varocarbas

0

您需要引用 Microsoft Forms 2.0 对象库。一种简单的方法是在项目中插入一个用户窗体。

或者,在“工具/引用”对话框中找到此引用。

您可以通过编程方式创建用户窗体、组合框等,但最好还是插入一个用户窗体并将其隐藏,直到需要使用它。如果需要,仍然可以通过编程方式向其添加新控件。

补充 表单对象库无法让您创建全新的表单和控件。您需要使用Microsoft Visual Basic for Applications Extensibility库。此链接已经过时,但仍然相关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接