J'ai le formulaire Access 2010 qui a un ComboBox cmbSubTopic
qui répertorie deux colonnes (SubTopicID
et SubTopic
). La zone de liste modifiable est liée à un champ contenant SubTopicID
. La colonne SubTopicID
dans la zone de liste déroulante est masquée, elle affiche uniquement le SubTopic
. Lorsque l'utilisateur sélectionne un SubTopic
dans la liste déroulante, le SubTopicID
correspondant est stocké dans le tableau. J'ai écrit du code VBA pour l'événement on load du formulaire pour rechercher le SubTopicID
dans le tableau et le SubTopic
correspondant est sélectionné dans la zone de liste déroulante. Mon code actuel ressemble à ceci:
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
Cela donne l'erreur en disant:
Le texte que vous avez entré n'est pas un élément de la liste
J'ai également essayé d'utiliser ceci:
Me.cmbSubTopic = Me.cmbSubTopic.Selected(i)
Cela sélectionne l'élément dans la zone de liste déroulante mais il écrit également la valeur de I dans le champ ID
de la table dont je ne veux pas.
En supposant que la première colonne du combo, SubTopicID
, est également la propriété "colonne liée" du combo, elle est utilisée comme .Value
propriété. Cela signifie que vous devez uniquement affecter une valeur à .Value
pour sélectionner la ligne combinée correspondante.
Me.cmbSubTopic.Value = rsST.Fields("SubTopicID").Value
Cette approche est simple, mais je ne sais pas si c'est la solution appropriée à votre situation. Nous ne savons rien de votre jeu d'enregistrements rsST
--- Je suppose que le champ SubTopicID
dans la ligne actuelle du jeu d'enregistrements est la valeur que vous souhaitez sélectionner dans le combo. Si j'ai mal compris ce point, nous devons trouver quelque chose de différent.
Si le combo est lié à un champ dans la source d'enregistrement du formulaire, cette suggestion modifierait également la valeur stockée. Si vous ne voulez pas cela, "dissociez" le combo --- en d'autres termes, rendez sa propriété Control Source vide.
Voici 2 sous-marins - un pour passer du texte (SubTopic) et le second pour 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