web-dev-qa-db-fra.com

VBA: comment sélectionner un élément dans une zone de liste déroulante

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.

7
ksagar

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.

10
HansUp

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
0
Vlado