【问题标题】:How do I properly add items in a multilistbox?如何在多列表框中正确添加项目?
【发布时间】:2025-12-26 16:20:21
【问题描述】:

我正在使用 vba 获取设备编号及其相应信息并将它们放入列表框中。用户将输入他们想要的设备编号,excel 将获取信息。但是,当我第一次单击“获取数据”按钮时,它可以正常工作。当我第二次为另一个设备编号执行此操作时,我收到消息“无法设置列表属性。无效的属性数组索引。”这是我的代码:

Dim value As Long

Public i As Integer

    Private Sub GetDataButton_Click()

    Dim num As Variant

value = EquipmentNumber.value

    For Each num In Sheets("S1 Cvtg Eqt List").Range(Range("B1"), Range("B1").End(xlDown))

        If num = value Then


            MWOList.AddItem (num)
            MWOList.List(i, 1) = (num.Offset(0, 1))
            MWOList.List(i, 2) = (num.Offset(0, 2))
            MWOList.List(i, 3) = (num.Offset(0, 3))
            MWOList.List(i, 4) = (num.Offset(0, 4))
            MWOList.List(i, 5) = (num.Offset(0, 5))

    i = i + 1

End If

 Next num

 i = i + 1

 End Sub

【问题讨论】:

  • 仅供参考 'EquipmentNumber' 是一个文本框。
  • 哪一行给出了错误?
  • 您需要在 End Sub 之前删除 i = i + 1
  • a) 您可以完全避免变量i 并在.AddItem num 之后使用列表的.ListCount 属性;因为.List 是从零开始减去-1 导致列表的当前行索引:MWOList.List(MWOList.ListCount - 1, i) = ...;顺便说一句,使用 With MWOList .. End With 缩短代码; b) 不要使用现有的属性或函数名称(如value)重载代码,使用例如myValue。 c) 使用数组加速代码,d) 更喜欢将与范围相关的计数器声明为 Long 而不是 Integer,因为超过 100 万行的行数可能超过 +32k 的正整数限制。 - @JaylanPaige
  • 仅供参考 使用数组方法的更多链接:Populate listbox with multiple columns; Speed up filling of listbox values in UserForms - @JaylanPaige

标签: vba listboxitem


【解决方案1】:

试试下面,请注意我不仅将“i”声明和值更改为public,而且List列的位置从0开始,所以如果这是6元素表,则将其切换回来。

您出现错误的原因实际上是循环之后的另一个“i”迭代“i=i+1”,列表行也从 0 开始,因此您添加了第二个索引,并尝试将其插入到第三个位置.

Public value As Long
Public i As Integer
Private Sub GetDataButton_Click()

Dim num As Variant

value = EquipmentNumber.value

For Each num In Sheets("S1 Cvtg Eqt List").Range(Range("B1"), Range("B1").End(xlDown))

If num = value Then
    i = MWOList.ListCount 'set i to available space
    MWOList.AddItem
    MWOList.List(i, 0) = (num.Offset(0, 1))
    MWOList.List(i, 1) = (num.Offset(0, 2))
    MWOList.List(i, 2) = (num.Offset(0, 3))
    MWOList.List(i, 3) = (num.Offset(0, 4))
    MWOList.List(i, 4) = (num.Offset(0, 5))

End If

Next num

EquipmentNumber = ""

End Sub

【讨论】:

  • 右方向 +:);建议在过程级别而不是模块级别声明变量i。顺便说一句,num.Value 分配不需要括号。仅供参考在我对 OP 的评论中进一步评论。