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

Macros et VBA Excel Discussion :

Vérifier l'existence d'une Key dans un dictionnaire (Condition pour alimenter un autre dictionnaire)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 25
    Par défaut Vérifier l'existence d'une Key dans un dictionnaire (Condition pour alimenter un autre dictionnaire)
    Bonjour,

    J'ai ajouté dans un premier dictionnaire les valeurs de la colonne A de mon onglet Data

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	Set Dico1 = New Collection
        	DernLigne = Worksheets("Data").Range("A" & Rows.Count).End(xlUp).Row
        	For i = 2 To DernLigne
        	Dico1.Add Item:=Worksheets("Data").Cells(i, 1)
        	Next i
    Je crée un second dictionnaire dans lequel je veux mettre uniquement les valeurs du fichier texte et qui sont présentes dans le dico1

    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
     	MonFichier = "C:\.......\...txt"
     
     
    	Set objFSO = CreateObject("Scripting.FileSystemObject")
    	Set objFile = objFSO.OpenTextFile(MonFichier, 1, -2)
     
    	Set Dico2 = New Collection
     
     
        	Do Until objFile.AtEndOfStream
        	row = objFile.ReadLine
    	Split_Txt = split_function (row) 'fonction qui découpe mon fichier texte
            Key = Field5 'Field1 est déterminé à partir de la fonction split_function  (Field5 = Mid(row, 14, 3))
                If Dico1.Exists(Key) Then
                Dico2.Add Item:=Split_Txt
                End If
        	Loop
    En utilisant la focntion "Exists" j'ai un message d'erreur. Pouvez vous m'aider?

    Merci d'avance

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    Bonsoir,
    Tu parles de dictionnaire et tu utilises une collection ?
    Exists est bien une méthode d'un Dictionary mais pas d'une collection !

    https://docs.microsoft.com/en-us/off...tionary-object

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Set Dico1 = CreateObject("Scripting.Dictionary")
    For i = 2 To DernLigne
            Dico1(Worksheets("Data").Cells(i, 1).value)=Worksheets("Data").Cells(i, 1).value
            Next i
    If Dico1.Exists(Key) Then
    Dico2.add clé,texte

  3. #3
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2019
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2019
    Messages : 25
    Par défaut
    Bonjour Thumb down,

    Merci pour ton retour, pour tout avouer, j'avais trouver ce code et je l'ai adapté.
    A priori pour travailler avec les dictionnaires il faut que l'option "Microsoft Scripting Runtime" soit cochée...
    Comme je ne serai pas le seul utilisateur peut être que le mieux serait de continuer avec les collections...

  4. #4
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 560
    Par défaut
    si tu utilises CreateObject tu n'a pas à activer la référence tout comme FileSystemObject!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim Dico1 as Object,objFSO  as Object
    Set Dico1 = CreateObject("Scripting.Dictionary")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Code Module de Classe MyDico : 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
    Private Dico As New Collection, Txt As String
    Public Function Exists(Key As Variant) As Boolean
    Exists = CBool(InStr(1, "©" & Txt & "©", "©" & Key & "©"))
    End Function
    Public Sub Add(Value As Variant, Optional Key As Variant = "")
        If CStr(Key) = "" Then
            Dico.Add Value
        Else
            If Not Exists(Key) Then
                Txt = Txt & "©" & Key & "©"
                Dico.Add Value, Key
             End If
        End If
    End Sub
    Public Function Keys()
        Keys = Split(Trim(Replace(Replace(Txt, "©©", "™"), "©", "")), "™")
    End Function
    Public Function Items()
        Dim Item(): ReDim Item(1 To Dico.Count)
        For i = 1 To Dico.Count
            Item(i) = Dico(i)
        Next
        Items = Item
    End Function
    Public Function Values(Key)
        If Exists(Key) Then Values = Dico(Key)
    End Function
    Code Module1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim dico1 As New MyDico
    dico1.Add "ee", "1"
    dico1.Add "ee", "2"
    dico1.Add "ee", "3"
    Debug.Print "rr", dico1.Exists("rr"), "toto", dico1.Exists("toto")
    k = dico1.Keys
    i = dico1.Items
      For Each c In k
        Debug.Print dico1.Values(c)
      Next
    End Sub

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

Discussions similaires

  1. [MySQL] Vérifier l'existance d'une valeur dans un champ
    Par k3vin dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 07/05/2010, 22h29
  2. Vérifier l'existence d'une table dans une base de données
    Par mounim_taoufik dans le forum Administration
    Réponses: 8
    Dernier message: 02/03/2010, 16h24
  3. Vérifier l'existence d'une valeur dans un ComboBox
    Par logiciel_const dans le forum Composants VCL
    Réponses: 6
    Dernier message: 08/03/2008, 09h07
  4. [MySQL] Vérifier l'existance d'une donnée dans la base avant insertion
    Par Him dans le forum PHP & Base de données
    Réponses: 26
    Dernier message: 16/07/2006, 15h47
  5. vérifier l'existance d'une table dans une base de donnée
    Par zidenne dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/10/2005, 11h39

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