Arrays Access VBA将数组转换为单个记录

Arrays Access VBA将数组转换为单个记录,arrays,vba,ms-access,listbox,multi-select,Arrays,Vba,Ms Access,Listbox,Multi Select,我正在处理一个数据库,它有两个主表和一个链接表,其中包含来自这两个表的外键。我在Access中创建了一个表单,该表单的目的是使用下拉菜单从一个表中选择一个选项,并使用多选列表框允许用户从另一个表中选择多个选项。然后,用户将单击一个按钮,我的代码(见下文)将在链接表中为列表框中的每个选定选项创建一条记录。例如: 用户在表单上创建新记录,从下拉列表中选择“质量保证”,并从列表框中选择2个选项。当用户单击“cmdAddCompToCurr”按钮时,应在链接表中创建2条记录 当我测试按钮时,它不太正确。

我正在处理一个数据库,它有两个主表和一个链接表,其中包含来自这两个表的外键。我在Access中创建了一个表单,该表单的目的是使用下拉菜单从一个表中选择一个选项,并使用多选列表框允许用户从另一个表中选择多个选项。然后,用户将单击一个按钮,我的代码(见下文)将在链接表中为列表框中的每个选定选项创建一条记录。例如:

用户在表单上创建新记录,从下拉列表中选择“质量保证”,并从列表框中选择2个选项。当用户单击“cmdAddCompToCurr”按钮时,应在链接表中创建2条记录

当我测试按钮时,它不太正确。代码不会将从列表框选择创建的数组转换为单个ID号。无论我从列表框中选择什么项目,我总是在链接表中获得相同的ID号

代码:

专用子命令0_单击()

下一个 结束语:
End Sub

基本问题是,您在
for
循环之前(和之外)分配了
fld_ComponentID
变量。这意味着它只在循环之前设置一次,循环的每次迭代都将使用相同的值。另外,因为它是硬编码到
.Column(0,0)
,所以不管用户实际选择什么,它都会被设置为第一行中的任何内容

相反,将
fld\u ComponentID
定义移动到
for
循环的内部,并使其动态引用
。列(0,i)
,即:

    fld_ComponentID = List89.Column(0, i)
    rs!fld_ComponentID = fld_ComponentID
但是,您会注意到变量本身变得多余,因此您可以:

    rs!fld_ComponentID = List89.Column(0, i)
请注意前面的
IF…END IF
块实际上是冗余的,因此可以完全删除

您没有在任何地方定义
fld\U课程ID
。请注意,如果没有
Option Explicit
,这将自动生成一个带有默认值的变量,该变量不会抛出错误,而且很少有人会这样做。对于下面的完整答案,我假设相关控件名为
txtclumumid

在进行一些控制流更改后,sub的替代方案可以是:

    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Variant

    Set db = CurrentDb()
    Set rs = db.OpenRecordset("tbl_CurCom_Link", dbOpenDynaset)

    If List89.ItemsSelected.Count = 0 Then
        MsgBox "No components were selected"
    Else
        For Each i In List89.ItemsSelected
            rs.AddNew
            rs!fld_CurriculumID = txtCurriculumID.Value
            rs!fld_ComponentID = List89.Column(0, i)
            rs.Update
        Next i
    End If
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Variant

    Set db = CurrentDb()
    Set rs = db.OpenRecordset("tbl_CurCom_Link", dbOpenDynaset)

    If List89.ItemsSelected.Count = 0 Then
        MsgBox "No components were selected"
    Else
        For Each i In List89.ItemsSelected
            rs.AddNew
            rs!fld_CurriculumID = txtCurriculumID.Value
            rs!fld_ComponentID = List89.Column(0, i)
            rs.Update
        Next i
    End If