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

 


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

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

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

Reprise du message précédent :
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 04-05-2024 à 13:31:59  profilanswer
 

n°2469416
Marc L
Posté le 04-05-2024 à 19:54:57  profilanswer
 

 
  Cela veut dire que l'élément NextSibling n'est pas un élément Row donc à fortiori n'a pas de Cells,
  heureusement de mon côté j'avais inspecté la structure DOM pour vérifier que cela marchait !
  Bon on peut s'en passer en ne bouclant pas mais une partie des données ne sera plus importée.
  Je vais recharger en mémoire ton fichier provenant d'IE - même si cela marche bien de mon côté -
  pour contourner sans NextSibling tout en récupérant la totalité des données
  - oui car parfois les données ne sont pas toutes dans un seul élément Row -
  et sinon je changerai totalement de voie en mode full text sans utiliser un DOM …
 

n°2469417
Marc L
Posté le 04-05-2024 à 22:49:31  profilanswer
 

 
  Comme la procédure attaque directement les Rows des Tables - au lieu des Tables puis les Rows par Table - ce qu'il a de bien avec NextSibling,
  enfin de mon côté, est que si on se trouve sur le dernier Row d'une Table le NextSibling est Nothing même s'il y a d'autres Rows dans la collection en cours
  donc pas de risque de mélanger les données.
  Maintenant en contournant sans NextSibling je teste le Row suivant mais il peut appartenir à une autre table;
  cependant comme il y a peu de risque la première cellule de la Table suivante soit vide …
 
  Remplacer ces deux lignes :

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


  par celle-ci :

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


  Et si un mélange arrive alors il suffira juste d'une double boucle, la première sur les Tables et la seconde sur les Rows d'une table …


Message édité par Marc L le 04-05-2024 à 22:52:27
n°2469418
xenesys
Posté le 05-05-2024 à 08:49:26  profilanswer
 

Franchement merci et Bravo. le script a fonctionné avec un "fini" comme fin ^^

 

Cependant (bah oui fallait bien encore un truc....), il y a un souci avec les dates qui ne sont plus correctement récupérées.
l'onglet 2 est l'état après le dernier test
je remets le xlsm sur free :
https://transfert.free.fr/9JFR1hR

 

aussi faut il effacer ou réactiver les

Code :
  1. ' On Error Resume Next

et

Code :
  1. ' Err.Clear

?


Message édité par xenesys le 05-05-2024 à 09:01:12

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469429
Marc L
Posté le 05-05-2024 à 12:14:17  profilanswer
 

 
  Comme dans mon classeur les dates sont bien là, je charge le dernier classeur, je lance et je constate bien un souci sur les dates
  donc je compare les codes et tiens donc, il manque une ligne mais en fait elle est remontée sur la précédente !
  Alors dans le Module4 à la fin de la ligne n°62 le Else doit se trouver seul sur la ligne suivante, et voilà, retour au code original !
 
  Pour voir directement une ligne de code déclenchant une erreur dans un module standard laisser en l'état sinon réactiver la ligne On Error …
  La ligne Err.Clear sert à masquer une erreur pour poursuivre le traitement des pages suivantes sauf aux deux endroits prévus car sensibles.
 
  Et j'ai pu affiné les dates, remplacer les trois lignes de code n°75 à 77 - après If UBound(T) > 0 Then - avec ces quatre lignes :

Code :
  1.          oReg.Pattern = "<li>.+(<a .+title=""|>.*\D)(\d{4})\D.*</li>"
  2.          Set oRmc = oReg.Execute(Split(T(1), "<h2>" )(0))
  3.           If oRmc.Count Then V(7) = oRmc(0).SubMatches(1)
  4.           If oRmc.Count > 1 Then M = oRmc(oRmc.Count - 1).SubMatches(1): If M > V(7) Then V(7) = V(7) & " - " & M


  Juste pour savoir : combien de temps est nécessaire pour terminer l'exécution de la procédure pour la cinquantaine de pages ?
  En utilisation normale, c'est pour peu de pages, utilisation occasionnelle au coup par coup
  ou bien cela peut être pour des dizaines de pages voir une bonne centaine ou plus ?


Message édité par Marc L le 05-05-2024 à 12:25:26
n°2469430
xenesys
Posté le 05-05-2024 à 14:24:08  profilanswer
 

AH désolé... j'ai surement fait le boulette du else à un moment.
A priori les dates sont OK

 


Je laisse les 2 lignes désactivées.

 

J'ai remplacé le code des lignes 75/77 : essai concluant.

 

Pour faire l'ensemble des lignes, ça a pris environ 12 secondes.
edit : je confirme : au 1er lancement : 10/12 sec. J'efface et je relance : 5 sec pour remplir à nouveau.
me connaissant, je pense que je lancerai dès que je complèterai de 1 ou 2 lignes. j'ai pas tendance à attendre d'avoir rajouté 50 lignes pour compléter.

 


edit 2 : je n'avais pas trop fait attention mais sur le titre "So I'm a Spider, So What?" le ? empêche le script de trouver la page.
Faut il modifier le script pour qu'il remplace le ? par %3F ? c'est ce qu'il y a dans le nom de page wikipedia.
écrit "So I'm a Spider, So What%3F" le script a fonctionné.
j'ai essayé de rajouter pour remplacer le ? par %3F mais je dois pas le mettre au bon endroit/comme il faut.


Message édité par xenesys le 05-05-2024 à 15:09:59

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469432
Marc L
Posté le 05-05-2024 à 17:44:51  profilanswer
 

 
  J'ai demandé car seul piloter IE est plus lent sinon un mode full text c'est à dire sans Document HTML est au moins deux fois plus rapide, voir trois …
  Mais bon pour du coup par coup mieux vaut rester ainsi. Je verrais pour les jeux vidéo si c'est applicable ou pas …
 
  Pour 'So I'm a Spider, So What?' - ou à cause - à partir de la version 2013 il y a une fonction de formule de feuille de calculs qui le gère
  mais comme l'ordinateur de tests est en version 2010 donc à l'ancienne en modifiant la formule de calculs de la ligne de code n°12 :

Code :
  1.        U = Filter(Evaluate(B & """https://fr.wikipedia.org/wiki/""&" & F & F & U & ",""?"",""%3F"" )" & H), False, False)


  Et comme ce titre déclenche des doublons de dates il faut insérer une nouvelle ligne de code avant le Else de la ligne n°63 :

Code :
  1.          If Application.Match(T(P), T, 0) - 1 < P Then T(P) = False


 

n°2469434
xenesys
Posté le 05-05-2024 à 18:04:36  profilanswer
 

je dirais bien Grande Victoire de Marc L parce que tout semble fonctionner parfaitement. [:ash ray cure]  [:micheline_tchoutchou1:1]  
je ne pensais vraiment pas qu'une macro arriverait à réussir tout cela.
 
Peut-on conclure que pour la BD le XLSM est fin prêt ?


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

 
  Merci. En fait le souci est l'inconstance des pages : oui la procédure fonctionne bien par rapport à ce que j'ai pu voir mais,
  comme pour So I'm a Spider, avec un nouveau titre cette procédure pourrait s'avérer incomplète …
 

n°2469446
xenesys
Posté le 06-05-2024 à 09:07:49  profilanswer
 

Je verrai à l'usage si de nouveaux cas particuliers apparaissent.
En tout cas, je remets à dispo la dernière version pour les BD (j'ai fait un peu de nettoyage dans les onglets mais il y a encore tous les scripts) :
https://transfert.free.fr/RqC8HmZ

 

pour le xlsm des jeux, ca marche bien comme il est donc pas besoin d'aller plus loin non ?


Message édité par xenesys le 06-05-2024 à 09:19:20

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
mood
Publicité
Posté le 06-05-2024 à 09:07:49  profilanswer
 

n°2469495
Marc L
Posté le 06-05-2024 à 21:07:46  profilanswer
 

 
  Pour les jeux, je dois regarder s'il est possible de se passer d'IE, comme pour les BD …
 
  J'ai pu tester ma démonstration originale pour les BD sur un autre ordinateur sous Windows 11 & Excel 365
  et j'ai eu le même problème avec le message final 'propriété ou méthode non géré par cet objet' …
  Même ligne de code déclenchant l'erreur à cause du NextSibling.
  En inspectant le Document généré le NextSibling ne pointe pas sur le prochain élément Row contrairement à Windows 8,
  ceci confirmant bien qu'une même source HTML peut avoir une structure objet différent selon la version d'IE / Edge / Windows,
  ce n'est donc pas spécifique à ton setup …
 
  J'en ai aussi profité pour vérifier la fonction de feuille de calculs encodant une URL, c'est URLENCODAGE,
  sous VBA nativement EncodeURL, disponible depuis la version 2013 d'Excel.
 
  Comme on ne peut se fier à NextSibling la procédure peut être dé-gazéifiée avec une boucle For Each simplifiée,
  la corrrection précédente étant juste pour voir si cela fonctionnait sans sous W11 …
  Je me suis aussi rendu compte qu'il manquait des Feuil4. notamment pour les Evaluate et comme cela n'a pas posé souci
  cela veut dire que la procédure est lancée via un bouton depuis la feuille du Catalogue mais
  en lancement manuel il faut bien s'assurer que la feuille active est la bonne !
 
  Avec ces modifications voici ma démonstration remaniée pour un module normal et la feuille active,
  j'y ai inséré en commentaire la ligne de code avec ENCODEURL et, à cause de ce site mésinterprétant un code VBA,
  le caractère ¤ de la ligne de code n°30 doit être supprimé une fois la procédure collée dans un module normal
  (les autres espaces ajoutés par erreur au sein d'une chaîne par ce site ne sont en fait pas gênant ici dans mes formules de calculs) :
 

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


 

n°2469496
xenesys
Posté le 06-05-2024 à 21:45:19  profilanswer
 

Testé : OK. Pas eu de souci.
Oui c'est avec un bouton. j'ai fait plein d'essai depuis le module puis je suis passé au bouton directement depuis la page.
 
Juste une question : j'ai pour cette page https://fr.wikipedia.org/wiki/Spy_%C3%97_Family l'info  
"(ja) Shūeisha
(fr) Kurokawa
Bandai Namco Entertainment"
 
qui est récupérée.
Sauf que le "Bandai Namco Entertainment" est pour le jeu vidéo.  
Ca me semble normal, je ne crois pas que le script filtre sur la page les blocs manga/animé/jeux ?
Et je n'ai pas trouvé d'autre cas donc pas grave.


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

 
  Il y a un autre cas retournant 'Konami' …
 
  Effectivement la recherche s'effectue sur des mots-clefs se trouvant au niveau Row,
  j'y ai déjà pensé, alors que l'information du type d'éditeur est plus haut au niveau du caption de la Table.
  Comme on dit, qui peut le plus peut le moins …
 
  Je vais y réfléchir de nouveau, se basant alors sur l'information de la colonne I,
  espérant que cela ne réduise pas les informations collectées pour d'autres pages …
 

n°2469500
xenesys
Posté le 06-05-2024 à 23:02:32  profilanswer
 

ah oui bien vu.
pas les yeux en face des trous...
 
Franchement ca peut rester comme ca, c'est vraiment pas grave surtout au risque de tout casser.


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469502
Marc L
Posté le 07-05-2024 à 07:41:56  profilanswer
 

xenesys a écrit :

Sauf que le "Bandai Namco Entertainment" est pour le jeu vidéo.  
Ca me semble normal, je ne crois pas que le script filtre sur la page les blocs manga/animé/jeux ?


  Pour filtrer sur la colonne I deux modifications :
 

  • remplacer les lignes de code n°14 & 15 par celles-ci :
Code :
  1.        X = "Auteur,Scénari,Dessin,Éditeur,Genre,Nombre d’albums,Première publication,Volumes,Date de parution,Sortie initiale"
  2.        X = Evaluate("{""" & Replace(X, ",", """,""" ) & """}&""*""" )


  • Remplacer la boucle For Each…Next des lignes 37 à 43 par ceci :
Code :
  1.    With oDoc.getElementsByTagName("TABLE" )
  2.     For P = 0 To .Length - 1
  3.      If P And Not .Item(P).Caption Is Nothing Then
  4.             T = InStr(1, .Item(P).Caption.innerText, W(R), 1)
  5.          If T And Len(.Item(P).Caption.innerText) > Len(W(R)) + 3 Then _
  6.             T = InStr(1, .Item(P).Caption.innerText, Split(Cells(L(R), 1), "_(" )(0), 1)
  7.      Else
  8.          T = 1
  9.      End If
  10.      If T Then
  11.      For Each oTR In .Item(P).Rows
  12.          If oTR.Cells(0).innerText > "" Then M = Application.Match(1, Application.Match(X, Array(oTR.Cells(0).innerText), 0), 0)
  13.          If IsNumeric(M) And oTR.Cells.Length > 1 Then C(M) = IIf(C(M) = "", "", C(M) & vbLf) & Trim(oTR.Cells(1).innerText)
  14.      Next
  15.          If P Then Exit For
  16.      End If
  17.     Next
  18.    End With


  Si des données ne sont pas collectées alors corriger la colonne I car, par exemple, Manwha n'est pas Manhwa !


Message édité par Marc L le 07-05-2024 à 07:47:01
n°2469504
xenesys
Posté le 07-05-2024 à 08:22:32  profilanswer
 

Citation :

Manwha n'est pas Manhwa

merci pour la bonne vue.... corrigé.... pas vu cette erreur depuis des jours....

 

edit : Sinon le code ne fonctionne pas : il y a juste une erreur de "next sans for" à la ligne 55.
je ne trouve pas l'origine du souci (j'ai cru avoir trouvé il y a 2 minutes mais non...)

 


Message édité par xenesys le 07-05-2024 à 08:29:11

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469505
Marc L
Posté le 07-05-2024 à 08:31:45  profilanswer
 

 
  J'ai constaté des données manquantes pour un titre donc juste en comparant la colonne I et la page Web …
 
  De mon côté cela fonctionne bien - sinon je n'aurais rien posté ni pu voir l'erreur de frappe - et le Next est sur la ligne de code n°53 !
  Repartir de la procédure DemoBDwikiReq1r originale du post plus haut puis effectuer les modifications …


Message édité par Marc L le 07-05-2024 à 08:54:02
n°2469509
xenesys
Posté le 07-05-2024 à 09:34:41  profilanswer
 

je recopie mal le code ?
voilà ce que j'ai après remplacement (j'ai gardé l'ancien bloc des 6 lignes remplacées pour illustrer)
et le script s'arrete au dernier "Next"  

Code :
  1. oDoc.body.innerHTML = oDoc.querySelector("." & Split(Split(Mid(oReq.responseText, P + 7), """" )(0))(0)).outerHTML
  2. '         For Each oTR In oDoc.getElementsByTagName("TR" )
  3. '             If oTR.Cells(0).innerText > "" Then M = Application.Match(1, Application.Match(X, Array(oTR.Cells(0).innerText), 0), 0)
  4. '          If IsNumeric(M) And oTR.Cells.Length > 1 Then
  5. '             T = Trim(oTR.Cells(1).innerText)
  6. '             If InStr(1, C(M), T, 1) = 0 Then C(M) = IIf(C(M) = "", "", C(M) & vbLf) & T
  7. '          End If
  8.         With oDoc.getElementsByTagName("TABLE" )
  9.          For P = 0 To .Length - 1
  10.           If P And Not .Item(P).Caption Is Nothing Then
  11.                  T = InStr(1, .Item(P).Caption.innerText, W(R), 1)
  12.               If T And Len(.Item(P).Caption.innerText) > Len(W(R)) + 3 Then _
  13.                  T = InStr(1, .Item(P).Caption.innerText, Split(Cells(L(R), 1), "_(" )(0), 1)
  14.           Else
  15.               T = 1
  16.           End If
  17.           If T Then
  18.           For Each oTR In .Item(P).Rows
  19.               If oTR.Cells(0).innerText > "" Then M = Application.Match(1, Application.Match(X, Array(oTR.Cells(0).innerText), 0), 0)
  20.               If IsNumeric(M) And oTR.Cells.Length > 1 Then C(M) = IIf(C(M) = "", "", C(M) & vbLf) & Trim(oTR.Cells(1).innerText)
  21.           Next
  22.               If P Then Exit For
  23.           End If
  24.          Next
  25.         End With
  26.          Next
  27.              If C(1) = "" Then C(1) = " …"


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469510
Marc L
Posté le 07-05-2024 à 09:53:16  profilanswer
 

 
  L'ancien bloc fait 7 lignes et non 6 ! La ligne n°43 originale n'a pas été remplacée donc le dernier Next après End With est de trop, à supprimer …


Message édité par Marc L le 07-05-2024 à 10:05:18
n°2469511
xenesys
Posté le 07-05-2024 à 10:06:51  profilanswer
 

j'ai compris mon erreur des lignes "37 à 43" : en sélectionnant les lignes, quand j'arrive à la selection de la ligne 42, il affiche "Li 43" d'où mon erreur...

 

sinon le code bascule directement de la ligne 39 à 97 avec en final un "objet requis" (que ce soit lancé depuis le bouton ou la page du script)
Il arrive à créer le lien hypertexte mais rien d'autre ne se passe.

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


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

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469538
Marc L
Posté le 07-05-2024 à 16:51:06  profilanswer
 

 
  Bon c'est certainement encore une différence du DOM, il faut que je puisse tester sous W11, peut-être ce soir …
 

n°2469541
Marc L
Posté le 07-05-2024 à 17:19:12  profilanswer
 

 
  Bon allez une tentative à l'aveugle, remplacer le bloc If…Else…End If des lignes de code n°39 à 45 par celles-ci :

Code :
  1.         T = 1
  2.      If P And IsObject(.Item(P).Caption) Then
  3.       If Not .Item(P).Caption Is Nothing Then
  4.             T = InStr(1, .Item(P).Caption.innerText, W(R), 1)
  5.          If T And Len(.Item(P).Caption.innerText) > Len(W(R)) + 3 Then _
  6.             T = InStr(1, .Item(P).Caption.innerText, Split(Cells(L(R), 1), " (" )(0), 1)
  7.       End If
  8.      End If


Message édité par Marc L le 07-05-2024 à 18:45:43
n°2469581
xenesys
Posté le 08-05-2024 à 09:17:56  profilanswer
 

Désolé je ne pourrai tester que vendredi soir.
merci encore pour  l'aide.


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469622
xenesys
Posté le 11-05-2024 à 10:01:52  profilanswer
 

Et bien encore une fois chapeau. :jap:  [:julian33:4]
Même à l'aveugle ca fonctionne.
j'ai regardé le tableau, comparé aussi à l'autre tableau déjà rempli et ca me semble nickel.
Il faut juste que le titre soit identique à wikipedia et tout se remplit comme il faut.


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

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469623
Marc L
Posté le 11-05-2024 à 19:08:45  profilanswer
 

 
  Merci. Depuis j'ai pu comparé les DOM entre W8 & W11 et ce fut la surprise : ils sont identiques !
  Donc un objet existant sous W8 mais non initialisé donc égal à Nothing apparaît de même sous W11
  mais n'existe pas, bonjour la nouvelle 'logique microsoftienne' ‼
  Je comprends mieux maintenant la classique complainte "j'ai un programme qui marchait bien mais plus depuis que j'ai changé de PC" … Merci Windows.
 

n°2469624
xenesys
Posté le 11-05-2024 à 19:22:49  profilanswer
 

Je comprends mieux, depuis que l'on fait ces macros, aussi tous les soucis que peuvent avoir les logiciels/jeux/etc avec toutes les différentes versions de windows, sans oublier les drivers de matériel.
Ca doit être quand même un sacré bordel à gérer pour maximiser la compatibilité avec tout le monde.


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469832
Marc L
Posté le 16-05-2024 à 09:27:26  profilanswer
 

 
  De retour pour les jeux vidéos : pour me motiver serait-il possible de grouper les colonnes à télécharger ?
  Peu importe où se situe la première colonne à télécharger mais les autres doivent la coller sans décalage aucun (ex : C,D,E,F et pas C,D,F,G) …
 

n°2469845
xenesys
Posté le 16-05-2024 à 19:53:20  profilanswer
 

Aucun problème à modifier la mise en page du tableau si ça peut faciliter la tache.
Ca a bien marché sur l'autre et ça ne dérange pas plus que ça d'avoir déplacé les colonnes


Message édité par xenesys le 16-05-2024 à 19:54:12

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2469898
Marc L
Posté le 17-05-2024 à 10:24:45  profilanswer
 

 
  Bien. Merci de mettre un lien sur le fichier réorganisé et de m'indiquer la tranche de colonnes histoire de ne pas en oublier une …
 

n°2470011
xenesys
Posté le 17-05-2024 à 18:08:59  profilanswer
 

j'imagine que les colonnes du script seront celles du "Développeur" "Éditeur" "Genre" "année" "plateforme" ?
Je doute pour "Saga" vu que d'une page à l'autre ca n'est pas affiché pareil et que j'avais commencé à déjà organiser cette colonne.
si c'est pas bon me le dire que je corrige.
https://transfert.free.fr/P2LyWgu


Message édité par xenesys le 17-05-2024 à 18:35:34

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2470032
Marc L
Posté le 18-05-2024 à 06:31:14  profilanswer
 

 
  Non pour 'Plate-forme' car elle doit être pré-remplie car elle peut conditionner le téléchargement sur certaines pages Wiki de jeux
  alors la colonne 'Y' - en fait 'Date de sortie' côté pages Wiki ? - doit être inversée avec la 'Plate-forme'
  ainsi ce sont les colonnes de F à I à télécharger.
 
        En option pour 'Saga' :
 

  • il me faudrait déjà une liste de jeux représentative des différents cas possibles.
  • Si c'est possible de la télécharger alors il faudra la déplacer pour qu'elle soit consécutive aux autres …


  Autre point : les liens hypertexte de la colonne A ne fonctionnent pas, je crois bien que c'était pour les photos :
                      ne pas modifier cette colonne ou bien comme pour les BD y lier les pages Wiki des jeux ?


Message édité par Marc L le 18-05-2024 à 07:06:58
n°2470037
xenesys
Posté le 18-05-2024 à 12:18:47  profilanswer
 

Pour plateforme j'ai fait une liste pour éviter les mauvaises écritures (faut juste valider la bonne orthographe vs wikipedia)

 

J'ai ajouté une colonne "cover" pour décaler les pochettes.
Donc la 1ère colonne des titres peut récupérer les liens hypertextes wiki.

 

Le "y" est pour "Year" donc oui juste l'année de sortie.

 

Pour Saga laisse tomber c'est vraiment pas grave.

 


j'espere n'avoir rien oublié
https://transfert.free.fr/MNWNdpD


Message édité par xenesys le 18-05-2024 à 12:19:17

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2470040
Marc L
Posté le 18-05-2024 à 17:05:46  profilanswer
 

 
  Merci, on part sur cette base avec les colonnes G à J.
  Je vais y aller doucement, déjà en vérifiant / essayant de comprendre ce qu'il s'est passé la première fois en étudiant les pages Wiki des jeux,
  voir si c'est possible d'éviter IE etc …Pour 'saga' une galère de moins !


Message édité par Marc L le 18-05-2024 à 17:08:48
n°2470041
Marc L
Posté le 18-05-2024 à 17:56:04  profilanswer
 

 
  Constat du jour : il n'y a pas que des infobox_v3 mais aussi un infobox_v2, Sherman M4,
  la procédure des BD pouvant s'avérer utile …
 

n°2470042
Marc L
Posté le 18-05-2024 à 18:10:42  profilanswer
 

 
  Correction : ce n'est pas un jeu mais la fiche officielle du tank ! Donc vérifier uniquement si infobox_v3 …
 

n°2470044
xenesys
Posté le 18-05-2024 à 19:38:45  profilanswer
 

Oui sherman M4 n'a pas de page wikipedia
page de l'éditeur : https://fr.wikipedia.org/wiki/Loriciel
J'avais pas relancé la procédure de infobox pour vérifier tous les jeux que j'avais rajouté mais c'est bien le seul dans ce cas.


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

 
  Pour certains jeux Nintendo pour récupérer la bonne année la plate-forme correcte est nécessaire, à savoir 'Wii U' au lieu de 'WiiU' …
 

n°2470072
xenesys
Posté le 19-05-2024 à 17:08:49  profilanswer
 

J'ai corrigé le "Wii U"
J'ai pensé alors pour les jeux PC / Windows, ca ne pose pas souci entre les "Windows", "PC" et "Microsoft Windows" ??


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

 
  Le code testera 'Windows' & 'DOS' quand la plate-forme 'PC' n'est pas trouvée …
 

n°2470092
xenesys
Posté le 20-05-2024 à 13:28:32  profilanswer
 

OK Merci.
J'ai complété la liste des plateformes correspondant à ce qui existe sur wikipedia
 


Amiga
Amstrad CPC
Apple II
Atari 2600
Atari ST
Commodore 64
Dreamcast
Game Boy
Game Boy Color
Game Gear
Gamecube
GX-4000
Mac OS X
Master System
Mega Drive
MSX
NES
Nintendo 3DS
Nintendo 64
Nintendo DS
PC
PlayStation
PlayStation 2
PlayStation 3
PlayStation 4
PlayStation 5
Saturn
Super Nintendo
Switch
Wii
Wii U
Windows
X68000
Xbox One
ZX Spectrum



---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2470313
Marc L
Posté le 23-05-2024 à 19:28:59  profilanswer
 

 
  Sur le coup je ne voyais pas trop à quoi cela pouvait me servir mais depuis cela m'a donné une idée :
  je vais me servir de cette liste pour nettoyer les colonnes Développeur et Editeur par différenciation avec la plate-forme renseignée
  donc il faudra la compléter, à suivre …
 
  Il me reste encore un tiers des tests à effectuer.
 

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4

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