IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

comment vérifier l'existence d'un item dans une collection ?


Sujet :

VBA Access

  1. #1
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut comment vérifier l'existence d'un item dans une collection ?
    bonjour,

    c'est peut être simple et j'ai pas l'impression de procéder comme il convient.
    l'objet collection étant assez limité voilà un exemple de code que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim maList As New Collection
    maList.Add 1, "a"
    maList.Add Null, "b"
     
    On Error Resume Next
    e = Null
    e = maList("a")
    On Error GoTo 0
     
    If Not IsNull(e) Then
        Debug.Print "existe dans la collection"
    Else
        Debug.Print "n'existe pas dans la collection"
    End If
    seulement je ne trouverais pas "b" dans la collection.
    et malheureusement je ne peux réserver une valeur spéciale pour l'initialisation de la variable 'e'

    y a-t-il un truc qui m'aurait échappé?

    merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    je pense qu'il te faut plutôt faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Dim maList As New Collection
    Dim e As String
    maList.Add 1, "a"
    maList.Add Null, "b"
     
    On Error Resume Next
    'il ne passe pas par e=null. 
    'Une erreur est levée et à cause du on error resume next, il n'affecte pas Null à e. 
    'Par conséquent, il passait jamais dans ton if not isnull(e)
    e = ""
    e = maList("a")
    On Error GoTo 0
     
    If Not e = "" Then
        Debug.Print "existe dans la collection"
    Else
        Debug.Print "n'existe pas dans la collection"
    End If
    End Sub

  3. #3
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    merci Taoueret,

    malheureusement je ne peux pas mettre pour 'e': "" = empty qui peut aussi être un élément de la collection.
    nothing pourrait peut être faire l'affaire mais il faut que la collection soit des objets ce qui n'est pas forcement le cas.

    ps:
    Citation Envoyé par Taoueret
    'il ne passe pas par e=null.
    si, si: debug avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    e = 1
    On Error Resume Next
    e = Null
    ...
    tu verras que 'e' est affecté.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 197
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    Dans le code de Tatoueret, e est déclaré comme String c'est pour ça qu'une erreur survient sur e = null ce qui n'est pas possible pour une string.
    Dans ton code tu n'as pas déclaré e donc tu ne dois pas avoir l'option explicit de déclaré et e est donc un variant, valeur par défaut, ce qui autorise le e = null.

  5. #5
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    je viens de trouver une piste en utilisant la gestion d'erreur car effectivement un code erreur est généré sur l'absence dans la collection.

    s'il y a d'autres moyens moins lourd ou d'autres solus je suis preneur.

  6. #6
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    Bonjour,

    Il existe deux solution qui sont adaptée à ce genre de cas.
    - Soit on tente accèder à l'objet et si il n'existe pas dans la collection un évènement d'erreur est produit il faut donc le 'trapper'

    public sub toto()
    On error Goto Err_Toto

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Dim maList As New Collection
     
    maList.Add 1, "a"
     
    Err_Toto :
       select case err.number
            Case 3264 : 'Ce numéro n'est pas le bon inscrire celui qui correspond
                  'Traitement possible pour indiquer qu'il n'y a pas d'item trouvé
                  Resume next
             Case Else
                  'Traitement pour toute autre erreur
                  'Par exemple
                   Msgbox Err.number & " : " & err.Description
      end select
    End sub
    - Soit il est possible d'ecrire une fonction de recherche utilisant le "For each"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Public Sub toto()
     
    Dim t As New Collection
    Dim Result As String
     
        t.Add "a"
     
        Result = Recherche(t, "B")
        If Len(Result) > 0 Then
            'Traitement
        End If
     
    End Sub
     
     
    Private Function Recherche(ByRef Col As Collection, ByRef SearchChaine As String) As String
      Dim Obj As Variant
     
        For Each Obj In Col
            If Obj = SearchChaine Then
             Recherche = Obj.Value
            End If
        Next
     
        Recherche = ""
     
    End Function
    Ce code peut-être amélioré, l'utilisation d'un Variant doit être fait avec précaution à cause de la mémoire.
    loi de LeBlanc : Plus tard signifie jamais. extrait de Coder proprement Auteur:Robert C. Martin

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 197
    Points : 300
    Points
    300
    Par défaut
    - Soit il est possible d'ecrire une fonction de recherche utilisant le "For each"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Public Sub toto()
     
    Dim t As New Collection
    Dim Result As String
     
        t.Add "a"
     
        Result = Recherche(t, "B")
        If Len(Result) > 0 Then
            'Traitement
        End If
     
    End Sub
     
     
    Private Function Recherche(ByRef Col As Collection, ByRef SearchChaine As String) As String
      Dim Obj As Variant
     
        For Each Obj In Col
            If Obj = SearchChaine Then
             Recherche = Obj.Value
            End If
        Next
     
        Recherche = ""
     
    End Function
    Ce code peut-être amélioré, l'utilisation d'un Variant doit être fait avec précaution à cause de la mémoire.[/QUOTE]
    ----------------------------------------------------------------------
    Bonjour Tonioyo,

    En procédant de cette manière, tu parcours les valeurs des objets stockés dans la collection et non leurs clés et apparemment ce n'est pas le but du jeu.... ou alors c'est moi qui n'ai pas tout compris

    .

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 352
    Points : 415
    Points
    415
    Par défaut
    si tu ne peux pas déclarer e en string, déclare-le en variant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    Public Sub test()
    Dim maList As New Collection
    Dim e As Variant
    maList.Add 1, "a"
    maList.Add 2, "b"
     
    e = Null
    e = maList("a")
    On Error GoTo 0
     
    If Not IsNull(e) Then
        Debug.Print "existe dans la collection"
    Else
        Debug.Print "n'existe pas dans la collection"
    End If
     
    'cela m'affiche bien existe dans la collection dans la fenêtre d'exécution :)
    End Sub

  9. #9
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Salut Vodiem,

    tu peux peut-être mémoriser la valeur de Err.Number à l'intérieur du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    On Error Resume Next
    ...
    On Error GoTo 0
    comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Dim maList As New Collection, e As Variant, lngErrNum As Long
    maList.Add 1, "a"
    maList.Add Null, "b"
    maList.Add Empty, "c"
     
    lngErrNum = 0
    On Error Resume Next
    e = maList("a")
    lngErrNum = Err.Number
    On Error GoTo 0
     
    If lngErrNum = 0 Then
        Debug.Print "existe dans la collection"
    Else
        Debug.Print "n'existe pas dans la collection"
    End If
    A+

  10. #10
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    merci Taoueret, EddiGordo, Tonioyo et LedZeppII pour votre participation,

    Tonioyo, tu as raison il y a deux solutions évidentes: par gestion d'erreur et par parcours. en fait j'imaginais une troisième solus qui m'aurait échappé.
    bon, il faut se faire une raison...
    en fait l'idée de parcourir l'ensemble de la collection ne me plait pas très intéressant et je l'avais donc exclus.

    effectivement Tonioyo comme l'a bien compris EddiGordo, je ne cherche pas dans le contenu de la collection mais dans les clefs.

    Taoueret le variant pose le pb initiale que je soulevais: si un élément null fait parti de la collection il ne pourrait être retrouvé.

    LedZeppII c'est ce que j'avais effectivement choisi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function IsInCollection(c As Collection, element As Variant) As Boolean
    On Error Resume Next
    e = c(element): IsInCollection = Err.Number = 0
    End Function

  11. #11
    Membre confirmé Avatar de Tonioyo
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 343
    Points : 518
    Points
    518
    Par défaut
    De rien

    Tout à fait et c'est bien le problème d'un objet de type collection car à aucun moment nous ne pouvons en connaitre son type. Peut être à moins de faire un cast au moment où l'on récupère la valeur et dans ce cas si dans notre variable "casté" il y a NULL ou vbEmpty ou Nothing c'est que l'information n'est pas présente. Je n'ai jamais testé cette manière de faire mais il est vrai que le plus rapide et le plus aproprié est de "trapper" l'erreur.
    loi de LeBlanc : Plus tard signifie jamais. extrait de Coder proprement Auteur:Robert C. Martin

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment récupérer le contenu d'un item dans une JList ?
    Par julie_lab dans le forum Composants
    Réponses: 3
    Dernier message: 01/11/2010, 12h25
  2. Réponses: 6
    Dernier message: 18/08/2010, 10h42
  3. Réponses: 3
    Dernier message: 09/08/2010, 14h38
  4. Vérifier l'existence d'un item dans une listbox
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/03/2007, 10h12
  5. [MySQL] Vérifier l'existence d'un nom dans une table
    Par joselito dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/01/2007, 22h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo