Extraction VBA de données depuis pages HTML

Extraction VBA de données depuis pages HTML - VB/VBA/VBS - Programmation

Marsh Posté le 19-01-2015 à 13:24:21    

Bonjour à tous,
 
Je vous explique ma problématique en VBA sous EXCEL :
 
J'ai un répertoire 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 :
 
C:\CLIENTS\3\ALBERT DUPONT.html
C:\CLIENTS\29\MAURICE RAVEL.html
...
 
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.
 
Les informations qui m'intéressent sont incluses entre <h1> et </a></dd>.
 
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. :pfff:  
 
Une idée car je suis dessus depuis une semaine ?
 
Merci à vous tous.

Reply

Marsh Posté le 19-01-2015 à 13:24:21   

Reply

Marsh Posté le 19-01-2015 à 14:04:48    

 
           Bonjour,
 
           conformément aux règles de ce forum, sans voir de code (entre balises) ni un exemple de fichier HTML,
 
           je peux juste affirmer que le VBA dispose pourtant des fonctions nécessaires pour manipuler des chaines de caractères
           comme par exemple Split, tout est dans l'aide VBA intégrée !
 
           Sans compter les dll HTML de Windows, consulter le site MSDN ou les tutoriels présents sur le net …
 
           _______________________________________________________________________________________________
           Tous unis, tous Charlie
 

Reply

Marsh Posté le 20-01-2015 à 11:45:47    

Voici les lignes qui m'intéressent dans les pages HTML des sous-dossiers :
 

Code :
  1. <h1>SMITH NATHALIE</h1>
  2. <dl>
  3.  <dt>Qualité</dt><dd>Accountant</dd>
  4.     <dt>Adress</dt><dd>
  5.    67 RUE DE FERRIS         <br/>
  6.     75002     PARIS       </dd>
  7.    <dt>Téléphone</dt><dd>01 22 33 44 55</dd>  <dt>Fax</dt><dd>01 99 88 77 66</dd>  <dt>Email</dt><dd><a href="mailto:cabinet.xxxx@wanadoo.fr">cabinet.xxxx@wanadoo.fr</a></dd>      <!--
  8.    -->
  9.   </dl>

Reply

Marsh Posté le 20-01-2015 à 11:50:33    

Et voici une ébauche non fonctionnelle de ma macro VBA, qui résulte de nombreux tests car je ne suis pas un pro en la matière :
 

Code :
  1. ' Définition des classeurs
  2. Dim CLASSEURORIGINE As Workbook
  3. 'Dim CLASSEURDESTINATION As Workbook
  4. 'Définition des chemins
  5. Dim CHEMINPARENT As String
  6. Dim CHEMINCOMPLET As String
  7. Dim CHEMINFICHIER As String
  8. Dim FEUILLEORIGINE As String
  9. Dim nomfichier As String
  10. Dim index As Integer
  11. Dim DataNom As String
  12. Dim DataNomTotal As String
  13. Dim endtextNom As Integer
  14. Dim debtextNom As Integer
  15. Dim largeurNom As String
  16. Rem Dim oDataObject As DataObject
  17. CHEMINPARENT = "C:\Users\nicolas\Desktop\TEST10\"
  18. Dim Dossier As Object, Fichier As Object
  19. Dim I As Long
  20. For I = 1 To 60000
  21. CHEMINCOMPLET = CHEMINPARENT & I
  22. If Dir(CHEMINCOMPLET, vbDirectory) = "" Then
  23. Else
  24. Set Dossier = CreateObject("Scripting.FileSystemObject" ).GetFolder(CHEMINCOMPLET)
  25. For Each Fichier In Dossier.Files
  26. nomfichier = Fichier.Name
  27. CHEMINFICHIER = CHEMINCOMPLET & "\" & nomfichier
  28. FEUILLEORIGINE = Left(Fichier.Name, InStr(Fichier.Name, "." ) - 1)
  29. Rem CLASSEURORIGINE = Workbooks.Open(Filename:=CHEMINFICHIER)
  30. Set CLASSEURORIGINE = Workbooks.Open(Filename:=CHEMINFICHIER)
  31.     index = FreeFile
  32.      
  33.     Open CHEMINFICHIER For Input As #index
  34.     'lecture du fichier ligne par ligne
  35.     Do While Not EOF(index)
  36.         Input #index, DataNom 'Récupère la ligne
  37.         DataNomTotal = DataNomTotal & DataNom
  38.     Loop
  39.         MsgBox DataNomTotal
  40.        
  41.         endtextNom = InStr(DataNom, "<h1>" )
  42.         MsgBox endtextNom
  43.         debtextNom = InStr(1, DataNom, "</a></dd>" )
  44.         MsgBox debtextNom
  45.             If endtextNom <> 0 Then 'on regarde si le tag de fin est présent dans la ligne
  46.                 debtextNom = InStr(1, DataNomTotal, tagdebNom)
  47.                     largeurNom = numfichier 'la fonction LEN() ne marchant que pour des variables de type string ou object, on copie numfichier (integer) dans largeur (string)
  48.                     largeurNom = Len(largeurNom)
  49.                     'Ajout du nom du membre dans la colonne B.
  50.                     'Cells(numfichier, 2) = Mid(Data, debtext + 11 + largeur, endtext - (debtext + 11 + largeur))
  51.                     MsgBox DataNom
  52.                     Cells(I, 1) = Mid(DataNom, debtextNom + 4, endtextNom)
  53.             End If
  54.         Close #index 'fermeture du fichier
  55. Next
  56. End If
  57. Next
  58. End Sub

Reply

Marsh Posté le 20-01-2015 à 15:27:38    

 
           Démonstration de la fonction Split !
 
           Le plus formateur, en dehors de consulter l'aide VBA intégrée (bien plus efficace que de se perdre sur le net !),
           est de suivre le code en mode pas à pas via la touche F8 tout en contrôlant le contenu de la fenêtre Variable locales
 
           Code à tester dans un nouveau classeur, le résultat de l'extraction est affiché dans la première feuille,
           la variable texte T représentant les données d'un fichier, la variable tableau BL les balises à extraire :
 

Code :
  1. Sub DemoSplitBalises()
  2.     Dim MQ$(), SP$()
  3.  
  4.     T$ = "[Véhicule]Voiture[Marque]Alfa Romeo[/Marque][Couleur]Rouge[/Couleur]"
  5.      T = T & "[Modèle]Giuletta[/Modèle][Année]2012[/Année][/Véhicule]"
  6.      T = T & "[Véhicule]Voiture[Marque]BMW[/Marque][Couleur]Silver[/Couleur]"
  7.      T = T & "[Modèle]120D[/Modèle][Année]2013[/Année][/Véhicule]"
  8.      T = T & "[Véhicule]Voiture[Marque]Citroën[/Marque][Couleur]Marron[/Couleur]"
  9.      T = T & "[Modèle]DS4[/Modèle][Année]2014[/Année][/Véhicule]"
  10.      T = T & "[Véhicule]Voiture[Marque]Dacia[/Marque][Couleur]Verte[/Couleur]"
  11.      T = T & "[Modèle]Logan[/Modèle][Année]2009[/Année][/Véhicule]"
  12.  
  13.     BL = [{"Marque","Modèle","Couleur"}]
  14.     SP = Split(T, "[" & BL(1) & "]" )
  15.     ReDim VA$(1 To UBound(SP), 1 To UBound(BL))
  16.  
  17.     For R& = 1 To UBound(SP)
  18.               MQ = Split(SP(R), "[/" & BL(1) & "]" )
  19.         VA(R, 1) = MQ(0)
  20.  
  21.         For C& = 2 To UBound(BL)
  22.             VA(R, C) = Split(Split(MQ(1), "[" & BL(C) & "]" )(1), "[/" )(0)
  23.         Next
  24.     Next
  25.  
  26.     With Feuil1
  27.                         .Cells(3).Resize(, UBound(BL)).Value = BL
  28.         .Cells(2, 3).Resize(UBound(VA), UBound(VA, 2)).Value = VA
  29.     End With
  30. End Sub

           L'extraction inversant la couleur et le modèle …
 
           Dans le cas de l'ajout d'une nouvelle balise à extraire, la ligne de code n°13 doit être modifiée
           mais le reste du code ne change pas évitant ainsi une production gazière !
 
           ___________________________________________________________________________
           Tous unis, tous Charlie
 

Reply

Marsh Posté le 04-02-2015 à 11:37:33    

Merci !
 
Et comment tu adapterais cela pour mon cas précis ?
 
C'est surtout la partie ouverture HTML et recherche qui m'intéresse dans un premier temps...

Reply

Marsh Posté le 04-02-2015 à 16:55:51    

 
           Justement comme ce n'est pas précis …
 
           Étudier ma démonstration en usant du mode pas à pas, cela aide à comprendre !
 
           Sinon voir du côté des fonctions VBA manipulant du texte comme par exemple InStr, Mid, etc … L'aide étant bien documentée !
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed