2つの列(cmbSubTopic
とSubTopicID
)をリストする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の値も書き込まれます。
コンボの最初の列であるSubTopicID
も、コンボの「バインドされた列」プロパティであると想定すると、列の.Value
プロパティとして使用されます。つまり、一致するコンボ行を選択するには、.Value
に値を割り当てるだけです。
Me.cmbSubTopic.Value = rsST.Fields("SubTopicID").Value
そのアプローチは単純ですが、それがあなたの状況に適切な解決策であるかどうかはわかりません。 rsST
レコードセットについて何も知りません---レコードセットの現在の行のSubTopicID
フィールドが、コンボで選択する値であると推定しました。その点を誤解した場合、別のことを理解する必要があります。
コンボがフォームのレコードソースのフィールドにバインドされている場合、この提案は格納されている値も変更します。それを望まない場合は、コンボを "バインド解除"します-つまり、Control Sourceプロパティを空白にします。
ここに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