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