Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1343 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

Excel macro/vba récupérer données wikipedia

n°2468885
Marc L
Posté le 26-04-2024 à 19:06:01  profilanswer
 

Reprise du message précédent :
 
  Bien vu !  ;)  
 
  Comme je n'ai vu qu'une page BD wiki, mais je m'imagine bien vu le bordel des pages Wiki de jeux vidéo !
  J'espère que les autres pages BD sont elles aussi interrogeables directement par requête car plus rapide que de piloter IE …
 

mood
Publicité
Posté le 26-04-2024 à 19:06:01  profilanswer
 

n°2468886
xenesys
Posté le 26-04-2024 à 19:07:26  profilanswer
 

grace à copilot (oui je sais mais il aide bien quand même !!!)
j'ai réussi à modifier pour faire plusieurs recherches de "Genres":
Et ca marche !!!
 

Code :
  1. 'essai v10 - derniere version par marcL
  2.     Sub DemoGENREv10()
  3.             Dim C, S$, R, oTable As Object, L&
  4.             ' Initialisez les termes de recherche
  5.             search_terms = Array("Genre ", "Genre(s) " )
  6.        With [A1].CurrentRegion.Rows
  7.             C = Application.Match("Genre", .Item(1), 0):  If IsError(C) Or .Count = 1 Then Beep: Exit Sub
  8.             S = "TRANSPOSE(IF(" & Cells(2, C).Resize(.Count - 1).Address & Replace("=0,IF(A2:A#>0,ROW(2:#))))", "#", .Count)
  9.        End With
  10.             Application.Cursor = xlWait
  11.             On Error GoTo Fin
  12.        With CreateObject("InternetExplorer.Application" )
  13.            .Visible = False
  14.         For Each R In Filter(Evaluate(S), False, False)
  15.            .navigate "https://fr.wikipedia.org/wiki/" & Cells(R, 1)
  16.             S = " ¤¤"
  17.             While .Busy Or .readyState < 4:  DoEvents:  Wend
  18.         For Each oTable In .document.getElementsByTagName("TABLE" )
  19.             L = 0
  20.         Do
  21.             If oTable.Rows(L).Cells(0).innerText = search_terms(0) Or oTable.Rows(L).Cells(0).innerText = search_terms(1) Then S = oTable.Rows(L).Cells(1).innerText: Exit For
  22.             L = L + 1
  23.         Loop Until L = oTable.Rows.Length
  24.         Next
  25.             Cells(R, C) = S
  26.         Next
  27. Fin:
  28.             If Err.Number <> -2147023706 Then .Quit
  29.        End With
  30.             Application.Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
  31.             Application.Cursor = xlDefault
  32.             Set oTable = Nothing
  33.     End Sub


Message édité par xenesys le 26-04-2024 à 19:15:45

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468887
Marc L
Posté le 26-04-2024 à 19:14:04  profilanswer
 

 
  Ce serait bien d'utiliser l'icône C pour encadrer le code …
 
  Un classeur BD en lien pourrait confirmer ou infirmer l'utilisation de requêtes au lieu d'IE
  mais, de grâce, que les colonnes à télécharger soient contigües car c'est bien plus efficace à coder …


Message édité par Marc L le 26-04-2024 à 19:14:20
n°2468888
xenesys
Posté le 26-04-2024 à 19:16:07  profilanswer
 

pardon j'ai tellement pas l'habitude que j'ai pas percuté.... désolé.

 

"que les colonnes à télécharger soient contigües" avec la 1ere colonne contenant le titre?
pas de souci je peux mettre les autres colonnes après.


Message édité par xenesys le 26-04-2024 à 19:20:37

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468890
Marc L
Posté le 26-04-2024 à 19:25:34  profilanswer
 

 
  Oui avec au moins le titre de l'album pour retrouver la page Wiki !
  Pour les colonnes à télécharger, peu importe où se trouve la première colonne (C,D, …)
  mais les autres à télécharger doivent coller la première (si la première est la C alors la seconde en D, etc) sans décalage aucun.


Message édité par Marc L le 26-04-2024 à 19:25:50
n°2468893
Marc L
Posté le 26-04-2024 à 19:35:03  profilanswer
 

 
          Un exemple IE pour une BD wiki, résultat dans la fenêtre Exécution du VBE (Ctrl G)
          juste pour convenir qu'il est inutile de parcourir toutes les tables de la page
          car l'infobox_v2 contrairement aux pages de jeux vidéo est une table et contient tout le nécessaire
          donc la procédure doit juste pointer sur lui et boucler sur ses lignes (de table)
          (ici en déclaration anticipée donc les références Microsoft HTML Object Library & Microsoft Internet Controls
          doivent être activées comme je l'ai constaté dans le classeur des jeux vidéo) :

Code :
  1. Private Sub DemoBEwikiIE0()
  2.         Dim V, oRow As HTMLTableRow, M, N%
  3.         On Error GoTo Fin
  4.    With New SHDocVw.InternetExplorer
  5.        .Visible = False
  6.        .Navigate "https://fr.wikipedia.org/wiki/Les_Aventures_de_Tintin"
  7.         While .Busy Or .ReadyState < 4:  DoEvents:  Wend
  8.    If IsObject(.Document.querySelector("table.infobox_v2" )) Then
  9.         V = [{"Auteur ","Genre(s) ","Éditeur ","Première publication "}]
  10.     For Each oRow In .Document.querySelector("table.infobox_v2" ).Rows
  11.         M = Application.Match(oRow.Cells(0).innerText, V, 0)
  12.      If IsNumeric(M) Then
  13.         Debug.Print V(M); Tab(30); Replace(oRow.Cells(1).innerText, vbCrLf, ", " )
  14.         N = N + 1:  If N = UBound(V) Then Exit For
  15.      End If
  16.     Next
  17.    Else
  18.         Beep
  19.    End If
  20. Fin:
  21.         If Err.Number <> -2147023706 Then .Quit
  22.    End With
  23.         If Err.Number Then Beep: Debug.Print Err.Number; ": "; Err.Description
  24.         Set oRow = Nothing
  25. End Sub


Message édité par Marc L le 26-04-2024 à 19:38:53
n°2468897
xenesys
Posté le 26-04-2024 à 20:51:42  profilanswer
 

pendant mes essais, copilot avait dit d'activer plusieurs modules "Microsoft HTML Object Library & Microsoft Internet Controls".

 

j'ai un peu galéré à comprendre mais j'ai réussi et vu le résultat du script.
On voit bien qu'il est possible de ne cibler que la infobox.
Mais comment adapter cela à la recherche comme les autres macro et avec toutes les variantes de textes du "genre" par exemple ?


Message édité par xenesys le 26-04-2024 à 20:52:17

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468909
Marc L
Posté le 27-04-2024 à 00:36:26  profilanswer
 

 
  Avec le B-A-BA d'Excel et /ou de VBA, 'Genre' ne devrait pas poser problème car apparemment il y a les cinq premières lettres de communes
  donc soit avec la fonction de feuille de calculs MATCH (comme dans ma légère démo IE pour la BD, aka EQUIV dans la version française)
  ou encore via la fonction texte VBA Left ou bien même l'opérateur Like avec une wildcard, l'astérisque …
  Tout dépendra des pages Wiki de BD que je pourrais observer.
 
  Quant aux jeux vidéos, j'essaie de réduire un tant soit peu l'usine à gaz pour l'année pour avoir un résultat plutôt correct, du genre +90% de réussite,
  mais à décoder ce sera sportif pour un débutant !  :D
  Ah oui et ce sans modifier en fin de compte la plate-forme PC en Windows car j'ai constaté certaines pages ont des infos 'PC' et non pas 'Windows'
  donc quand la plate-forme est PC, si aucune info correspondante alors la procédure tente pour Windows entre autres …
  Et en pointant directement le div infobox_v3 afin de ne rechercher que dans ses tables au lieu de la page entière,
  en gérant les remplacements directement pour la colonne 'Genre'. Et pour réduire l'usine j'ai regroupé les colonnes à télécharger.
  Trois lignes de code dans le Do Loop pour charger les données brutes puis une bonne cinquantaine pour leur traitement …  :pt1cable:  
 

n°2468911
xenesys
Posté le 27-04-2024 à 07:49:06  profilanswer
 

Merci encore pour l'aide. Au final j'ai appris pas mal de choses  :jap:  
j'attends de voir pour tenter de décoder le code final  :lol:


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468912
xenesys
Posté le 27-04-2024 à 08:13:57  profilanswer
 

bah voilà une surprise....

 

ce code qui fonctionnait nickel hier soir, fonctionne toujours mais provoque la fermeture d'excel voire fermeture+ouverture du fichier à la toute fin de la macro.
j'ai pourtant rien modifié (j'ai repris une copie du code d'ici = idem)

 

edit : en fait ce sont tous les scripts qui plantent au ".quit" même sur le XLS des jeux videos ca ne marche plus....

 
Code :
  1. 'essai v10 - derniere version par marcL
  2.     Sub DemoGENREv10()
  3.             Dim C, S$, R, oTable As Object, L&
  4.             ' Initialisez les termes de recherche
  5.             search_terms = Array("Genre ", "Genre(s) " )
  6.        With [A1].CurrentRegion.Rows
  7.             C = Application.Match("Genre", .Item(1), 0):  If IsError(C) Or .Count = 1 Then Beep: Exit Sub
  8.             S = "TRANSPOSE(IF(" & Cells(2, C).Resize(.Count - 1).Address & Replace("=0,IF(A2:A#>0,ROW(2:#))))", "#", .Count)
  9.        End With
  10.             Application.Cursor = xlWait
  11.             On Error GoTo Fin
  12.        With CreateObject("InternetExplorer.Application" )
  13.            .Visible = False
  14.         For Each R In Filter(Evaluate(S), False, False)
  15.            .navigate "https://fr.wikipedia.org/wiki/" & Cells(R, 1)
  16.             S = " ¤¤"
  17.             While .Busy Or .readyState < 4:  DoEvents:  Wend
  18.         For Each oTable In .document.getElementsByTagName("TABLE" )
  19.             L = 0
  20.         Do
  21.             If oTable.Rows(L).Cells(0).innerText = search_terms(0) Or oTable.Rows(L).Cells(0).innerText = search_terms(1) Then S = oTable.Rows(L).Cells(1).innerText: Exit For
  22.             L = L + 1
  23.         Loop Until L = oTable.Rows.Length
  24.         Next
  25.             Cells(R, C) = S
  26.         Next
  27. Fin:
  28.             If Err.Number <> -2147023706 Then .Quit
  29.        End With
  30.             Application.Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
  31.             Application.Cursor = xlDefault
  32.             Set oTable = Nothing
  33.     End Sub
 


je viens de faire le pas-à-pas et il reboucle ici avant de faire une erreur "erreur 424 objet requis" quand il revient la seconde fois sur le ".Quit"

Code :
  1. If Err.Number <> -2147023706 Then .Quit
  2.        End With
  3.             Application.Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
  

EDIT 2 : rhoooooo punaise j'ai compris.... ma carte son n'est pas active donc le son de fin ne peut pas être correctement lu, il boucle et plante vu que IE est déjà fermé.....


Message édité par xenesys le 27-04-2024 à 08:34:57

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
mood
Publicité
Posté le 27-04-2024 à 08:13:57  profilanswer
 

n°2468926
xenesys
Posté le 27-04-2024 à 10:46:16  profilanswer
 

voila une 1ère ébauche de catalogue.
Pas beaucoup de lignes et coté colonnes j'avoue que je regarde encore ce qu'il faut.
Aussi je viens de voir qu'avec les manwha ca complexifie un peu la infobox....
Catalogue BD-WEBTOONS.xlsm / 91.63 Ko / https://1fichier.com/?8t8p80it8m6rfbg6uwl1

 


edit v2: re-maj j'ai rajouté quelques éléments + modifs macros >> https://1fichier.com/?4vbqbtdcy0cbdw3uy490


Message édité par xenesys le 27-04-2024 à 13:46:47

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468941
Marc L
Posté le 27-04-2024 à 17:03:13  profilanswer
 

 
  Suggestion : au lieu de dédier la colonne N au lien de la page de la BD pourquoi pas le mettre directement sur le titre ?
 

n°2468944
Marc L
Posté le 27-04-2024 à 17:33:24  profilanswer
 

 
  Ce n'est pas une si bonne idée, mieux vaut garder la colonne N pour les webtoons …
 
  Sinon je viens de détecter dans les pages BD Wiki différents infobox, v2 & v3, donc une programmation par type d'infobox !
 
  Je vais peut-être d'abord finaliser les jeux vidéos …
 

n°2468951
Marc L
Posté le 27-04-2024 à 19:06:38  profilanswer
 

 
  Bonne nouvelle pour les BD Wiki : peu importe v2 ou v3, ce serait le même code via une astuce.
 
  Il se pourrait que ce soit applicable aux jeux vidéo :
  j'aurai eu un souci au moment de l'inspection initiale ou alors des pages auraient une programmation différente
  donc pour l'instant je regarde pour les BD, peut-être aurais-je plus tard un œil neuf pour les jeux vidéo, donc en standby
 

n°2468963
xenesys
Posté le 27-04-2024 à 22:23:15  profilanswer
 

Franchement gros merci d'y passer autant de temps  :jap:


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469101
Marc L
Posté le 30-04-2024 à 09:07:29  profilanswer
 

 
  Pour les pages Wikipedia des BD, synopsis :
 
  la colonne B est celle de référence pour traiter chaque Titre si la cellule est vide.
  Un Beep retentit si aucune cellule vide dans la colonne B …
 
  La procédure télécharge les données dans les colonnes B à H mais, comme les pages Wiki sont inconstantes,
  elle doit charger en mémoire dix informations référencées dans la variable X.
 
  Si le Titre correspond à une page d'homonymie alors si le type est indiqué dans la colonne I
  la procédure tente l'URL modifiée avec ce type, par exemple 'BD' pour Cubitus & Gaston ou bien
  'manga' pour Lovely Complex (j'ai failli passer à côté croyant que ce n'était pas une page Wiki !),
  évitant de modifier le Titre comme déjà effectué pour Cubitus & Gaston (donc deux solutions) …
  Le lien hypertexte de la page correspondante est associé au Titre.
 
  Les lignes de code n°37 à 50 collectent les données directement dans les lignes de(s) table(s) HTML,
  la fonction de feuille de calculs EQUIV (Match nativement) effectuant la vérification des colonnes
  ainsi la colonne Genre doit être au singulier pour trouver une correspondance
  entre 'Genre*' et ses possibles dérivés comme 'Genres', 'Genre(s)' ou encore 'Genre ' …
  Des n°55 à 70 pour trouver une année parmi les données collectées et si aucune trouvée alors
  les n°71 à 79 en cherchent une dans le code HTML brut en dessous du paragraphe 'Albums' s'il existe dans la page,
  ok avec les pages 'infobox_v2' mais pas pu valider pour les v3 car aucune de la feuille Excel dans ce cas …
 
  Vu la versatilité des page Wiki, vérifier les données chargées, en particulier les colonnes G & H.
 
  Edit : si une page n'existe pas (ou ne correspond pas à l'attendu) alors le caractère est placé dans la colonne B.
 
  Références nécessaires :
 

  • Microsoft VBScript Regular Expressions 5.5 (expressions rationnelles pour extraire / remplacer du texte)
  • Microsoft WinHTTP Services, version 5.1    (requêtes web)
  • Microsoft HTML Object Library


  Démonstration VBA à coller uniquement dans le module de la feuille de la table comme Feuil3 (Catalogue BD-WEBTOONS (2))
  (Edit : les caractères ¤ ci-dessous doivent être supprimés côté VBA) :

Code :
  1. Sub DemoBDwikiReq1()
  2.  Const F = "SUBSTITUTE(", G = "¤))))", H = ","" "",""_""" & G, S = """>Les albums"
  3.    Dim U, B$, W, L, X, R&, V(), P&, M, T, oDoc As New HTMLDocument, oReg As New RegExp, oRmc As MatchCollection
  4.   With ListObjects(1).DataBodyRange.Columns
  5.        U = .Item(1).Address
  6.        B = "TRANSPOSE(IF(" & .Item(2).Address & "=0,IF(" & U & ">0,"
  7.        W = Filter(Evaluate(B & F & Replace("IF(#=""BD"",""bande_dessinée"",LOWER(#))", "#", .Item(9).Address) & H), False, False)
  8.   End With
  9.        If UBound(W) < 0 Then Beep: Exit Sub
  10.        oReg.Global = True:  oReg.IgnoreCase = True
  11.        L = Filter(Evaluate(B & "ROW(" & U & G), False, False)
  12.        U = Filter(Evaluate(B & """https://fr.wikipedia.org/wiki/""&" & F & U & H), False, False)
  13.        B = " Sur " & UBound(W) + 1 & " pages : #"
  14.        X = Evaluate("{""" & Join([B1:F1&"*"], """,""" ) & """,""Nombre d’albums*""," & _
  15.                     """Première publication*"",""Volumes*"",""Date de parution*"",""Sortie initiale*""}" )
  16.   With Application
  17.       .Cursor = xlWait
  18.       .ScreenUpdating = False
  19.        On Error Resume Next
  20.   With New WinHttpRequest
  21.    For R = 0 To UBound(W)
  22.        If R Then Application.StatusBar = B & R + 1
  23.        ReDim V(1 To UBound(X))
  24.    Do
  25.       .Open "GET", U(R), False
  26.       .SetRequestHeader "DNT", "1"
  27.       .Send
  28.        P = InStr(1, .ResponseText, "class=""infobox_v", 1):  If Err.Number Then Exit For
  29.        M = W(R) > "" And P = 0 And .Status = 200 And Not U(R) Like "*_(*)"
  30.        If M Then U(R) = U(R) & "_(" & W(R) & "¤)"
  31.    Loop While M
  32.    If .Status = 200 And P Then
  33.        Hyperlinks.Add Cells(L(R), 1), U(R), , "Wiki"
  34.        oDoc.body.innerHTML = .ResponseText
  35.        oDoc.body.innerHTML = oDoc.querySelector("." & Split(Split(Mid(.ResponseText, P + 7), """" )(0))(0)).outerHTML
  36.        If Err.Number Then Exit For
  37.   With oDoc.getElementsByTagName("TR" )
  38.    For P = 0 To .Length - 1
  39.        M = Application.Match(1, Application.Match(X, Array(.Item(P).Cells(0).innerText), 0), 0)
  40.     If IsNumeric(M) Then
  41.     Do
  42.        T = Trim(.Item(P).Cells(1).innerText)
  43.        If InStr(1, V(M), T, 1) = 0 Then V(M) = IIf(IsEmpty(V(M)), "", V(M) & vbCrLf) & T
  44.        If .Item(P).NextSibling Is Nothing Then Exit Do
  45.        If .Item(P).NextSibling.Cells(0).innerText > "" Or .Item(P).NextSibling.Cells.Length = 1 Then Exit Do
  46.        P = P + 1
  47.     Loop
  48.     End If
  49.    Next
  50.   End With
  51.        oReg.Pattern = "Bande dessinée (de |jeunesse\r\n)?|Franco-belge ?\r?\n?"
  52.        M = V(5):  V(5) = oReg.Replace(V(5), "" ):  If V(5) = "" Then V(5) = M
  53.        oReg.Pattern = " ?\r\n":  V(5) = StrConv(oReg.Replace(V(5), ", " ), 3)
  54.        If IsEmpty(V(6)) Then V(6) = V(8)
  55.        oReg.Pattern = "\D?(\d{4})\D?"
  56.    For Each M In [{2,3,4,6,7,9,10}]
  57.     If oReg.Test(V(M)) Then
  58.         T = Split(V(M), vbCrLf)
  59.     For P = 0 To UBound(T)
  60.      If oReg.Test(T(P)) Then
  61.         Set oRmc = oReg.Execute(T(P))
  62.         T(P) = oRmc(0).SubMatches(0):  If oRmc.Count > 1 Then T(P) = T(P) & " - " & oRmc(oRmc.Count - 1).SubMatches(0)
  63.      Else
  64.         T(P) = False
  65.      End If
  66.     Next
  67.         V(7) = Join(Filter(T, False, False), vbLf)
  68.         Exit For
  69.     End If
  70.    Next
  71.     If IsEmpty(M) Then
  72.         V(7) = M
  73.         T = Split(.ResponseText, IIf(InStr(1, .ResponseText, S, 1), S, """>Albums" ), , 1)
  74.      If UBound(T) > 0 Then
  75.          T = Split(T(1), "<h2>" )(0)
  76.          oReg.Pattern = "<li>.+(<a .+title=""|>.*\D)(\d{4})\D.*</li>"
  77.          If oReg.Test(T) Then V(7) = oReg.Execute(T)(0).SubMatches(1)
  78.      End If
  79.     End If
  80.        If IsEmpty(V(1)) Then V(1) = " …"
  81.        Rows(L(R)).Columns("B:H" ) = V
  82.    Else
  83.        Cells(L(R), 2) = ChrW(8960)
  84.    End If
  85.        If R Mod 11 = 1 Then DoEvents
  86.    Next
  87.   End With
  88.       .Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
  89.       .StatusBar = False
  90.       .Cursor = xlDefault
  91.       .ScreenUpdating = True
  92.   End With
  93.        Set oDoc = Nothing:  Set oReg = Nothing:  Set oRmc = Nothing
  94. End Sub


Message édité par Marc L le 30-04-2024 à 15:20:59
n°2469102
Marc L
Posté le 30-04-2024 à 09:36:05  profilanswer
 

 
  Toujours le souci avec le site modifiant le code !  
 
  Code original, ligne n°
 
    2 :   Const F = "SUBSTITUTE(", G = "¤))))", H = ","" "",""_""" & G, S = """>Les albums"
 
  30 :   If M Then U(R) = U(R) & "_(" & W(R) & "¤)"
 
  Pour ces deux lignes il ne faut pas d'espace dans les chaines de caractères, représentés ici par le caractère ¤ donc à supprimer,
  je ne comprends pas pourquoi le site en rajoute …
 


Message édité par Marc L le 30-04-2024 à 09:37:12
n°2469158
xenesys
Posté le 30-04-2024 à 18:03:08  profilanswer
 

OLALALA  :ouch:  :ouch:  :ouch:  :ouch:  
merci  beaucoup !!
je vais tester ca tout de suite !!


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469167
xenesys
Posté le 30-04-2024 à 18:42:23  profilanswer
 

J'ai bien activé tous les modules de "références" besoin.
effacé les espaces en trop.
Copié le script sur la feuille même du tableau excel (pas un module)
Le script fonctionne bien mais à la fin, sort.
Il ne continue pas sur toutes les lignes avec le titre rempli.

 

il arrive ici et écrit dans toutes les cases (ca semble ok)

Code :
  1. If IsEmpty(V(1)) Then V(1) = " …"
  2.             Rows(L(R)).Columns("B:H" ) = V
  3.         Else
  4.             Cells(L(R), 2) = ChrW(8960)
  5.         End If
 

enchaine sur

Code :
  1. If R Mod 11 = 1 Then DoEvents
  2.         Next
 

remonte sur la ligne

Code :
  1. If R Then Application.StatusBar = B & R + 1
  2.             ReDim V(1 To UBound(X))
 

refait cette partie

Code :
  1. Do
  2.            .Open "GET", U(R), False
  3.            .setRequestHeader "DNT", "1"
  4.            .send
  5.             P = InStr(1, .responseText, "class=""infobox_v", 1):  If Err.Number Then Exit For


il bascule sur le "Exit For"

 

puis bascule directement en bas de page

Code :
  1. End With
  2.            .Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
 

et dit "propriété ou méthode non géré par cet objet"

 

j'avoue ne pas comprendre pourquoi il fait ca.

 

je remets une copie du xlsm :
Catalogue BD-WEBTOONS.xlsm / 112.04 Ko / https://1fichier.com/?0r4v1z54o60j1nx9jrbm

 

l'onglet "Catalogue BD-WEBTOONS (2)" est là pour les essais. je voulais pas tout casser ce que j'avais dans l'onglet N°1


Message édité par xenesys le 30-04-2024 à 19:19:41

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469191
Marc L
Posté le 01-05-2024 à 00:35:49  profilanswer
 

 
  De mon côté je n'ai eu aucun souci avec le précédent lien pour la feuille BD-WEBTOONS (2),
  j'ai juste failli louper une page Wiki croyant que ce n'en était pas une par manque d'explication, car deviner n'est pas coder
 
  L'erreur s'est produite durant la boucle, je vais essayer le dernier fichier lié.
  L'astuce est simple pour voir ce qui la déclenche : il suffit de mettre en commentaire la ligne On Error et de progresser en mode debug pas à pas …
 

n°2469194
Marc L
Posté le 01-05-2024 à 01:28:21  profilanswer
 

 
  Avec le dernier fichier lié :
 
- premier test avec la page WEBTOONS (2) telle quelle donc à partir du titre 'Le Génie des Alpages' : 44 pages traitées dont une dizaine non Wiki,
  message vocal 'Fini' donc pas d'erreur …
 
- Second test après la suppression de tous les liens hypertextes de la colonne A et colonne B entièrement vidée : 51 pages traitées, 'Fini' …
 
  Donc tutti va bene de mon côté, situation déjà rencontrée mais uniquement lors d'un pilotage d'Internet Explorer :
  le même code HTML peut donner des résultats différents selon la version de Windows et de ses composants Internet,
  en fait pas dans les données contenues dans la page mais dans sa structure objet même : un ordre différent des éléments,
  une version de Windows n'a pas de children pour un élément particulier alors qu'une autre version de Windows en a bien un, etc …
 
  Donc ici ma démonstration n'utilise pas Internet Explorer mais a bien un point commun :
  l'objet Document HTML dans lequel j'injecte le résultat de la requête, à savoir le code HTML brut source de la page web.
  Et c'est là que le bas blesse car la version de Windows de l'ordinateur de tests est la 8.1, certainement différente de la tienne, me trompe-je ?
 
  L'idéal serait de trouver de ton côté quelle ligne de code déclenche l'erreur afin de pouvoir inspecter notamment les variables, les objets HTML …
  Je place les procédures dans le module de classe d'une feuille de calculs par facilité - code simplifié - mais surtout
  par sécurité car, même si la feuille active n'est pas la bonne, les modifications se feront uniquement dans la feuille contenant cette procédure.
  Mais cela est plus difficile pour les débutants de déboguer un code …
 
  Donc, si tu n'arrives pas à trouver la ligne source de l'erreur je propose d'effectuer une modification du code afin de le placer dans un module standard
  soit en organisant la procédure pour qu'elle travaille avec la feuille de calculs active (à tes risques et périls si ce n'est pas la bonne feuille active) ou bien
  soit en référençant une feuille spécifique pour le traitement des données même si ce n'est pas la feuille active.
  Juste en mettant en commentaire la ligne 'On Error' la ligne déclenchant l'erreur sera visible immédiatement
  mais peut-être devras-tu inspecter les variables pour me mettre sur la voie car deviner n'est pas ma tasse de thé …


Message édité par Marc L le 01-05-2024 à 17:19:52
n°2469196
Marc L
Posté le 01-05-2024 à 02:09:40  profilanswer
 

 
  L'erreur doit se déclencher pendant le traitement de la page 'La Caste des Méta-Barons' (données à vérifier)
  donc voici une simple astuce pour continuer le traitement des pages suivantes :
 
  insérer la ligne de code Err.Clear juste avant la ligne .Send


Message édité par Marc L le 01-05-2024 à 02:10:08
n°2469197
xenesys
Posté le 01-05-2024 à 08:40:49  profilanswer
 

merci encore pour l'aide. c'est fou si ca marche d'un coté mais pas de l'autre  :cry:  :pfff: ^^""  
Pour essayer de répondre :
 
- je suis sous windows 11 pro 64b
 
- le message d'erreur est pour chaque ligne de BD.
>> je lance le script pour BD ligne N°1 >> erreur >> je relance lance le script pour BD N°2 >> erreur >> >> je relance le script pour BD N°3 >> erreur >> etc
 
- Copié et lancé le script depuis un module : ne se lance pas et message d'erreur "erreur de compilation : sub ou fonction non définie" en étant figé sur le "ListObjects" de la 3ème ligne "

Code :
  1. With ListObjects(1).DataBodyRange.Columns


 
- en remettant le script dans la page Catalogue BD-WEBTOONS (2) et ajouté Err.Clear : toutes les lignes ont été remplies d'une traite mais à la fin il y a quand même eu le "propriété ou méthode non géré par cet objet".
vais essayer de revoir maintenant étape par étape à nouveau.


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469214
Marc L
Posté le 01-05-2024 à 16:57:25  profilanswer
 

 
  Oui comme expliqué ma démonstration telle quelle ne peut être que dans le module d'une feuille …
  Comme le message se déclenche pour chaque page cela confirme bien la structure objet de la page est différente de la mienne !
 
  De mon côté je me suis aperçu d'un souci dans le résultat des dates en colonne H des nouvelles BD v3,
  celles que je n'avais pas avec le premier classeur, peut concerner aussi des v2, deux modifications à faire :
 

  • la ligne de code n°56 - telle que publiée, avec la ligne de code Err.Clear incorporée alors +1 - car j'ai oublié d'optimiser l'ordre :
Code :
  1. For Each M In [{7,9,10,2,3,4,6}]


  • Là c'est juste du confort pour éviter un doublon dans une ligne d'un résultat, réorganiser le code des lignes n°61 & 62 ainsi :
Code :
  1. Set oRmc = oReg.Execute(T(P)):   T(P) = oRmc(0).SubMatches(0)
  2. If oRmc.Count > 1 Then M = oRmc(oRmc.Count - 1).SubMatches(0): If M > T(P) Then T(P) = T(P) & " - " & M


Message édité par Marc L le 01-05-2024 à 18:25:14
n°2469217
Marc L
Posté le 01-05-2024 à 17:39:37  profilanswer
 

 
  Afin que je puisse inspecter le code HTML retourné (au cas où), dans un nouveau classeur
  nommer une cellule _URL dans laquelle doit figurer l'adresse complète d'une page BD Wiki,
  en dessous nommer une cellule _TXT pour référencer le chemin d'accès du fichier texte contenant le code HTML retourné.
  Créer un bouton 'Extraire' et lui associer la procédure suivante idéalement placée dans le module de la feuille.
  Une fois le fichier texte créé, merci de le lier dans un nouveau post afin que je puisse vérifier le code retourné …
 

Code :
  1. Sub URLtoTEXTfile()
  2.     With CreateObject("WinHttp.WinHttpRequest.5.1" )
  3.         .Open "GET", [_URL], False
  4.         .SetRequestHeader "DNT", "1"
  5.          On Error Resume Next
  6.         .Send
  7.          If Err.Number = 0 Then T$ =  "<!-- " & .Option(0) & " -->" & vbLf & vbLf & .ResponseText
  8.     End With
  9.          On Error GoTo 0
  10.     If T > "" And Not IsEmpty([_TXT]) Then
  11.         F% = FreeFile
  12.         Open [_TXT] For Output As #F
  13.         Print #F, T;
  14.         Close #F
  15.     Else
  16.         Beep
  17.     End If
  18. End Sub


Message édité par Marc L le 01-05-2024 à 18:00:49
n°2469234
xenesys
Posté le 01-05-2024 à 22:10:42  profilanswer
 

désolé je viens de tenter de réaliser l'extraction du code html mais je ne suis pas sur d'avoir bien compris...
je ne pense pas avoir fait d'erreur mais au final, j'ai toujours "erreur d'execution : 13 - incompatibilité de type" lorsqu'il arrive sur

Code :
  1. .setRequestHeader "DNT", "1"


j'ai fait le test dans un xls neuf et le xlsm déjà créé mais idem.
 
 

Citation :

   la ligne de code n°56 - telle que publiée, avec la ligne de code Err.Clear incorporée alors +1 - car j'ai oublié d'optimiser l'ordre :  
 
Code :
 
    For Each M In [{7,9,10,2,3,4,6}]
 
 
    Là c'est juste du confort pour éviter un doublon dans une ligne d'un résultat, réorganiser le code des lignes n°61 & 62 ainsi :  
 
Code :
 
    Set oRmc = oReg.Execute(T(P)):   T(P) = oRmc(0).SubMatches(0)
    If oRmc.Count > 1 Then M = oRmc(oRmc.Count - 1).SubMatches(0): If M > T(P) Then T(P) = T(P) & " - " & M
 


j'ai fait les modifications : ok pas de souci même si toujours le message vocale d'erreur à la fin.


Message édité par xenesys le 01-05-2024 à 22:16:35

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469238
Marc L
Posté le 02-05-2024 à 00:23:24  profilanswer
 

 
  Là j'ai un doute sur l'OS ou Excel est aux fraises ! Une fermeture s'impose …
  D'autant plus étonnant la même ligne fonctionne bien dans la démonstration !
 
  Parade : activer Microsoft WinHTTP Services, version 5.1 puis remplacer CreateObject("WinHttp.WinHttpRequest.5.1" ) par New WinHttpRequest …
 
  Ou bien ouvrir manuellement via IE une page BD Wiki puis via le menu contextuel accéder au code puis le copier intégralement
  et le coller dans le Bloc-notes pour enregistrer le fichier texte.


Message édité par Marc L le 02-05-2024 à 00:40:16
n°2469260
xenesys
Posté le 02-05-2024 à 16:11:19  profilanswer
 

C'est possible de m'envoyer le xls de test qui fonctionne ?
Je verrai si je me suis pas trompé en créant le mien et verrai aussi si sur mon Excel (version 2019 pro 64b ) ça marche ou non...


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469261
Marc L
Posté le 02-05-2024 à 16:28:45  profilanswer
 

 
  Voici le fichier pour enregistrer le code source brut d'une page web : URL to Text File .xlsb
 
  Sinon un copier / coller manuel du code HTML depuis IE cela le fait aussi bien …
   
 

n°2469275
xenesys
Posté le 02-05-2024 à 18:20:44  profilanswer
 

:pfff:  :pfff:  :pfff: j'en étais sûr.... j'ai mal créé le fichier.
le votre a très bien fonctionné.
 
Wiki v2 .txt / 83.56 Ko / https://1fichier.com/?98370d1ws3uexq58p31l


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469313
Marc L
Posté le 03-05-2024 à 00:28:14  profilanswer
 

 
  Je viens de tester en remplaçant les données de la requête par celles du fichier texte : aucune erreur durant l'exécution de la procédure …
  En attendant de comparer ce fichier avec le résultat de la même requête sur l'ordinateur de tests
  j'aimerais bien avoir la même chose mais cette fois sous IE, le code de la page une fois chargée pouvant être copié manuellement
  mais en cas de souci je peux fournir une petite procédure VBA du même acabit que la précédente pour automatiser la création du fichier texte.
 
  J'ai sous le coude une autre voie sans utiliser un objet Document HTML mais c'est plus difficile à suivre et surtout à maintenir pour un débutant.
  Et pas trop envie de perdre du temps - sauf pour le sport - si cela ne fonctionne toujours pas bien de ton côté …
 

n°2469376
xenesys
Posté le 03-05-2024 à 18:48:55  profilanswer
 

CODE IE.txt / 85.09 Ko / https://1fichier.com/?4uixpcolqvv7ijhvtb9y
Catalogue BD-WEBTOONS.xlsm / 123.47 Ko / https://1fichier.com/?3kve35r9p8qt52e06p8q

 

je viens de constater qu'avec mon catalogue le script de test ne fonctionne pas. alors que votre fichier fonctionne toujours. je n'arrive pas à voir de différence.
Je vais déjà tester de repartir d'une feuille vierge XLSM...

 

edit : même avec un xlsm neuf, il me sort "erreur d'execution 1004 : erreur définie par l'application ou l'objet" en état sur la ligne "

Code :
  1. With CreateObject("WinHttp.WinHttpRequest.5.1" )


pourtant j'ai tout réactiver les references qu'il faut (voire même plus).
le fichier "binaire" fonctionne mais pas le XLSM...


Message édité par xenesys le 03-05-2024 à 19:04:23

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469379
Marc L
Posté le 03-05-2024 à 19:22:33  profilanswer
 

 
  Si par 'script de test' il s'agit de la procédure URLtoTEXTfile c'est normal qu'elle ne fonctionne pas dans le catalogue
  car les cellules n'ont pas été nommées comme je l'ai indiqué, via le Gestionnaire de noms par exemple, car,
  rien qu'en regardant à gauche de la barre de formule je vois A5 au lieu du nom attendu et donc
  c'est la ligne de code .Open devant planter et non pas la précédente …
 
  Pour un ActiveX l'instruction CreateObject est du 'late binding' donc pas besoin d'activer de référence.
  Si dans un bloc With - c'est à dire avec End With - au sein d'une procédure elle ne fonctionne pas sous Windows
  c'est un gros problème dans Excel ou dans Windows mais d'autant plus incompréhensible
  car cela a marché - marche encore ? - dans le catalogue !
 
  Merci pour les liens, je dois encore patienter deux heures pour pouvoir télécharger le deuxième, à suivre …
 

n°2469385
xenesys
Posté le 03-05-2024 à 20:32:32  profilanswer
 

je pense avoir corrigé la gestion des noms puisque le script va plus loin mais il plante dès  

Code :
  1. .SetRequestHeader "DNT", "1"

 
c'est fou tous ces soucis  :pt1cable:


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469393
xenesys
Posté le 03-05-2024 à 21:08:57  profilanswer
 

j'ai trouvé un autre point de DL : https://transfert.free.fr/6wJWNUm


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469401
Marc L
Posté le 04-05-2024 à 00:20:41  profilanswer
 

 
  Bien mieux, merci, y a pas photo ‼
 
  Je m'attendais à un plantage avec la source IE, et bien non, toujours aucun souci de mon côté.
  A se demander si ce n'est pas spécifique à ton setup … Sinon je vais devoir comparer, va être fastidieux et long.
 
  Connaître la ligne de code déclenchant l'erreur pouvant aussi aider :
 

  • déplacer la procédure DemoBDwikiReq1 du module de la feuille vers un module normal genre Module1.


  • Insérer une apostrophe au début de la ligne de code n°19 On Error afin de la mettre en commentaire. Idem pour Err.Clear ligne 27.


  • Insérer Feuil4. devant : ListObjects(1) de la ligne n°4, Rows ligne 81 et Cells des lignes 34 & 83 …


Message édité par Marc L le 04-05-2024 à 00:31:29
n°2469403
xenesys
Posté le 04-05-2024 à 07:44:17  profilanswer
 

c'est pas impossible que ca soit un élément chez moi (windows/config/excel/etc) qui fasse des siennes.

 

sinon j'ai copié dans un module 4 (seul facile pour avoir les lignes) avec les modifs demandées :
il s'arrete sur la ligne 34 "erreur 424 - objet requis"

Code :
  1. Hyperlinks.Add Feuil4.Cells(L(R), 1), U(R), , "Wiki"
 


Message édité par xenesys le 04-05-2024 à 07:45:05

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469406
Marc L
Posté le 04-05-2024 à 07:54:11  profilanswer
 

 
  Oui la feuille n'est pas spécifiée, my bad, donc ajouter avant Hyperlinks Feuil4.
 


Message édité par Marc L le 04-05-2024 à 07:55:01
n°2469407
xenesys
Posté le 04-05-2024 à 08:09:20  profilanswer
 

pas de souci.
c'est allé un peu plus loin puis blocage sur ligne 46

Code :
  1. If .Item(P).NextSibling.Cells(0).innerText > "" Or .Item(P).NextSibling.Cells.Length = 1 Then Exit Do


"erreur 438 - propriété ou methode non gérée par cet objet"


Message édité par xenesys le 04-05-2024 à 08:11:49

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469408
Marc L
Posté le 04-05-2024 à 08:50:22  profilanswer
 

 
  Cela a l'air d'être la bonne mais …
  … vraiment bizarre car la ligne de code précédente vérifie que l'élément NextSibling existe bien,
  donc la structure objet serait différente de celle de mon côté …
 
  Alors scindons cette ligne de code en deux :

Code :
  1.        If .Item(P).NextSibling.Cells.Length < 2 Then Exit Do
  2.        If .Item(P).NextSibling.Cells(0).innerText > "" Then Exit Do


 

n°2469415
xenesys
Posté le 04-05-2024 à 13:31:59  profilanswer
 

il a figé sur ce bloc avec la même erreur ""erreur 438 - propriété ou methode non gérée par cet objet" en surlignant

Code :
  1. If .Item(P).NextSibling.Cells.Length < 2 Then


Message édité par xenesys le 04-05-2024 à 13:36:44

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Divers] Importer cellules Excel vers Word/PP ou PDF, possible ?Récupérer les données d'une page web
[PowerShell]Récupérer la disposition clavier active (résolu)Ranger les données de ma db à partir d'un clique
PHP/AJAX JQuery => Comment récupérer les données en PHP ?VBA /Excel emplacements approuvés
pb de guillemets dans une recherche Google dans macro Word VBProbleme copier/coller entre Excel et Word
Plus de sujets relatifs à : Excel macro/vba récupérer données wikipedia


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR