VBA 中的动态组合框项
Posted
技术标签:
【中文标题】VBA 中的动态组合框项【英文标题】:Dynamic combobox items in VBA 【发布时间】:2017-01-08 10:15:08 【问题描述】:我有一个简单的 Excel 用户表单,其中包含 3 个组合框,其中有几个项目供用户选择,每个框中的“选项 A”、“选项 B”、“选项 C”。我想将用户选择的任何选项存储在任何框中,然后从其他 2 个框中删除该项目。如果用户更改了在任何框中选择的项目,我需要将该项目添加回其他 2 个框中可供选择的项目。首先,我尝试将每个框选择的每个项目存储在“已使用”变量中,然后根据用户选择添加回列表:我知道如何使用名称通过名称引用添加项目,例如“选项 A”,但是要删除它们,我知道的唯一方法是引用它们的索引号,这没有帮助,因为它会根据组合框列表中的项目数而变化。因此,如果从一个框中选择了任何选项,则需要从其他 2 个框中删除该选项,并在该部分更改时重新添加。一旦用户在前 2 个框中选择了项目,最后一个框应该只有一个项目可供选择。我有:
With ComboBox1
.AddItem "Option A"
.AddItem "Option B"
.AddItem "Option C"
End With
ComboBox1.RemoveItem 1 'need to refer to item by name instead: remove "Option A" ?
请具体说明,因为我不是高级 VBA 用户。任何帮助,将不胜感激。
【问题讨论】:
【参考方案1】:您可以动态地为控件分配名称,然后use names rather than indexes to refer to those controls。 或者,您可以在代码中声明一个集合或变量,并在其中存储对这些组合框的引用(请参阅control arrays)
我强烈建议您不要动态删除控件 - disabling 它们提供了更好的用户体验。
如果您仍然希望它们消失,您可以alter their visibility property,再次避免删除。
此外,您似乎真的在尝试按特定顺序选择非重复元素。难道没有某种更适合这个目的的列表控件吗?
【讨论】:
谢谢。是的,将选项限制为非重复项目正是我所需要的。我已经尝试按照您的建议禁用,但我是 VBA 的新手,我发现的唯一方法涉及引用索引号(尽管如果列表没有更新,这可能不再是问题)。列表控件可以工作 - 我想我需要一个类似 for 循环的东西来在进行更改时更新其他两个框。请您提供一个如何完成此操作的示例或命名我应该查看的 VBA 方法吗? @Bruce,我已经为我的答案添加了一些链接,希望对您有所帮助。如果您将使用控件数组并隐藏/禁用控件而不是删除 - 那么按索引访问将不是问题。如果您打算继续删除控件,您可以使用 .Name 属性设置它们的名称,然后从顶部容器按名称访问它们,如第一个链接中所述。干杯! @Bruce,如果对您有帮助,请将其标记为答案!非常感谢! @Bruce,很乐意提供帮助 - 请不要犹豫,将此标记为答案(绿色勾号 V)以上是关于VBA 中的动态组合框项的主要内容,如果未能解决你的问题,请参考以下文章
带有按钮、组合框和文本框的 C# WinForms (.NET Framework) DataGridView:使用按钮添加新行以添加组合框项时出错