【问题标题】:How to remove item from combobox in a userform?如何从用户窗体的组合框中删除项目?
【发布时间】:2023-02-17 05:31:40
【问题描述】:

我在工作表中有一个名字列表。我将这些名称设置为 useform 上组合框的 RowSource。

涉及两个组合框。一个开始满,另一个开始空。

我希望当我从第一个(完整)组合框中单击一个名称时,将所述名称添加到另一个组合框中,并从原始组合框中删除(最终反之亦然)。

我无法删除任何内容除去项目.

我去了'菜单.ListeAjoutAg.ListIndex'获取我当前选择的索引的方法('菜单' 是用户窗体和 'ListeAjoutAg' 是组合框),但它不起作用。
尝试通过我快速创建的变量输入,'b',但结果相同。没有索引号有效。我检查了一下,只提供正确和/或在我的列表范围内(大约 45 个名称)的函数整数(0、1、3、4 ...)。

Private Sub ListeAjoutAg_Change()
    a = Menu.ListeAjoutAg.Text
    b = Menu.ListeAjoutAg.ListIndex
    Menu.ListeRetirer.AddItem (a) ' goes fine till there
    Menu.ListeAjoutAg.RemoveItem (b) 'and here it goes wrong
    Menu.ListeRetirer.Enabled = True
    Menu.ListeRetirer.Visible = True
End Sub

【问题讨论】:

  • 如果为列表框设置行源,则既不能添加也不能删除项目。您将需要手动填充列表框(只需遍历行源的所有单元格并使用AddItem)

标签: excel vba combobox userform


【解决方案1】:

如前所述:如果设置了 Rowsource 属性,则无法在列表框中添加或删除项目。

但是,从范围中填充列表框相当容易 - 只需将单元格值复制到数组中并将该数组分配为 List。参见例如VBA Excel Populate ListBox with multiple columns

将以下例程放入您的表单中,并从表单 Activate 事件中调用它。

Private Sub fillListBox(r As Range)
    Me.ListeAjoutAg.Clear
    Me.ListeAjoutAg.ColumnCount = r.Columns.Count
    
    Dim data
    data = r.Value
    Me.ListeAjoutAg.List = data
End Sub

Private Sub UserForm_Activate()
    Dim r As Range
    ' Replace this with the range where your data is stored.
    Set r = ThisWorkbook.Sheets(1).Range("A2:C10") 
    fillListBox r
End Sub

【讨论】:

  • 哦...我想我终于明白发生了什么。好吧,首先,由于按照您建议的方式填充组合,我设法根据我想要的删除了东西,现在它仍然会抛出一个错误,同样的,但那是因为删除所选项目“改变”了组合框,因此它回到函数中,这次没有选择任何东西,所以索引是 -1 ...我猜我会捕获错误并忽略它。多谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多