Valeurs multiples dans code HTML dont les balises sont identiques

avec la boucle maintenant :

image

ca fonctionne

Est ce que ma façon de travailler le code est propre ?

et maintenant une colonne 13 avec "EUR" ou "USD" ou ... et des chiffres pour les 12 autres colonnes

c'est un nouveau portefeuille et il ne contient pas encore d'actions US , mais si tu veux un aperçus des colonnes manquantes le voila ( juste sur cet Onglet ) :-)

image image image

c'est un fichier complet de suivi de portefeuille boursier ( à titre personnel , mon travail n'a aucun lien je précise :-) ) , un amusement à créer que j'ai commencé il y à 10 ans

Je suis très branché Excel et les sites financiers n'avaient jamais les calculs qui m'intéressai , alors j'ai décidé de récupérer les infos pour avoir la liberté de créer mois même tous les tableaux que je voulais ...

Sur la partie formules je m'arrache les cheveux mais je m'éclate , par contre comme vous l'avez constaté sur la récupération des infos la je galère , au début je n'aurais jamais réussi et un utilisateur de ce forum à créer la macro ( steelson ) et m'a beaucoup aidé

Depuis je ne cesse de tenter de l'améliorer et de mieux comprendre toute cette partie qui m'échappe encore …. mais votre aide ces derniers jours m'a apporté un grand pas en avant !

Je reviens à mes moutons

1- Les valeurs ne sont pas splittées , le EUR est présent , il ne prends pas que les chiffres

image

2- ensuite les valeurs intégrées dans les cellules de mon onglet ( qui est ma source ) ne sont plus reconnues dans mes autres onglets par mes TCD qui sont liés

image

avant de changer de méthode il identifiai bien les valeurs extraites , exemple :

image image

dois je rajouter un format dans quand je fait écrire les cellules ?

 'les 3 dernieres cellules html de la derniere ligne de la tablehtml(2)
                         A = TR.Cells(1).innertext
                         B = TR.Cells(2).innertext
                         C = TR.Cells(3).innertext
                         cURL.Offset(, 2).Resize(, 3).Value = Array(A, B, C)

RE

et ben dit donc en voila tout un foin pour si peu

Function GetHtmlcode(UrL As String)
    On Error Resume Next
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", UrL, False
        .Send
        If .Status = 200 Then
            GetHtmlcode = .responsetext
        End If
    End With
End Function

Sub GO()
    Dim tbl, UrL$, Codehtml, oTable, TableHtmL, TRS, LiG&, C&, E, A&
    tbl = Blad1.Range("tableau1")
     For LiG = 1 To UBound(tbl)
        UrL = tbl(LiG, 1)
        Application.StatusBar = "Téléchargement des données de :    " & tbl(LiG, 1)
        Codehtml = GetHtmlcode(UrL)
        With CreateObject("htmlfile")
            .body.innerhtml = Codehtml

            For Each oTable In .getelementsbytagname("TABLE") 'boucler chaque tableau
                If InStr(1, oTable.innertext, "Bénéfice net par action") > 0 Then Set TableHtmL = oTable 'tableau contient ce texte
            Next oTable

            If Not TableHtmL Is Nothing Then
                Set TRS = TableHtmL.getelementsbytagname("TR")
                E = 0
                For trl = 1 To TRS.Length - 1
                    A = 3
                    For C = 1 To 3
                        E = E + 1
                        tbl(LiG, A + (E - 1)) = TRS(trl).Cells(C).innertext
                    Next
                Next
            End If
        End With
    Next
    With Blad1.Range("tableau1")
        .ClearContents
        .Value = tbl
    End With
    Application.StatusBar = False

End Sub
demo1

re,

une toute petite adaptation du tableau de PatrickT (salut) avec les valeurs numériques

PS. une question, on ne voit pas quelque part un "attribute" avec le valeur de C que vous l'avez fixé à 3 ?

re,

je ne sais pas si cela fonctionnait chez vous, ma la macro "GO" causait une erreur (comme c'est une commando), donc je l'ai renommé en "M_GO".

Puis, je comprends que Pim fait toute sorte de calculations dans ces tableaux, alors cette version ne change que les colonnes avec les données et ne touche pas aux autres.

re

C c'est l'index de la cells html l"a colonne 2023 c'est l"a 1 , la 2024 c'est la 2 , la 2025 c'est la 3

ca n'a rien avoir avec les attributs html

re,

non, ce n'est pas ça que je demande, je sais qu'il y a 4 colonnes dans ce tableau, mais si je ne le savais pas, il y a quelque part une propriété que me dit cela ?

re

bonsoir

oui je l'ai déjà dit c'est l"a propriété .length

mais "attention les index sont en b"ase zero comme d"ans vba pour cetains controls

donc si tu doit boucler

set mesTDs= leparent.getelementsbytagname("TD")

on commence donc la boucle a zero mais on enleve -1

for i= 0 to mesTDs.length-1

msgbox mesRDs(i).innertext

next

Patrick ,

"et ben dit donc en voila tout un foin pour si peu"

Vous ne seriez pas aussi bon professeur je serais presque vexé 🤣

Ce soir pas eu le temps de travailler sur le sujet . .

Bonne soirée à vous tous

bonjour

BsALv je te propose d'avoir des valeurs calculable tout en laissant le format identique a la table html

Function GetHtmlcode(UrL As String)
    On Error Resume Next
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", UrL, False
        .Send
        If .Status = 200 Then
            GetHtmlcode = .responsetext
        End If
    End With
End Function

Sub G_O()
    Dim tbl, UrL$, Codehtml, oTable, TableHtmL, TRS, LiG&, C&, E, A&
    tbl = Blad1.Range("tableau1")
    ReDim tblformat(1 To UBound(tbl), 1 To UBound(tbl, 2))
    For LiG = 1 To UBound(tbl)
        UrL = tbl(LiG, 1)
        Application.StatusBar = "Téléchargement des données de : " & tbl(LiG, 1)
        Codehtml = GetHtmlcode(UrL)
        With CreateObject("htmlfile")
            .body.innerhtml = Codehtml

            For Each oTable In .getelementsbytagname("TABLE") 'boucler chaque tableau
                If InStr(1, oTable.innertext, "Bénéfice net par action") > 0 Then Set TableHtmL = oTable 'tableau contient ce texte
            Next oTable

            If Not TableHtmL Is Nothing Then
                Set TRS = TableHtmL.getelementsbytagname("TR")
                E = 0
                For trl = 1 To TRS.Length - 1
                    A = 3
                    For C = 1 To 3
                        E = E + 1
                        valeur = TRS(trl).Cells(C).innertext
                        tblformat(LiG, A + (E - 1)) = valeur
                        valeur = Replace(valeur, "%", " ")
                        tbl(LiG, A + (E - 1)) = CDbl(Split(valeur, " ")(0)) * 1
                    Next
                Next
            End If
        End With
        Set TableHtmL = Nothing
    Next
    With Blad1.Range("tableau1")
        .ClearContents
        .Value = tbl
        For LiG = 1 To UBound(tbl)
            For col = 3 To UBound(tbl, 2)
                .Cells(LiG, col).NumberFormat = Chr(34) & tblformat(LiG, col) & Chr(34)
            Next
        Next
    End With
    Application.StatusBar = False
End Sub

@PatrickT, supér,

juste pour savoir concernant ce "C", maintenant on a for C=1 to 3, ce 3 c'est parce qu'on le sait, mais pouvait-on utiliser le "childelementCount" (valuer = 4, donc je suppose de 0 à 3), quelque chose comme peut-être en commencant à assigner TRS(trl) à un autre variable)

For C = 1 To TRS(trl).childelementCount - 1

re

attention childelementcount est arrivé dans le javascript 3 et query 2

en vba on travaille avec le COM de IE 9/10 qui ne l'avait pas encore

alors selon les installation Win + explorer internet cette propriété ne fonctionnera pas

perso je préfère .childnodes.length

et sur certaine version d'excel les click&run par exemple c'est .children.length

alors c'est vrai il y a à boire et à manger la dedans on s y retrouve plus

mais on connait tout ça c'est simple

pour info

la collection children prends en charge les élément de typenode 1(toute balise "< nom de balise> "

la collection childnodes prend en charge tout les type de child balise et textnode

mais oui pour répondre a ta question

oui on peut faire

for i= 1 to leparent.chilelement.count-1 ' sur certaines versions d'excel ça ne fonctionne pas

ou

for i= 1 to leparent.children.length-1 ' devrait fonctionner sur toute versions d'excel

ou

for i= 1 to leparent.childnodes.count-1 ' ma préférée elle prend tout type de node je fait tout avec même la vaisselle

voila si vous avez des questions n'hésitez pas

re

tiens cours N°3

une petite demo démontrant la différence entre children et childnodes

Sub test()
    With CreateObject("htmlfile")

        Set div = .body.appendchild(.createelement("div"))

        Set font1 = div.appendchild(.createelement("font"))
        font1.innerhtml = "BsALv"

        div.innerhtml = div.innerhtml & "s'intéresse beaucoup"

        Set Font2 = div.appendchild(.createelement("font"))
        Font2.innerhtml = " à la manipulation html par vba"

       child1 = div.Children(0).innertext
        child2 = div.Children(1).innertext

        MsgBox "codehtml" & vbCrLf & div.outerhtml & vbCrLf & vbCrLf & "Avec la collection ""Children""" & vbCrLf & "l'enfant 0 est : " & child1 & vbCrLf & "l'enfant 1 est : " & child2

        child1 = div.ChildNodes(0).innertext
        child2 = div.ChildNodes(1).NodeValue

        MsgBox "codehtml" & vbCrLf & div.outerhtml & vbCrLf & vbCrLf & "Avec la collection ""childnodes""" & vbCrLf & "l'enfant 0 est : " & child1 & vbCrLf & "l'enfant 1 est : " & child2

    End With
End Sub

waaaw,

merci pour ces explications !

Bonjour ,

je suis perdu maintenant :-) ou est l'indicateur de colonne ? l'équivalent de la version précédente ?

cURL.Offset(, 29).Resize(, 12)

Maintenant vous travailler avec un tableau de données alors je tente de raccrocher les wagons ..

 tbl = Blad1.Range("tableau1")
tbl = cotations.Range("tableau_cotations")

Bonjour ,

je suis bloqué lorsque je tente d'indiquer les noms qui corespondent à mon tableau d'origine :-(

nom de mon onglet = COTATIONS

nom du tableau existant = tableau_cotations

 tbl = cotations.Range("tableau_cotations")

avec la trame modifiée

Rechercher des sujets similaires à "valeurs multiples code html balises identiques"