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 :

Récupérer des données d'une page web entre 2 balises imbriquées


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut Récupérer des données d'une page web entre 2 balises imbriquées
    Bonjour à tous,

    Dans ma quêtes de récupérer certaines données de sites web, je rencontre le code HTML suivant :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    			<ul class="coin-plie">
    				<li>
    										<h3 class="title"><a class="link" href="http://www.lien_1">Nom : XXXX</a><span> - Commune : Xxxxx</span></h3>
    										<p class="normal">APE : XXXXX - XXXXXXXXXXXXXX</p>
    				</li><li>
    										<h3 class="title"><a class="link" href="http://www.lien_2">Nom : YYYY</a><span> - Commune : Yyyyy</span></h3>
    										<p class="normal">APE : XXXXX - XXXXXXXXXXXXXX</p>
    				</li><li>
    										....
    				</li>			</ul>
    Je cherche à récupérer par VBA les différents liens à écrire dans la colonne A de ma feuille, les noms dans la colonne B, les communes dans la colonne C, et le code APE dans la colonne D.
    La difficulté est que je ne peux pas me baser uniquement sur la classe "link" ou la classe "title" car elles apparaissent également ailleurs dans le code HTML.
    Par contre, les balises où je cherche à récupérer les données sont toutes incluses dans la balise <ul class="coin-plie">
    Il faudrait donc que je puisse identifier tout d'abord la balise de classe "coin-plie", puis toutes les balises de classe "title".

    Comment puis-je faire ?
    Un grand merci par avance pour votre aide

  2. #2
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 070
    Points
    12 070
    Billets dans le blog
    8
    Par défaut heu
    Bonjour
    puré tu trouve ca dans le tutoriel de qwazerty avec sa fonction getclassname
    ou plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for each elem in IE.document.all
    if elem.classname="coin-plie"then mon_elem=elem:exit for
    next
    for each elem in mon_elem.all
    if instr(lcase(mon_elem.innerhtml),"href=")>0 then debug.print "balise " & elem.tagname & "  lien= " & elem.href
    next
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut
    Merci patricktoulon,

    En effet, après un long moment de recherche, j'étais tombé dessus. Je suis encore en train de le lire, il devrait y avoir d'autres points intéressants pour ma programmation.
    Ca cible bien ce que je recherche. Par contre tout n'est plus tout à fait à jour (ex : la page Google qui a évolué depuis, ou encore je n'arrive pas à afficher les caractéristiques des éléments sur IE ou Firefox), donc c'est plus long pour se familiariser avec tout ça.

    Je continue ma lecture et je crois les doigts pour réussir à finir mon programme VBA

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut
    Bonjour,
    Après avoir passé pas mal de temps à décrypter le tuto de qwazerty, je rencontre encore une erreur.
    Je me suis en partie basée sur le code de patricktoulon, mais comme je rencontrais quelques erreurs, je l'ai modifié de la sorte :
    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
    Sub test_Alsaeco_Com()
    cherche_societe , , , , , , 67, "7112B"     ' entre chaque virgule vont les données correspondant au argument de la fonction cherche dans le meme ordre
    End Sub
     
     
    Function cherche_societe(Optional raison As String = "", Optional siret As String = "", Optional siren As String = "", Optional nom_dirigant As String = "", Optional prenom_dirigant As String = "", Optional commune As String = "", Optional departement As String = "", Optional ape As String = "")
    'Déclaration des variables
    Dim IE As New InternetExplorer    ' Penser à activer les références « Microsoft Internet Controls » et « Microsoft HTML Object Library » (menu Outils -> Références dans VBA)
    Dim IEDoc As HTMLDocument
    Dim elem As HTMLUListElement
    Dim mon_elem As HTMLUListElement
    Dim URL As String
    Dim tabURL() As String
    Dim htmlTagCol As IHTMLElementCollection
    Dim HtmlElementStandard As HTMLGenericElement
     
    'Initialisation des variables
    URL = "http://www.alsaeco.com/entreprises/recherche.html?aeadirectoryParam[raison]=" & raison & "&aeadirectoryParam[siret]=" & siret & "&aeadirectoryParam[siren]=" & siren & "&aeadirectoryParam[commune]=" & commune & "&aeadirectoryParam[departement]=" & departement & "&aeadirectoryParam[dirigeant]=" & nom_dirigant & "&aeadirectoryParam[ape]=" & ape & "&aeadirectoryParam[submit]=Rechercher&aeadirectoryParam[page]=8"
     
    'Accès au site web
        IE.Navigate URL
        IE.Visible = True    'Affichage de la fenêtre IE
        WaitIE IE    'On attend le chargement complet de la page
        Set IEDoc = IE.document  'On pointe le membre Document (une variable spécifique pour cette élément permet de bénéficier de l'autocomplétion)
     
      'Les entreprises sont listées dans le tableau démarrant à la balise "ul" avec pour classname "coin-plie"
        For Each elem In IEDoc.all  'On liste les éléments de ce tableau
            If elem.className = "coin-plie" Then
                Set mon_elem = elem
                Exit For
            End If
        Next
     
        Set htmlTagCol = mon_elem.getElementsByTagName("a") 'On liste les éléments de type anchor
        For i = 0 To 9   'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque entreprise
            Set HtmlElementStandard = htmlTagCol(i)
            tabURL(i) = HtmlElementStandard.href
            MsgBox i & "-" & tabURL(i)
        Next
     
        MsgBox "Scan terminé"
     
    'Libération des variables
        Set IE = Nothing
        Set IEDoc = Nothing
    End Function
     
    Sub WaitIE(IE As InternetExplorer)
       'On boucle tant que la page n'est pas totalement chargée
       Do Until IE.readyState = READYSTATE_COMPLETE 'Ou : IE.readyState = 4
          DoEvents
       Loop
    End Sub
    Problème : A la ligne #37 tabURL(i) = HtmlElementStandard.href, j'ai le message d'erreur
    L'indice n'appartient pas à la sélection.

    D'où vient le problème et qu'est-ce que je peux faire pour le supprimer ?

    Merci d'avance pour votre aide

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 070
    Points
    12 070
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    c'est peut eztre normal tout les a n'on peut etre pas de href et puis le href est peut etre dans un enfant du a
    c'est pour cela que je n'ai pas été nominatif dans mon exemple
    d'autant plus que tu part du principe qu'il y a 9 a a chaque fois c'est peutre la encore pas le cas
    d'autant plaus que tu ne dimentionne pas taburl avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    
    Set htmlTagCol = mon_elem.getElementsByTagName("a") 'On liste les éléments de type anchor
       redim taburl(htmlTagCol .length,1)
     For i = 0 To htmlTagCol .length-1  'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque entreprise
                tabURL(i) =htmlTagCol(i).href
            MsgBox i & "-" & tabURL(i).href
        Next
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut
    Bonsoir patricktoulon,

    En effet, il peut y avoir moins de 10 entreprises par page (sur la dernière page en tout cas).
    Par contre, après contrôle de l'une des pages (celle sur laquelle j'effectue le code en cours), j'ai toujours href dans les balises a.

    J'ai modifié le code en suivant ton 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
    Option Explicit
     
    Sub test_Alsaeco_Com()
    cherche_societe , , , , , , 67, "7112B"     ' entre chaque virgule vont les données correspondant au argument de la fonction cherche dans le meme ordre
    End Sub
     
     
    Function cherche_societe(Optional raison As String = "", Optional siret As String = "", Optional siren As String = "", Optional nom_dirigant As String = "", Optional prenom_dirigant As String = "", Optional commune As String = "", Optional departement As String = "", Optional ape As String = "")
    'Déclaration des variables
    Dim IE As New InternetExplorer    ' Penser à activer les références « Microsoft Internet Controls » et « Microsoft HTML Object Library » (menu Outils -> Références dans VBA)
    Dim IEDoc As HTMLDocument
    Dim elem As HTMLUListElement
    Dim mon_elem As HTMLUListElement
    Dim URL As String
    Dim tabURL() As String
    Dim htmlTagCol As IHTMLElementCollection
    Dim HtmlElementStandard As HTMLGenericElement
    Dim i As Integer
     
    'Initialisation des variables
    URL = "http://www.alsaeco.com/entreprises/recherche.html?aeadirectoryParam[raison]=" & raison & "&aeadirectoryParam[siret]=" & siret & "&aeadirectoryParam[siren]=" & siren & "&aeadirectoryParam[commune]=" & commune & "&aeadirectoryParam[departement]=" & departement & "&aeadirectoryParam[dirigeant]=" & nom_dirigant & "&aeadirectoryParam[ape]=" & ape & "&aeadirectoryParam[submit]=Rechercher&aeadirectoryParam[page]=8"
     
    'Accès au site web
        IE.Navigate URL
        IE.Visible = True    'Affichage de la fenêtre IE
        WaitIE IE    'On attend le chargement complet de la page
        Set IEDoc = IE.document  'On pointe le membre Document (une variable spécifique pour cette élément permet de bénéficier de l'autocomplétion)
     
      'Les entreprises sont listées dans le tableau démarrant à la balise "ul" avec pour classname "coin-plie"
        For Each elem In IEDoc.all  'On liste les éléments de ce tableau
            If elem.className = "coin-plie" Then
                Set mon_elem = elem
                Exit For
            End If
        Next
     
        Set htmlTagCol = mon_elem.getElementsByTagName("a") 'On liste les éléments de type anchor
        ReDim tabURL(htmlTagCol.Length, 1)
        For i = 0 To htmlTagCol.Length - 1 'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque entreprise
            tabURL(i) = htmlTagCol(i).href
            MsgBox i & "-" & tabURL(i)
        Next
     
        MsgBox "Scan terminé"
     
    'Libération des variables
        Set IE = Nothing
        Set IEDoc = Nothing
    End Function
     
    Sub WaitIE(IE As InternetExplorer)
       'On boucle tant que la page n'est pas totalement chargée
       Do Until IE.readyState = READYSTATE_COMPLETE 'Ou : IE.readyState = 4
          DoEvents
       Loop
    End Sub
    J'ai pour l'instant toujours la même erreur, sur la même ligne

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 070
    Points
    12 070
    Billets dans le blog
    8
    Par défaut re
    Bon deja j'avais pas vu ca
    depuis quand une variable tableau est un string
    je regarde ca et je reviens
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 070
    Points
    12 070
    Billets dans le blog
    8
    Par défaut re
    voila
    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
    Option Explicit
     
    Sub test_Alsaeco_Com()
    cherche_societe , , , , , , 67, "7112B"     ' entre chaque virgule vont les données correspondant au argument de la fonction cherche dans le meme ordre
    End Sub
     
     
    Function cherche_societe(Optional raison As String = "", Optional siret As String = "", Optional siren As String = "", Optional nom_dirigant As String = "", Optional prenom_dirigant As String = "", Optional commune As String = "", Optional departement As String = "", Optional ape As String = "")
    'Déclaration des variables
    Dim IE As Object   'pas de reference a activer en late binding
    Dim IEDoc As Object
    Dim elem As Object
    Dim mon_elem As Object
    Dim URL As String
    Dim tabURL As Variant
    Dim mesTAG_a  As Object
    Dim HtmlElementStandard As Object
    Dim i As Long
     Set IE = CreateObject("internetexplorer.application")
    'Initialisation des variables
    URL = "http://www.alsaeco.com/entreprises/recherche.html?aeadirectoryParam[raison]=" & raison & "&aeadirectoryParam[siret]=" & siret & "&aeadirectoryParam[siren]=" & siren & "&aeadirectoryParam[commune]=" & commune & "&aeadirectoryParam[departement]=" & departement & "&aeadirectoryParam[dirigeant]=" & nom_dirigant & "&aeadirectoryParam[ape]=" & ape & "&aeadirectoryParam[submit]=Rechercher&aeadirectoryParam[page]=8"
     
    'Accès au site web
        IE.Navigate URL
        IE.Visible = True    'Affichage de la fenêtre IE
        WaitIE IE    'On attend le chargement complet de la page
        Set IEDoc = IE.document  'On pointe le membre Document (une variable spécifique pour cette élément permet de bénéficier de l'autocomplétion)
     
      'Les entreprises sont listées dans le tableau démarrant à la balise "ul" avec pour classname "coin-plie"
        For Each elem In IEDoc.all  'On liste les éléments de ce tableau
            If elem.className = "coin-plie" Then
                Set mon_elem = elem
                Exit For
            End If
        Next
     
        Set mesTAG_a = mon_elem.getElementsByTagName("a") 'On liste les éléments de type anchor
        MsgBox mesTAG_a.Length
        ReDim tabURL(mesTAG_a.Length)
        For i = 0 To mesTAG_a.Length - 1 'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque entreprise
           tabURL(i) = mesTAG_a(i).href
     
            MsgBox i & "-" & tabURL(i)
     
        Next
     
        MsgBox "Scan terminé"
     
    'Libération des variables
        Set IE = Nothing
        Set IEDoc = Nothing
    End Function
     
    Sub WaitIE(IE)
       'On boucle tant que la page n'est pas totalement chargée
       Do While IE.readyState <> 4 Or IE.busy
       DoEvents
       Loop
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut
    Je ne fais vraiment pas assez de VBA. J'avais lu il y a peu que les tableaux étaient du même type que son contenu. C'est parfois bon de reprendre les bases

    Après transformation du code, tout semble bien fonctionner

    Par contre, je suis curieux. Pourquoi as-tu changé tous les types en Object ? Et pour le late binding sur IE, j'avais cru comprendre sur le tuto de qwazerty que la méthode early binding était préférable s'il n'y a pas d'utilisation sur de multiples postes. J'ai mal compris ?
    J'ai vu aussi que tu as changé la procédure WaitIE. Quelle est la différence avec le précédant code ?

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 070
    Points
    12 070
    Billets dans le blog
    8
    Par défaut re explication
    question1:
    pour le late binding sur IE, j'avais cru comprendre sur le tuto de qwazerty que la méthode early binding était préférable s'il n'y a pas d'utilisation sur de multiples postes. J'ai mal compris ?
    re oui c'est tout a fait ca demain tu change d'ordi ou de version d'office et il est possible que la reference soit différente
    la methode "createobject" créée l'object avec la référence installée sur l'ordi

    qwazerty préconise simplement le contraire par ce que souvent on oublie de dimer les variable 'dim pati couffin" donc sans variables dimer avec option explicit on a le message variable indefinie
    perso je préfère le late binding car a 99% je code pour les autre( et pour mon plaisir aussi)


    question 2
    J'ai vu aussi que tu as changé la procédure WaitIE. Quelle est la différence avec le précédant code ?
    oui tres souvent sur certaine page web le readystate est obtenue alors qu'un script ou un fichier ce charge encore résultat meme si ton code est bon il plante car en vrai la page n'est pas fini de charger

    donc on boucle tant que le ready state <>4 et au cas ou il chargerait apres le readystate le ie.busy ( en francais occupé/travaille)

    donc en detail ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do ' faire
    doevents 'laise de la marge pour d'autre action system
    loop while Ie.readystate<>4 or IE .busy ' recommence tant que IE  n'est pas pret ou que IE travaille encore 
    voila en couleur en plus
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut
    Ca c'est super, merci pour toutes ces explications
    Reste plus qu'à finir le reste du programme et tout est parfait
    J'espère juste aller plus vite sur la fin, car ça m'a pris pas mal de temps pour en arriver là. Mais j'ai pu apprendre pas mal de choses, et ça, ça n'a pas de prix

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    Bon deja j'avais pas vu ca
    depuis quand une variable tableau est un string
    je regarde ca et je reviens
    Salut Patricktoulon,

    Tu es sûr que c'est incorrect ? J'ai vu plusieurs tutos avec cette règle de définition des variables (sauf si on veut travailler avec des ARRAY)
    De plus, avec le code que j'ai revu, les définir en Variant me pose parfois des problèmes, problèmes résolus en les définissant comme string, integer, ou autre

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 070
    Points
    12 070
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    Tu es sûr que c'est incorrect ? J'ai vu plusieurs tutos avec cette règle de définition des variables (sauf si on veut travailler avec des ARRAY)
    la bonne blage
    taburl() est une variable tableau en gros un array
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut
    Je me base surtout sur ce tuto : http://silkyroad.developpez.com/vba/tableaux/
    Et j'avais des erreurs à plusieurs reprises avec ce type de définition : Dim tabURL As Variant, qui ont disparu en passant par cette formulation : Dim tabURL() As String
    J'ai du mal à comprendre d'où ça vient

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 070
    Points
    12 070
    Billets dans le blog
    8
    Par défaut re
    heu comment dire heu....

    OK

    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dim taburl as variant 'taburl peut etre n'importe quoi ici 
    taburl=range("A1:A10") 'ici il est dimentionnée par une plage de cellule 
    'donc taburl devient taburl(1 to 10) puisque 10 lignes
    exemple 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    dim taburl() 
    for i= 1 to 10
    redim preserve taburl(i)
    taburl(i)="toto" & i
    next
     msgbox taburl(5) ' t'affichera toto5
    c'est plus clair la ?
    dans les parenthezes il y a la dimention du tableau
    alors soit elle est vide au quel cas il faudra la dimentionner avec redim preserve ou tout simplement redim ex:redim taburl(10) et alimenter les 10 element de taburl

    soit il n'y a pas de parentheze et la on la dimention avec la dimention d'un autre tableau ou d'une plage par exemple

    voila
    ps de string taburl n'en a que le contenu

    des que taburl est dimentionner il est un (tableau/array) mais taburl(x) peut etre un string x representant 1 item du tableau je dis bien 1 item

    saisi tu la nuance?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Membre régulier
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 113
    Points : 82
    Points
    82
    Par défaut
    Désolé de revenir sur des bases. Et quand je parlais d'array, je parlais de la fonction ARRAY, les arrays sont bien des tableaux.

    Je comprends bien ce que tu dis. Par contre, ce que je ne comprends pas, c'est pourquoi, dans les 1ers exemples, le tuto déclare les tableaux de la sorte Dim NomTableau() As String (au chapite II-B par exemple).
    Et l'autre interrogation, c'est que j'ai observé des erreurs avec la déclaration de type dim taburl as variant (il me semble que c'était l'erreur "l'indice n'appartient pas à la sélection") qui ont disparu lorsque j'ai changé la déclaration. Ce peut-il qu'autre chose soit la source du problème ?

    Correction : le message d'erreur est en fait "Erreur de compilation : Type d'argument ByRef incompatible"
    Par exemple, pour ce code VBA :
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    Option Explicit
     
    'Déclaration des variables globales
    Dim IE As Object    'Pas de référence à activer en late binding
     
    Sub test_Alsaeco_Com()
    cherche_societe , , , , , , 67, "0146Z"     ' entre chaque virgule vont les données correspondant au argument de la fonction cherche dans le meme ordre
    End Sub
     
     
    Function cherche_societe(Optional raison As String = "", Optional siret As String = "", Optional siren As String = "", Optional nom_dirigant As String = "", Optional prenom_dirigant As String = "", Optional commune As String = "", Optional departement As String = "", Optional ape As String = "")
    'Déclaration des variables
    Dim IEDoc As Object
    Dim elem As Object
    Dim mon_elem As Object
    Dim TagHtml_a As Object
    Dim URL As Variant
    Dim tabURL As Variant
    Dim i As Integer, i_0 As Integer, i_n As Integer, page As Integer, nbPages As Integer, nbSocietes As Integer
     
    'Initialisation des variables
    page = 1
    ReDim URL(1 To page)
    ReDim tabURL(1 To 1)
    URL(1) = "http://www.alsaeco.com/entreprises/recherche.html?aeadirectoryParam[raison]=" & raison & "&aeadirectoryParam[siret]=" & siret & "&aeadirectoryParam[siren]=" & siren & "&aeadirectoryParam[commune]=" & commune & "&aeadirectoryParam[departement]=" & departement & "&aeadirectoryParam[dirigeant]=" & nom_dirigant & "&aeadirectoryParam[ape]=" & ape & "&aeadirectoryParam[submit]=Rechercher"
     
    'Accès au site web
        OuvreLien URL(1)
        Set IEDoc = IE.document  'On pointe le membre Document
     
        'Nombre de pages
        For Each elem In IEDoc.all
            If elem.className = "link last-page" Then   'On cherche le lien pointant sur la dernière page
                nbPages = Val(StrReverse(Val(StrReverse(elem.href))))   'On récupère le numéro de la dernière page présent dans les derniers caractères du lien, et qui représente le nombre de pages
                Debug.Print "Nombre de pages = " & nbPages  'Le résultat s'affiche dans la fenêtre d'execution de l'éditeur de macros
                Exit For
            End If
        Next
     
        'Navigation sur chacune des pages et création du tableau tabURL
        For page = 1 To nbPages 'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque société
            ReDim Preserve URL(1 To page)
            URL(page) = URL(1) & "&aeadirectoryParam[page]=" & page
            Debug.Print "Page " & page
            OuvreLien URL(page)
            Set IEDoc = IE.document  'On actualise le pointage vers le membre Document de la nouvelle page
     
          'Les entreprises sont listées dans le tableau démarrant à la balise "ul" avec pour classname "coin-plie"
            For Each elem In IEDoc.all
                If elem.className = "coin-plie" Then    'On liste les éléments du tableau contenant les URL vers les fiches de chaque société
                    Set mon_elem = elem
                    Exit For
                End If
            Next
     
            Set TagHtml_a = mon_elem.getElementsByTagName("a") 'On liste les éléments de type anchor (chaque balise <a ...> représente un lien vers une fiche société)
            If page = 1 Then
                i_0 = UBound(tabURL)
                ReDim tabURL(1 To UBound(tabURL) + TagHtml_a.Length - 1)  'On écrase le tableau initialement créé (de longueur 1)
              Else
                i_0 = UBound(tabURL) + 1
                ReDim Preserve tabURL(1 To UBound(tabURL) + TagHtml_a.Length) 'On ajoute des cellules au tableau précédant en conservant les données existantes
            End If
            i_n = UBound(tabURL)
            Debug.Print "Nb total de liens : " & UBound(tabURL)
            For i = 0 To TagHtml_a.Length - 1 'On crée un tableau contenant l'ensemble des URL vers les fiches de chaque société
                tabURL(i_0 + i) = TagHtml_a(i).href
                Debug.Print "Société " & i_0 + i & " - " & tabURL(i_0 + i)
            Next
        Next
     
        nbSocietes = UBound(tabURL)
        Debug.Print "Nb total de sociétés recensées : " & nbSocietes
     
        MsgBox "Scan terminé"
     
        IE.Quit 'Fermeture de l'instance d'IE (à inclure obligatoirement si IE.Visible = False)
     
      'Libération des variables
        Set IE = Nothing
        Set IEDoc = Nothing
    End Function
     
     
    ' Verifie si IE déjà lancé et le relance si c'est pas le cas
    ' !! Attention utilise une variable globale IE as Internet Explorer...
    '
    Sub VerifieIE()
        On Error GoTo CreerIE
            If Not IE Is Nothing Then
                IE.Visible = True
            Exit Sub
        End If
    CreerIE:
        Set IE = CreateObject("InternetExplorer.Application")
        IE.Visible = True    'Affichage de la fenêtre IE
    End Sub
     
     
    Sub OuvreLien(URL As String)
        VerifieIE
        IE.Navigate URL
        WaitIE IE    'On attend le chargement complet de la page
        Debug.Print "Fin ouverture " & URL
    End Sub
     
     
    Sub WaitIE(IE)
       'On boucle tant que la page n'est pas totalement chargée
       Do While IE.readyState <> 4 Or IE.busy
          DoEvents
       Loop
    End Sub
    Le programme se bloque avec ce message d'erreur à la ligne 28 : OuvreLien URL(1)

  17. #17
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par patricktoulon Voir le message
    Bon deja j'avais pas vu ca
    depuis quand une variable tableau est un string
    Salut Patrick.

    Renseigne-toi avant d'affirmer des choses.
    Dim tabURL() (avec les parenthèses) est la déclaration d'un Array.
    Il faut donc préciser de quoi est composé cet Array: Dim tabURL() As String.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  18. #18
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 070
    Points
    12 070
    Billets dans le blog
    8
    Par défaut re
    bonsoir
    re mille excuse alaintech
    je pensais l avoir précisé peut etre me suis je mal exprimé
    soit il n'y a pas de parentheze et la on la dimention avec la dimention d'un autre tableau ou d'une plage par exemple

    voila
    ps de string taburl n'en a que le contenu

    des que taburl est dimentionner il est un (tableau/array) mais taburl(x) peut etre un string x representant 1 item du tableau je dis bien 1 item

    saisi tu la nuance?
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. Récupérer des données d'une page web
    Par danyII dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2008, 12h31
  2. Envoyer des données POST à une page web puis récupérer l'URL
    Par Ze moi dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/04/2007, 18h18
  3. [RegEx] Récupérer des données dans une page Web
    Par Pragmateek dans le forum Langage
    Réponses: 8
    Dernier message: 24/05/2006, 20h44
  4. Récupérer des données sur une page HTML
    Par rupeni dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 18/11/2005, 18h22
  5. Récupérer des données dans une page HTML
    Par newdelirium dans le forum Langage
    Réponses: 3
    Dernier message: 26/10/2005, 20h18

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