Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBA(Excel)中以编程方式添加组合框_Excel_Vba_Combobox - Fatal编程技术网

在VBA(Excel)中以编程方式添加组合框

在VBA(Excel)中以编程方式添加组合框,excel,vba,combobox,Excel,Vba,Combobox,我试图在VBA中创建、放置和填充组合框的元素。我不明白我错过了什么,但我不可能想出怎么做。我的API中没有MSForms(也就是说,我不能将Dim someComboBox编写为MSForms.ComboBox,因为它失败了。是否可以以某种方式导入它?有人能给我指出正确的方向吗 我想要实现的是,当用户单击按钮时,将创建一个包含各种项目(组合框、单选按钮等)的新表单,因此我希望以编程方式执行此操作。您可以依赖以下代码: Set curCombo = ActiveSheet.Shapes.AddF

我试图在VBA中创建、放置和填充组合框的元素。我不明白我错过了什么,但我不可能想出怎么做。我的API中没有
MSForms
(也就是说,我不能将
Dim someComboBox编写为MSForms.ComboBox
,因为它失败了。是否可以以某种方式导入它?有人能给我指出正确的方向吗


我想要实现的是,当用户单击按钮时,将创建一个包含各种项目(组合框、单选按钮等)的新表单,因此我希望以编程方式执行此操作。

您可以依赖以下代码:

 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

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

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

您可以通过编程方式创建UserForm、ComboBox等,但只需插入UserForm并将其隐藏起来,直到需要时,这会更容易。如果需要,您仍然可以通过编程方式向其添加新控件


添加的表单对象库无法让您创建全新的表单和控件。您需要Microsoft Visual Basic for Applications Extensibility库。虽然旧,但仍然相关。

完美!再次感谢@varocabas如果我在
工作簿_Open
上加载此控件,那么当工作簿再次关闭时,我如何删除它?我发现每次打开工作簿时,它都会在现有控件的基础上创建一个控件。如果在另一个控件的基础上有500个控件,这可能是一个问题…@AlfaBravo你似乎不太清楚。请不要生气:1.这/我/不是为你提供的咨询服务,可以为你可能遇到的任何问题提供个性化的答案(我为此获得报酬)。两年前我写这个答案时,情况并非如此,现在也肯定不是这样。因此,这里的主要思想是为OP的问题提供一些帮助,最好是尽可能笼统。事实上,我的这个答案可能被认为过于具体,无法回答问题以及回答者的预期行为re…@AlfaBravo…2.您所问的与我的答案/代码或原始问题完全无关。实际上(同样不想冒犯您),对于VBA或任何其他语言来说,这似乎都不是一个太明智的问题。让我重新措辞,以帮助您理解我的观点:“为什么我有500件东西,而我所做的是创建它们,而不是在之后删除它们?”。答案似乎很清楚,不是吗?试一试以下程序:在之后删除它们(例如,在图书关闭事件中?)或者依赖于更智能的…@AlfaBravo…创建过程,例如,仅在确认不存在任何形状后添加新形状,或者干脆不保存对文件的更改(即,添加形状,使用形状执行任何操作,然后关闭工作簿而不保存它)。总之,您的问题不是关于此问题/答案或VBA,而是您的问题是什么,以便在考虑最佳解决方案之前,先充分了解给定的情况。永远不要忘记的诀窍:在任何情况下实际键入命令。。。