我正在共享我的代码,因为在线找到的其他代码要么不起作用,因为它是为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
答案 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