将所选项目从数据库填充到多选列表框

时间:2013-10-11 18:57:51

标签: vba ms-access access-vba

我有一个MS Access数据库,我创建了一个表单,可以在列表框中选择多个项目。我用管道保存到数据库中分隔符。我遇到的问题是当有人需要修改表单时,我需要用它的普通值填充列表框,然后根据数据库的拉动,选择项目。

我目前有一个开始,我分割从数据库中提取的记录,但之后我迷路了:

temps = Split(records("Pillar"), "|")

我知道我需要做一个 For Each 声明,但我迷路了。我试过......

For Each varItem In temps
    Pillar.ItemData(0) = varItem
Next

但这不起作用。这就是我所能得到的唯一正确值,我可以使用的是Pillar.ItemsSelected,但是当我这样做时,我收到了一个只读错误。

1 个答案:

答案 0 :(得分:0)

您检索records("Pillar"),这是一串| - 分隔的数字。然后Split()将该字符串转换为数组。关键是要选择其值与其中一个数组成员匹配的每个列表框行。

但是,我认为你实际上并不需要一个数组。将|添加到该字符串的开头和结尾应该更容易,然后使用InStr()检查修改后的字符串中是否包含|字符中的列表框值

这种描述可能很难理解。看看立即澄清它的这个例子。

cstrPillar = "1|2|3"
? "|" & cstrPillar & "|"
|1|2|3|
strListBoxValue = "3"
? "|" & strListBoxValue & "|"
|3|
? InStr(1, "|" & cstrPillar & "|", "|" & strListBoxValue & "|")
 5 

如果这是有意义的,这就是我在命令按钮的单击事件中应用它的方式。注意我使用字符串常量cstrPillar作为您使用records("Pillar")动态检索的字符串的代理。我将我的多选列表框命名为lstPillar

Private Sub cmdSelectRows_Click()
    Const cstrPillar As String = "1|2|3"
    Dim i As Long
    For i = 0 To (Me.lstPillar.ListCount - 1)
        Me.lstPillar.Selected(i) = ( _
            InStr(1, _
                "|" & cstrPillar & "|", _
                "|" & Me.lstPillar.ItemData(i) & "|") > 0)
    Next
End Sub

该click事件的效果是选择与1,2或3匹配的列表框行,并取消选中所有其他行。

我意识到Me.lstPillar.Selected(i)声明可能具有挑战性。我建议的最好的方法是返回立即窗口示例,希望能够说清楚。