Autres Importer fichier html

roro69

XLDnaute Impliqué
Bonjour

Voici dans mon ordinateur j'ai une centaine de recette en html :formater toute ainsi ;(comme l'image joint)
;j'aimerais dans un fichier excel récupérer ainsi:

Les recettes avec un ID unique ; leurs ingrédients en correspondance avec l'id de la recette et pour finir la progression
détaillé avec l'id de la recette est-ce possible?
Merci pour l'aide et le temps consacré
 

Pièces jointes

  • Capture35.PNG
    Capture35.PNG
    39.8 KB · Affichages: 26

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Avec un fichier excel exemple du résultat attendu et plus d'explications, c'eût été mieux.
M'enfin j'ai fait comme si c'était pour moi. Avec PowerQuery.
Avant d'actualiser les requêtes :
Dans la liste des requêtes vous en verrez une nommée "Base" à l'étape Source de cette requête, changez le chemin du répertoire actuel par le chemin du répertoire de vos fichiers sur votre disque dur.

Par contre il y a un défaut d'encodage des fichiers .html qui beugue sur les accents.

J'ai pas le temps de m'attarder à corriger ça.

Cordialement
 

Pièces jointes

  • Recettes-html.xlsm
    389.7 KB · Affichages: 20

roro69

XLDnaute Impliqué
Bonjour Roblochon;
Merci beaucoup pour ta réponse ;c'est exactement ce que je recherchais.
Je n'ai malheureusement pas la version excel compatible avec power query (version excel2007)
En tout cas merci pour le temps consacré et l'aide apporté
Cordialement
 

roro69

XLDnaute Impliqué
Bonsoir @Roblochon ,j'ai une erreur au niveau des procédés : voici l'erreur:
Une erreur s'est produite dans la requête « fnProcédé ». Expression.Error : 5 arguments ont été passés à une fonction qui en attendait entre 2 et 4.
Détails :
Pattern=
Arguments=

  • ; si vous pouviez me renseigner ; merci de votre aide et de votre temps consacré
    Cordialement Roger
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

J'ai repris la requête du post #4 et ne vois rien qui cloche. Tel que, je ne peux vous aider davantage.
Il faudrait les fichiers incriminés.

Les pages html sont semble-t-il mal formées et poseront des problèmes d'interprétation.

Cordialement
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Dans le fichier joint une proposition avec une ancienne méthode de création/lecture de document html.

Il faut cocher la référence 'Microsoft HTML object library' dans vbe "Outils/Références"

Vous verrez dans la récupération des lignes de procédés de la recette, que le paragraphe en cours est explosé en plusieurs lignes à partir du '.' (point) comme séparateur. Ce qui nous fait de drôles de lignes si dans le paragraphe se trouve par exemple "U.H.T". Pour éviter ce cas d'espèce, j'ai remplacé "U.H.T" par "UHT".
Si il a d'autres truc du genre, faudra prévoir un traitement plus adéquat peut-être.

les fichiers html à traiter doivent être dans un sous répertoire ('php2') du classeur.

Cliquer sur le bouton "Extraire les données" de la feuille 'Accueil'

J'ai essayé d' être le plus clair et simple possible dans les méthodes pour que vous puissiez vous en sortir.
La macro principale est largement commentée.

La seule gestion d'erreur est celle de la récupération/création des feuilles du classeur.

VB:
Sub ExtraireHtmlDatas()
    ' Les compteurs de boucles et d'items de tableaux
    Dim j As Integer, i As Integer, k As Integer, L As Integer
    Dim nbRecettes As Integer, nbIngrédients As Integer, nbProcédés As Integer
    Dim msg As String ' message d'erreur ou final
    '
    ' le document html en cours de traitement dans la boucle
    Dim HFileName As Variant   ' son nom (laisser en variant)
    Dim HDoc As HTMLDocument   ' son objet document
    Dim HTables                ' ses tables
    Dim HTable As HTMLTable    ' une table en cours de traitement
    Dim HParas As Object       ' les paragraphes de procédés
    '
    ' les tableaux en mémoire qui contiendront les données
    Dim Fichiers() As String    ' la liste des fichiers
    Dim Recettes()              ' la liste des infos recette
    Dim Ingrédients()           ' la liste des ingrédients
    Dim Procédés()              ' la liste des procédés
    Dim PLignes() As String     ' la liste des lignes d'un procédé
    '
    ' obtenir la liste des fichiers du répertoire
    Fichiers = GetFichiers()

    For Each HFileName In Fichiers
        '
        ' Chargement du doc html
        Set HDoc = GetHtmlDoc(ThisWorkbook.Path & "\php2\" & HFileName, "iso-8859-1")
        '
        ' Récupération des HTables html
        Set HTables = HDoc.getElementsByTagName("table")
        '
        '
        Set HTable = HTables(0)
        nbRecettes = nbRecettes + 1
        ReDim Preserve Recettes(1 To 9, 1 To nbRecettes)
        '
        ' formater l'identifiant de recette à partir du nom de fichier
        Recettes(1, nbRecettes) = Replace(Replace(HFileName, ".html", ""), "recettefiche", "")
        ' récupération du nom de recette
        Recettes(2, nbRecettes) = Trim(HTable.Rows(0).Cells(0).innerText)
        ' formater le coût par portion
        Recettes(3, nbRecettes) = Trim(Replace(HTable.Rows(1).Cells(0).innerText, "Coût par portion :", ""))
        ' Récupération de la table Bilan nutritionnel
        Set HTable = HTable.Rows(3).Cells(0).getElementsByTagName("Table")(0)
        ' Récupération des valeurs de la table
        Recettes(4, nbRecettes) = Trim(Split(HTable.Rows(0).Cells(0).innerText, ":")(1))     ' Energie
        Recettes(5, nbRecettes) = Trim(Split(HTable.Rows(1).Cells(0).innerText, ":")(1))    ' Glucides
        Recettes(6, nbRecettes) = Trim(Split(HTable.Rows(2).Cells(0).innerText, ":")(1))    ' Protéines
        Recettes(7, nbRecettes) = Trim(Split(HTable.Rows(0).Cells(1).innerText, ":")(1))    ' Lipides
        Recettes(8, nbRecettes) = Trim(Split(HTable.Rows(1).Cells(1).innerText, ":")(1))     ' Sodium
        Recettes(9, nbRecettes) = Trim(Split(HTable.Rows(2).Cells(1).innerText, ":")(1))    ' Rapport P/L
        '
        ' Ingrédients
        Set HTable = HTables(0).Rows(4).getElementsByTagName("Table")(0)
        k = HTable.Rows.Length
        For j = 1 To k - 1
            nbIngrédients = nbIngrédients + 1
            ReDim Preserve Ingrédients(1 To 4, 1 To nbIngrédients)
            ' Identifiant recette
            Ingrédients(1, nbIngrédients) = Recettes(1, nbRecettes)
            ' Récupération de l'ingrédient
            Ingrédients(2, nbIngrédients) = Trim(HTable.Rows(j).Cells(0).innerText)
            ' Récupération de la quantité
            Ingrédients(3, nbIngrédients) = Val(Trim(HTable.Rows(j).Cells(1).innerText))
            ' Récupération de l'unité
            Ingrédients(4, nbIngrédients) = Trim(HTable.Rows(j).Cells(2).innerText)
        Next
        '
        ' Procédés
        Set HParas = HTables(0).Rows(5).Cells(0).getElementsByTagName("P")
        k = HParas.Length
        j = 0
        '
        ' Parcourir les paragraphes html
        For i = 1 To k - 1
            ' Eclater en lignes suivant l'existence de points ou non
            PLignes = Split(Trim(Replace(HParas(i).innerText, "U.H.T", "UHT")), ".")
            '
            ' Parcourir le tableau des lignes
            ' pour les ajouter au procédé si elles ne sont pas vides.
            ' chaque ligne reçoit un index d'étape de 1 au nombre de lignes du procédé.
            j = 0 ' index du procédé pour la recette
            For L = 0 To UBound(PLignes) - 1
                If Len(Trim(PLignes(L))) > 0 Then
                    PLignes(L) = Replace(PLignes(L), vbCrLf, "")
                    j = j + 1
                    nbProcédés = nbProcédés + 1
                    ReDim Preserve Procédés(1 To 3, 1 To nbProcédés)
                    Procédés(1, nbProcédés) = Recettes(1, nbRecettes)   'identifiant recettes
                    Procédés(2, nbProcédés) = j              ' index d'étape
                    Procédés(3, nbProcédés) = PLignes(L)   ' texte de la ligne
                End If
            Next
        Next


        Set HParas = Nothing
        Set HTable = Nothing
        Set HTables = Nothing
    Next

    Set HDoc = Nothing
 
    msg = "1 - Recettes : "
    If CréerTableau("Recettes", Application.Transpose(Recettes)) Then
        msg = msg & UBound(Recettes, 2) & " ligne(s) créée(s). "
    Else
        msg = msg & "echec de la création "
    End If
 
    msg = msg & vbCrLf & "2 - Ingrédients : "
    If CréerTableau("Ingrédients", Application.Transpose(Ingrédients)) Then
        msg = msg & UBound(Ingrédients, 2) & " ligne(s) créee(s). "
    Else
        msg = msg & "echec de la création "
    End If
 
    msg = msg & vbCrLf & "3 - Procédés : "
    If CréerTableau("Procédés", Application.Transpose(Procédés)) Then
        msg = msg & UBound(Procédés, 2) & " ligne(s) créee(s). "
    Else
        msg = msg & "echec de la création "
    End If
    MsgBox msg, vbInformation, "Création des tableaux"
End Sub

Function CréerTableau(ByVal Nom As String, datas As Variant) As Boolean
    Dim ws As Worksheet
    Dim nbLig As Long    'compteur de lignes de procédés

    With ThisWorkbook
        '
        ' Récupération ou création de la feuille
        On Error Resume Next
        Set ws = .Sheets(Nom)
        If ws Is Nothing Then
            Set ws = .Sheets.Add(After:=.Sheets(.Sheets.Count))
            ws.Name = Nom
        Else
            ws.Range("A1").CurrentRegion.Delete xlShiftUp
        End If
    End With
 
    On Error GoTo FIN
    With ws
        Select Case LCase(Nom)
        Case "recettes"
            .Cells(1, 1).Resize(, 9).Value = Array("Id", "Titre", "Coût", "Energie", "Glucides", "Protéines", "Lipides", "Sodium", "Rapport P/L")
        Case "ingrédients"
            .Cells(1, 1).Resize(, 4).Value = Array("Id Recette", "Ingrédient", "Quantité", "UG")
        Case "procédés"
            .Cells(1, 1).Resize(, 3).Value = Array("Id Recette", "Etape", "Description")
        End Select
        .Cells(2, 1).Resize(UBound(datas, 1), UBound(datas, 2)) = datas
        .ListObjects.Add(SourceType:=xlSrcRange, Source:=.Cells(1, 1).CurrentRegion, xllistobjecthasheaders:=xlYes).Name = "T_" & Nom
        CréerTableau = True
    End With
FIN:
End Function

@Staple1600 ben !? ty sais ben qui fé toujours bô là oussssssssquiya un breton
Cordialement
 

Pièces jointes

  • Recettes-html-2.xlsm
    69.3 KB · Affichages: 13
Dernière édition:

roro69

XLDnaute Impliqué
Bonjour @Roblochon @Staple1600 .
Super boulot ; vraiment je te remercie ; j'avais essayé à mon travail avec powerquerry sur une version excel 2010 ;et malgré la mise à jour du chemin de base ;l'importation des procédés posaient problème et comme vous l'avez dit les fichiers html avaient étés mal formés ; je vais tester ce soir votre code fort bien commenté .
Je vous remercie beaucoup pour le temps consacré et l'aide apporté.
Cordialement Roger
 

Discussions similaires

Réponses
5
Affichages
342
Compte Supprimé 979
C
Réponses
39
Affichages
4 K

Statistiques des forums

Discussions
312 088
Messages
2 085 201
Membres
102 816
dernier inscrit
bolivier