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ération d'informations dans des pages HTML


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Récupération d'informations dans des pages HTML
    Bonjour à tous,

    Je vous explique ma problématique :

    J'ai un repertoire C:\CLIENTS qui contient des sous répertoires du type 1, 2, 9, 32, ,...60000.

    Les sous-répertoires portent comme nom un numéro et tous les numéros ne se suivent pas, il y en a qui manquent. Cela part de 1 et cela va jusqu'à 60000.

    Donc :

    C:\CLIENTS\1
    C:\CLIENTS\2
    C:\CLIENTS\9
    ...
    C:\CLIENTS\60000

    A l'intérieur de ces sous-dossiers, j'ai une voire plusieurs pages HTML qui portent des noms différents à chaque fois, comme par exemple ALBERT DUPONT.html, MAURICE RAVEL.html etc.

    Aucune logique dans les noms, c'est aléatoire.

    A l'intérieur de ces pages HTML, il y a du code et notamment des lignes affichant un NOM et PRÉNOM, une société, une adresse, un code postal, une ville, un tel, un fax , un email et une adresse de site web.

    Je souhaite créer une macro VBA capable de parcourir chacun des sous-répertoires du dossier parent C:\CLIENTS, et d'extraire dans chaque page HTML les informations qui m'intéressent et qui sont encadrées chaque fois par les mêmes balises, pour me les mettre dans un fichier Excel dans les bonnes colonnes NOM, PRÉNOM, SOCIETE, ADRESSE, CP, VILLE, TEL, FAX, EMAIL, WEB.

    Je pense que c'est possible, j'ai commencé mais c'est une usine a gaz, la macro est très lente, ça plante souvent et j'ai des infos qui sautent. Bref, c'est la galère.

    Une idée ?

    Merci à vous tous et excellente soirée.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 664
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 664
    Points : 34 371
    Points
    34 371
    Par défaut
    Bonjour,

    d'un certain point de vue, c'est normal que se balader dans près de 60000 dossiers prenne du temps

    Le mieux serait que tu nous montres ton code actuel pour qu'on puisse te donner des pistes d'amélioration

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    En fait, j'ai fait un test avec 4 champs uniquement (NOM, TEL, FAX, EMAIL) et j'ai créé un module nommé ModParser :

    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
    Option Explicit
     
    ' Bornage du champ NOM
    Public Const tagdebNom = "<h1>"
    Public Const tagfinNom = "</h1>"
     
    ' Bornage du champ TEL
    Public Const tagdebTel = "phone</dt><dd>"
    Public Const tagfinTel = "</dd>"
     
    ' Bornage du champ FAX
    Public Const tagdebFax = "<dt>Fax</dt><dd>"
    Public Const tagfinFax = "</dd>"
     
    ' Bornage du champ EMAIL
    Public Const tagdebEmail = "mailto:"
    Public Const tagfinEmail = ">"
    Ensuite, j'ai

    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
    Sub test()
     
    ' Définition des classeurs
     
    Dim CLASSEURORIGINE As Workbook
    'Dim CLASSEURDESTINATION As Workbook
     
    'Définition des chemins
     
    Dim CHEMINPARENT As String
    Dim CHEMINCOMPLET As String
    Dim CHEMINFICHIER As String
    Dim FEUILLEORIGINE As String
    Dim nomfichier As String
    Dim ifile As Integer
    ifile = FreeFile
    Dim DataNom As String
    Dim endtextNom As Integer
    Dim debtextNom As Integer
    Dim largeurNom As String
     
    Rem Dim oDataObject As DataObject
    CHEMINPARENT = "C:\CLIENTS\"
     
    Dim Dossier As Object, Fichier As Object
     
    Dim I As Long
     
    For I = 1 To 60000
     
    CHEMINCOMPLET = CHEMINPARENT & I
     
    If Dir(CHEMINCOMPLET, vbDirectory) = "" Then
     
    Else
     
    Set Dossier = CreateObject("Scripting.FileSystemObject").GetFolder(CHEMINCOMPLET)
     
    For Each Fichier In Dossier.Files
     
    nomfichier = Fichier.Name
     
    CHEMINFICHIER = CHEMINCOMPLET & "\" & nomfichier
     
    FEUILLEORIGINE = Left(Fichier.Name, InStr(Fichier.Name, ".") - 1)
     
    Set CLASSEURORIGINE = Workbooks.Open(Filename:=CHEMINFICHIER)
     
    'début du programme
     
     
        Open CHEMINFICHIER For Input As #ifile
        'lecture du fichier ligne par ligne
        Do While Not EOF(ifile)
            Line Input #ifile, DataNom 'Récupère la ligne
            endtextNom = InStr(1, DataNom, tagfinNom)
            debtextNom = InStr(1, DataNom, tagdebNom)
                If endtextNom <> 0 Then 'on regarde si le tag de fin est présent dans la ligne
     
                    debtextNom = InStr(1, DataNom, tagdebNom)
     
                        largeurNom = numfichier 'la fonction LEN() ne marchant que pour des variables de type string ou object, on copie numfichier (integer) dans largeur (string)
                        largeurNom = Len(largeurNom)
     
                        'Ajout du nom du membre dans la colonne B.
                        Cells(I, 1) = Mid(DataNom, debtextNom + 4, endtextNom)
                End If
        Loop
        Close #ifile 'fermeture du fichier
    Next
     
    End If
     
    Next
     
    End Sub

    Je galère avec des bouts de procédure que j'ai adaptées au fur et à mesure.

    Je pense qu'il y a beaucoup + simple...

  4. #4
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut

    Bonjour,

    pour des fichiers html, procéder comme pour une page html, le B-A-BA : Interaction avec Internet Explorer via VBA Excel

    Ensuite au lieu de gérer le Document via IE, utiliser l'objet HTMLFile : voir sur le site MSDN et dans les discussions de ce forum.

    Sinon via un parser maison, penser à la fonction Split tout comme désactiver l'affichage, le calcul, les évènements …
    Utiliser FileSystemObject peut s'avérer plus lent que la fonction Dir

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Possible de me filer un coup de main, là j'ai décroché...

  6. #6
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut





    Peut-être, tout dépend de la question technique à venir et si elle est clairement exposée …



Discussions similaires

  1. Récupération de données dans une page HTML
    Par MadMakII dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/12/2008, 00h00
  2. Réponses: 7
    Dernier message: 13/08/2008, 12h08
  3. Réponses: 4
    Dernier message: 03/04/2008, 14h06
  4. Récupérations d'informations sur une page html
    Par stansoad0108 dans le forum Langage
    Réponses: 14
    Dernier message: 12/03/2008, 13h48

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