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 :

Collection Item et Valeur [XL-2013]


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut Collection Item et Valeur
    Bonjour à tous,

    Toujours dans la suite de mon apprentissage, comment récupérer et exploiter dans une collection les valeurs?

    Je m'explique
    Nom : collection.jpg
Affichages : 1012
Taille : 99,7 Ko
    Dans l'image ci-dessus, j'ai plusieurs items en face d'eux, dans la colonne "Valeur", on aperçoit plusieurs fois la même valeur.

    Comment faire pour compter le nombre de fois qu'est présent, ici, "Chantilly", "Dax", "Vichy"?
    A savoir, que ces valeurs sont spot, elles changent tous le jours selon mes requêtes.

    De même le fait de savoir le nombre de fois est présent une valeur, me permettra par la suite de récupérer des infos sur le web.
    Par ex:

    Si "Vichy" est présent 8x, alors je lancerai 8 requêtes
    si "Dax", 9X alors etc......

    Merci d'avance
    Seb

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    une idée par Array : mets ta collection de String dans un Tableau et ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub occur()
    Dim Occurence As String, Tablo
     
    Tablo = Array("a", "a", "b", "a")
    Occurence = "a"
    MsgBox UBound(Tablo) + 1 - Len(Replace(Join(Tablo, ""), Occurence, ""))
     
    End Sub

  3. #3
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Set Dico = CreateObject("Scripting.dictionary")
    If dico.exists("toto") = false then dico("toto")=0
    For i =1 to 10
    Dico("toto")=dico("toto") +1
    Next
    Début.print dico("toto")

  4. #4
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bonjour à vous deux les ,

    @Joe:
    voici mon bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Set Col = CreateObject("scripting.dictionary")
     
        Lmax = IEdoc.Links.Length
            For Each O In IEdoc.Links
                L = L + 1
                Application.StatusBar = "Patientez... " & L * 100 \ Lmax & " %"
                If O.href Like vURL & "*" Then
                    T = Mid(O.href, 45)
                    T = Left(T, InStr(T, "-") - 1)
                    If Col.Exists(O.href) = False Then Col.Add O.href, O.href 'Collection lien course sans doublon
                    Collect.Add T 'Collection lieu réunion avec doublon
                End If
            Next O
    Comme tu peux le voir, deux collections sont formées ensemble, une "Col" qui récupère des liens et l'autre dont je manipule la chaine de chaque lien afin d'en extraire des lieux.

    Avec ton code cela oblige à connaître les lieux avant et de les rentrer manuellement dans le code
    A moins comme tu le dis que je mette mes Strings dans un Array mais dans ce cas comment faire?

    @Rudupt:

    J'aime bien le dico vba....
    Mais dans ton code, "Toto" est fixe, hors c justement cela qui doit évolué
    Dans l'image, plus haut, je récupère au minimum 4 x 8 valeurs

    Ici: "Chantilly", "Dax", et "Vichy" pour aujourd'hui, mais demain cela peut-être "Longchamp", "Paris" et "Le Havre"....

    Seb

  5. #5
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    je visualise mal ce qu'il se passe

    c'est T qui contient le string ?

    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
    Sub Occur()
    Dim Collect  As New Dictionary
    Dim TabloExemple()
     
    TabloExemple = Array("PARIS", "LYON", "LILLE", "LYON", "LYON", "BORDEAUX")
    For i = LBound(TabloExemple) + 1 To UBound(TabloExemple) + 1
        Cells(i, 1) = TabloExemple(i - 1)
    Next i
     
    For i = 1 To UBound(TabloExemple) + 1
        T = Cells(i, 1).Value
        If Collect.Exists(T) Then
            Collect(T) = Collect(T) + 1
        Else
            Collect.Add T, 1
        End If
    Next i
     
    For Each elt In Collect.Keys
       Debug.Print elt & " : " & Collect(elt)
    Next elt
    End Sub

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Oui effectivement toto est fixe dans mon exemple! Mais l'idée est de te montrer l'utilisation du dico.

    Tu peux remplacer ta collection par un dico dans ton code comme le montre Joe

  7. #7
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Bonjour a vous,

    Rdurupt, c vrai, les choses les plus simples nous passent souvent sous le nez....

    JE regarde et viens vous dire quoi

    Bonne journée

    Seb

  8. #8
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    J'ai repris l'idée du dictionnaire de rdurupt car elle t'offrirait également d'autres champs de possibilités par la suite, et une plus grande souplesse

    mais on aurait également pu passer par ma méthode, qui aurait en revanche nécessité un traitement plus complexe pour ne boucler qu'une fois sur chaque élément du Array.

  9. #9
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Re,

    Bon, j'essaie, j'essaie mais sans succès

    Pour rappel ma collection "Col" contient des X liens de ce type:
    Nom : Lien.jpg
Affichages : 905
Taille : 181,3 Ko

    Où j'extrais seulement le lieu, ici dans "Collect" il ne devrait trouvé que :
    - Chantilly
    - Dax
    - Vichy
    - Nancy

    Voici le code:

    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
    Set Col = CreateObject("scripting.dictionary")
     
        Lmax = IEdoc.Links.Length
            For Each O In IEdoc.Links
                L = L + 1
                Application.StatusBar = "Patientez... " & L * 100 \ Lmax & " %"
                If O.href Like vURL & "*" Then
                    T = Mid(O.href, 45)
                    T = Left(T, InStr(T, "-") - 1)
                    If Col.Exists(O.href) = False Then Col.Add O.href, O.href 'Collection lien course sans doublon
     
                    Set Collect = CreateObject("scripting.dictionary")
                    If Collect.Exists(T) = False Then
                        Collect(T) = Collect(T) + 1
     
                    Else
     
                        Collect.Add T, 1
     
                    'Collect.Add T 'Collection lieu réunion avec doublon
                    End If
                End If
            Next O
    Mon problème est qu'il ne garde que dans la collection "Collect" un item, le dernier "Nancy" hors il devrait me trouver "Chantilly", "Dax", "Vichy" et "Nancy".

    Merci pour vos précisions

    Seb

  10. #10
    Invité
    Invité(e)
    Par défaut
    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
    Set Col = CreateObject("scripting.dictionary")
      Set Collect = CreateObject("scripting.dictionary")
        Lmax = IEdoc.Links.Length
            For Each O In IEdoc.Links
                L = L + 1
                Application.StatusBar = "Patientez... " & L * 100 \ Lmax & " %"
                If O.href Like vURL & "*" Then
                    T = Mid(O.href, 45)
                    T = Left(T, InStr(T, "-") - 1)
                    If Col.Exists(O.href) = False Then Col.Add O.href, O.href 'Collection lien course sans doublon
                    If Collect.Exists(T) = False Then
                        Collect(T) = Collect(T) + 1
     
                    Else
     
                        Collect.Add T, 1
     
                    'Collect.Add T 'Collection lieu réunion avec doublon
                    End If
                End If
            Next O

  11. #11
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Re,

    Ooooh,

    Juste pour cela, mon "set" qui est mal placé!!!!!

    Merci de ton aide

    Seb

    PS: Si tu as une explication je suis preneur!!!!

  12. #12
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Tu avais placé ton instruction de Création du dictionnaire dans ta boucle (Set Collect = blabla)

    donc à chaque tour de boucle ... tu écrase ton ancien dictionnaire et tu ajoutes un élément

    à la fin de la boucle : tu as un dictionnaire avec uniquement ton dernier élément T


    rdurupt a déplacé la création du dictionnaire en amont de ta boucle qui l'alimente

  13. #13
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Merci joe pour tes explications, et merci pour votre enseignements

    Seb

    PS: je laisse le post ouvert car à la suite j'aurai certainement besoin de revenir...

  14. #14
    Invité
    Invité(e)
    Par défaut
    Joe toujours la division du travail

    en soit, ce qui j'aime, c'est de susciter de l'intérêt d'en apprendre plus sur tel ou tel sujet. c'est pour cela que je donne souvent des solutions ou des piste sans donner d’explications.

    mais je les donne si le récipiendaire me sollicite!
    Dernière modification par Invité ; 22/05/2015 à 14h56.

  15. #15
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par rdurupt Voir le message
    en soit, ce qui j'aime, c'est de susciter de l'intérêt d'en apprendre plus sur tel ou tel sujet. c'est pour cela que je donne souvent des solutions ou des piste sans donner d’explications.

    On t'a démasqué, tu fais le fainéant avoue !!

    [/mauvaise blague]

  16. #16
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    RE,
    Et déjà de retour,

    Dans cette collection, maintenant, en fonction du nombre de lieu comment savoir le nombre de fois qu'est présent :
    "Chantilly", "Dax", "Vichy" et "Nancy"

    Par exemple aujourd'hui j'ai récupéré dans la collection "Col" 33 liens.
    De ses 33 liens j'en extrais les lieu ci-dessus voici:

    9 x Chantilly
    9 x Dax
    7 x Vichy
    et 8 x Nancy ce qui fait 33

    Seb

  17. #17
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Tu as fais tourner ma procédure Test du message #5 ?

    ta réponse est dedans ... elle va s'afficher dans la fenêtre d'exécution

  18. #18
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    On t'a démasqué, tu fais le fainéant avoue !!

    [/mauvaise blague]
    je pisse du code et mon secrétariat commente !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each elt In Collect.Keys
     msgbox elt & " à été trouvé : " & Collect(elt) & " fois "
    Next elt

  19. #19
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 073
    Points : 9 853
    Points
    9 853
    Billets dans le blog
    5
    Par défaut
    Chiche en équipe

    vas-y code code code !!
    je viendrai le commenter

    (oui, là c'est moi le fainéant, mais tes codes sont beaucoup plus jolis que les miens )

  20. #20
    Membre éclairé
    Homme Profil pro
    Constructeur ossature bois
    Inscrit en
    Mars 2014
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Constructeur ossature bois
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 897
    Points : 650
    Points
    650
    Par défaut
    Re,

    Désolé mais ça ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each elt In Collect.Keys
     msgbox elt & " à été trouvé : " & Collect(elt) & " fois "
    Next elt
    En mode pas à pas (F8), il passe tout droit
    Je ne connais pas le ".keys"

    Et plouf.....

    Je post mon code:
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Sub Recup()
     
    Dim IE As InternetExplorer
    Dim IEdoc As HTMLDocument
    Dim IElien As HTMLLinkElement
    Dim Col As Object, Collect As Object
    Dim L As Long, Lmax As Long
    Dim vURL As String, T As String
    Dim O As Object, elt As Object
     
     vURL = "http://www.geny.com/reunions-courses-pmu?date=2015-05-21"
        'TRAITEMENT
        'Sheets("Temp").Range("A2:B10").ClearContents
        Application.StatusBar = "GenyCourses > Connexion..."
        Application.ScreenUpdating = False
     
        'Crée une instance d'IE invisible
        Set IE = CreateObject("internetExplorer.Application")
        IE.Visible = False
     
        'Ouvre la page Web
        IE.navigate vURL
        Do Until IE.readyState = READYSTATE_COMPLETE
            DoEvents
        Loop
     
        'Récupère la liste de tous les ID intéressants (ID Réunions sans doublon)
        Set IEdoc = IE.document
        vURL = "http://www.geny.com/partants-pmu/"
        On Error Resume Next
     
        Set Col = CreateObject("scripting.dictionary")
        Set Collect = CreateObject("scripting.dictionary")
     
        Lmax = IEdoc.Links.Length
            For Each O In IEdoc.Links
                L = L + 1
                Application.StatusBar = "Patientez... " & L * 100 \ Lmax & " %"
                If O.href Like vURL & "*" Then
                    T = Mid(O.href, 45)
                    T = Left(T, InStr(T, "-") - 1)
     
                    If Col.Exists(O.href) = False Then Col.Add O.href, O.href 'Collection lien course sans doublon
     
                    If Collect.Exists(T) = False Then
                        Collect(T) = Collect(T) + 1
                    Else
                        Collect.Add T, 1
                     End If
                End If
            Next O
     
             For Each elt In Collect(T).Keys
        MsgBox elt & " à été trouvé : " & Collect(elt) & " fois "
               Next elt
     
     
        On Error GoTo 0
        Set IEdoc = Nothing
        IE.Quit
        Set IE = Nothing
        Application.ScreenUpdating = True
        Application.StatusBar = False
     
        Beep
     
    End Sub
    Seb

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. La collection Items doit être vide..
    Par jacquesprogram dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 01/08/2011, 12h54
  2. Réponses: 2
    Dernier message: 24/03/2010, 16h40
  3. [JSTL] connaitre taille de la collection items du forEach
    Par makohsarah dans le forum Struts 1
    Réponses: 3
    Dernier message: 24/05/2008, 16h58
  4. Réponses: 5
    Dernier message: 08/12/2006, 17h04

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