使用列表框为多个选定项目填充数组

时间:2018-02-22 15:36:35

标签: arrays vba excel-vba access-vba excel

我正在共享我的代码,因为在线找到的其他代码要么不起作用,因为它是为excel而不是访问而创建的,因为语法稍有不同,或者缺少基于多选的所需的关键功能。 / p>

那说......这段代码执行以下操作:

如果列表框的行源是查询结果,则代码只是将数组中的多个选定项放入数组中,以便在以后的代码中使用。

从excel到访问的区别是.list适用于Excel,而.Column(0, i)适用于访问

Dim i As Integer
Dim x As Variant
Dim MultiArr()

If Me.lbMultiEdit.ListIndex <> -1 Then
    For i = 0 To Me.lbMultiEdit.ListCount - 1
        If Me.lbMultiEdit.Selected(i) Then
            ReDim Preserve MultiArr(x)
            MultiArr(x) = Me.lbMultiEdit.Column(0, i)
            x = x + 1
        End If
    Next i
End If

'sanity check....
For i = 0 To x - 1
    MsgBox MultiArr(i)
Next i

2 个答案:

答案 0 :(得分:0)

您的代码未经优化。它为每个添加的项目调整数组大小。 ReDim Preserve是一个非常密集的操作,因为它实际上创建了一个所需大小的新数组,然后移动所有项目。

更优化的变体,从不使用ReDim Preserve

Dim i As Integer
Dim x As Variant
Dim MultiArr()

If Me.lbMultiEdit.ItemsSelected.Count = 0 Then Exit Sub 'No items selected
ReDim MultiArr(0 To Me.lbMultiEdit.ItemsSelected.Count - 1)

If Me.lbMultiEdit.ListIndex <> -1 Then 'Why?
    For i = 0 To Me.lbMultiEdit.ListCount - 1
        If Me.lbMultiEdit.Selected(i) Then
            MultiArr(x) = Me.lbMultiEdit.Column(0, i)
            x = x + 1
        End If
    Next i
End If

答案 1 :(得分:0)

不是迭代所有项目并测试是否选择了每个项目,而只是迭代所选项目,例如:

Dim i As Integer, v, MultiArr()
ReDim MultiArr(0 To Me.lbMultiEdit.ItemsSelected.Count - 1)

For Each v In Me.lbMultiEdit.ItemsSelected
    MultiArr(i) = Me.lbMultiEdit.ItemData(v)
    i = 1 + i
Next v

或者,使用With声明:

Dim i As Integer, v, MultiArr()

With Me.lbMultiEdit
    ReDim MultiArr(0 To .ItemsSelected.Count - 1)
    For Each v In .ItemsSelected
        MultiArr(i) = .ItemData(v)
        i = 1 + i
    Next v
End With