2016-04-27 51 views
0

我有一个表单用于收集将在Access 2016中插入到数据库表中的信息。我的表单有一个多值组合框(称为cmbContacts)从联系人表(ID和名称)中提取值。用户可以从组合框中选择0个或更多联系人。当用户单击提交按钮时,button_click事件触发VBA代码来格式化信息并将其插入表中。从访问vba中的多值组合框中获取值

我需要做的是从组合框中获取每个选定联系人的ID。

这是我到目前为止有:

If Me.cmbContacts.ItemsSelected.Count > 0 Then 'Only run code if there are contacts selected' 
    'Select the most recently added entry (added right before this if statement)' 
    Dim rs As DAO.Recordset, Max As Integer 
    SQL = "SELECT MAX(ID) FROM Breweries" 
    Set rs = CurrentDb.OpenRecordset(SQL) 
    Max = rs.Fields(0) 
    'Insert each selected Contact ID into Breweries.[Contact Names].Value' 
    Dim itm As Variant 
    For Each itm In Me.cmbContacts.ItemsSelected 
     SQL = "INSERT INTO Breweries ([Contact Names].[Value]) VALUES (" + itm + ") WHERE ID=" + Max 
     CurrentDb.Execute (SQL) 
    Next itm 
End If 

的一些问题:

  • Me.cmbContacts.ItemsSelected.Count总是等于0,无论有多少项目在组合框中
  • 选择
  • 因为cmbContacts.ItemsSelected不包含所选项目,所以for循环不运行。我不知道为什么它没有注册选定的项目
+0

我不太清楚你为什么要用Max。您不需要SQL语句中的Where部分。 SQL =“INSERT INTO Breweries([Contact Names]。[Value])VALUES(”+ itm +“)”。 你为什么试着用txt作为后缀指向文本框的combobox? – INOPIAE

+0

我确实需要最大值 - 它给了我最近添加到啤酒厂表中的条目的ID。然后,我将值添加到具有该ID的实体的“联系人姓名”字段中。 我可以更新我的代码,以便_prefix_更好地与对象对齐 – estoner

+0

MSA16中的多选组合框必须是新的。或者你在使用Listbox吗? –

回答

0

如果一个组合框有多个项目被选中/填充,那么你可以使用Ubound()来找出有多少项。

IF UBound(Me.cmbContacts.OldValue) > 0 
    For i = LBound(Me.cmbContacts.OldValue) To UBound(Me.cmbContacts.OldValue) 
     SQL = "INSERT INTO Breweries ([Contact Names].[Value]) VALUES (" + Me.cmbContacts.OldValue(i) + ") WHERE ID=" + Max 
     CurrentDb.Execute (SQL) 
    Next i 
END IF 

请记住,这将有一个类型不匹配错误,如果只有一个,或者没有选择的值,你将不得不以某种方式处理这个问题。

希望这会有所帮助..