VBA:如何从ComboBox中选择项目

时间:2013-11-20 18:27:10

标签: vba ms-access combobox access-vba ms-access-2010

我有Access 2010表单,其中有一个ComboBox cmbSubTopic,其中列出了两列(SubTopicIDSubTopic)。组合框绑定到包含SubTopicID的字段。组合框中的SubTopicID列已隐藏,仅显示SubTopic。当用户从下拉列表中选择SubTopic时,相应的SubTopicID将存储在表格中。我为表单的on load事件编写了一些VBA代码,以便在表中查找SubTopicID,并在ComboBox中选择相应的SubTopic。我目前的代码是这样的:

Set rsST = dbs.OpenRecordset(strSqlst)
For i = 0 To Me.cmbSubTopic.ListCount - 1
    If Me.cmbSubTopic.Column(0, i) = rsST.Fields("SubTopicID").Value Then
        Me.cmbSubTopic.SetFocus
        Me.cmbSubTopic.Selected(i) = True
        Exit For
    End If
Next i

这会出错:

  

您输入的文字不是列表中的项目

我也试过用这个:

Me.cmbSubTopic = Me.cmbSubTopic.Selected(i)

这会选择ComboBox中的项目,但它也会将I的值写入表格中我不想要的ID字段。

2 个答案:

答案 0 :(得分:9)

假设组合的第一列SubTopicID也是组合的“绑定列”属性,它将用作列的.Value属性。这意味着您只需要为.Value分配一个值,以便选择匹配的组合行。

Me.cmbSubTopic.Value =  rsST.Fields("SubTopicID").Value

这种方法很简单,但我不确定它是否适合您的情况。我们对您的rsST记录集一无所知---我假设记录集当前行中的SubTopicID字段是您想要在组合中选择的值。如果我误解了这一点,我们需要找出不同的东西。

如果组合绑定到表单记录源中的字段,则此建议也会更改存储的值。如果你不想那样,“取消绑定”组合 - 换句话说,将其控制源属性设为空白。

答案 1 :(得分:0)

这里有2个子-一个用于传递文本(SubTopic),第二个用于ID(SubTopicId):

Public Sub SelectComboBoxItemByText(cmb As ComboBox, Value As String)
    On Error GoTo ErrHandler_
Dim i As Integer
    For i = 0 To cmb.ListCount - 1
        If cmb.Column(1, i) = Value Then
            cmb.SetFocus
            cmb.Selected(i) = True
            cmb.Text = Value
            Exit For
        End If
    Next i
End Sub
ExitProc_:
    DoCmd.Hourglass False
    Exit Sub
ErrHandler_:
    DoCmd.Hourglass False
    Call LogError(Err, "basTools", "SelectComboBoxItemByText")
    Resume ExitProc_
    Resume ' use for debugging
End Sub

Public Sub SelectComboBoxItemById(cmb As ComboBox, Value As Integer)
    On Error GoTo ErrHandler_
Dim i As Integer
    For i = 0 To cmb.ListCount - 1
        If cmb.Column(0, i) = Value Then
            cmb.SetFocus
            cmb.Selected(i) = True
            cmb = Value
            Exit For
        End If
    Next i
ExitProc_:
    DoCmd.Hourglass False
    Exit Sub
ErrHandler_:
    DoCmd.Hourglass False
    Call LogError(Err, "basTools", "SelectComboBoxItemById")
    Resume ExitProc_
    Resume ' use for debugging
End Sub