web-dev-qa-db-ja.com

VBA:コンボボックスからアイテムを選択する方法

2つの列(cmbSubTopicSubTopicID)をリストするComboBox SubTopicを含むAccess 2010フォームがあります。コンボボックスは、SubTopicIDを含むフィールドにバインドされています。コンボボックスのSubTopicID列は非表示になり、SubTopicのみが表示されます。ユーザーがドロップダウンからSubTopicを選択すると、対応するSubTopicIDがテーブルに格納されます。テーブルでSubTopicIDを検索するフォームのon loadイベント用のVBAコードをいくつか記述し、対応するSubTopicがComboBoxで選択されています。私の現在のコードは次のようなものです:

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の項目が選択されますが、不要なテーブルのIDフィールドにIの値も書き込まれます。

7
ksagar

コンボの最初の列であるSubTopicIDも、コンボの「バインドされた列」プロパティであると想定すると、列の.Valueプロパティとして使用されます。つまり、一致するコンボ行を選択するには、.Valueに値を割り当てるだけです。

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

そのアプローチは単純ですが、それがあなたの状況に適切な解決策であるかどうかはわかりません。 rsSTレコードセットについて何も知りません---レコードセットの現在の行のSubTopicIDフィールドが、コンボで選択する値であると推定しました。その点を誤解した場合、別のことを理解する必要があります。

コンボがフォームのレコードソースのフィールドにバインドされている場合、この提案は格納されている値も変更します。それを望まない場合は、コンボを "バインド解除"します-つまり、Control Sourceプロパティを空白にします。

10
HansUp

ここに2つのサブがあります-1つはテキスト(SubTopic)を渡すため、もう1つは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
0
Vlado