Problème parcours dictionnaire

Bonjour,

Etant toute nouvelle en VBA, je suis un peu perdue face à mon problème, je me permet donc de faire appel à votre aide.

Voici ma problématique :

Pour un critère donné (ici lorsque ma colonne B est à vrai), je cherche a récuperer la liste contenue dans la colonne C, la splité pour récupérer une liste de clés et enfin, regarder la valeur associée à cette clé contenue dans mon dictionnaire construit préalablement.

Une fois cette valeur récupérée, je cherche a vérifier qu'au moins une des clés contenus dans la liste contient bien un sous texte précis.

Je construit bien mon dictionnaire, je récupère bien ma liste de valeurs, la split bien.

Mon problème se situe à la manipulation du dictionnaire. Si je cherche à créer et parcourir la liste des clés issu de mon dictionnaire, c'est ok. Mais il ne reconnait pas que ma clé appartient à mon dictionnaire (un problème de comparaison de texte ?).

Et parfois, ça fonctionne (ce qui est totalement louche parce que bon. Le code, ça marche ou ça marche pas. ça marche pas de temps en temps), mais il se perd dans la vérification de mon substring.

Bref, je nage un peu et je n'ai plus d'idée. J'ai essayé de contourner mon problème en faisant une liste de clés, une liste de valeur en parallèle mais déjà, c'est moche. Et ça part en vrille en terme de performance.

Voici la fonction qui me sert à créer mon dictionnaire :

Sub dico_domaine()
'On charge les donnees de l'onglet domaine dans le dictionnaire

Dim onglet As Worksheets

Range("A1", Range("A1").End(xlDown)).Select

Dim d As Worksheet

Set d = Worksheets("Domaines")

    For Lig = 2 To d.Cells(Rows.Count, 1).End(xlUp).Row
        dicoDomaine.Add Key:=d.Range("A" & Lig), Item:=d.Range("B" & Lig)
    Next Lig
End Sub

Et voici la fonction qui me sert à parcourir mon dictionnaire

Function tabDotationContains(typeDot As String, tabD As Variant) As Variant
'On verifie que typeDot est contenu dans la valeur d une des cles de la liste tabD
    tabDotationNotContains = True

    ' Pour chacune des cles de la liste tabD
   For Each dot In tabD

        'on regarde si la cle existe dans le dictionnaire
        If dicoDomaine.Exists(dot) Then
            'On recupere la valeur associee a cette cle dans le dico
            dotName = dicoDomaine(dot)
'            Debug.Print ("Dot : " + dot + " dotName : " + dotName)

            'on regarde si la chaine typeDot est un substring de la valeur
            If InStr(dotName, typeDot) Then
              tabDotationContains = True
              Exit For
            Else
              tabDotationContains = False
              End If

        End If
      Next

End Function

Merci d'avance pour votre aide, vos remarques et vos conseils.

bonjour,

une proposition, si j'ai bien compris.

Il y a encore quelques choses qui m'intrigue mais j'ai l'impression que oui !

Je regarde plus en détail ce soir, en tout cas merci de ton aide rapide !

Peut être que je te poserais quelques questions sur le pourquoi du comment si ça ne te dérange pas

Super, ça fonctionne parfaitement !

Par contre je ne comprends pas pourquoi cela fonctionne quand on parcours la liste via un compteur mais pas quand on parcourt les éléments de la liste. Il y a des subtilités à savoir ?

Et bon idée pour le Ucase, ça évitera les erreurs de casse d'étourderie.

Encore merci en tout cas.

bonjour,

Par contre je ne comprends pas pourquoi cela fonctionne quand on parcours la liste via un compteur mais pas quand on parcourt les éléments de la liste. Il y a des subtilités à savoir ?

Cela fonctionne aussi. Le problème vient du chargement du dictionnaire (tu as oublié le .value pour le chargement de la clé). Si tu ne mets pas le .value, la clé est tout l'objet range avec toutes ses propriétés et donc quand tu fais une recherche dans le dictionnaire uniquement avec une valeur de ton tableau TabD, il ne trouve rien, les valeurs stockées dans tabD n'étant pas des objets.

Ah super merci ! Je n'avais pas vu cette subtilité. Vraiment merci :)

Rechercher des sujets similaires à "probleme parcours dictionnaire"