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

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Excel macro/vba récupérer données wikipedia (voir p.4)

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Page Précédente
Auteur Sujet :

Excel macro/vba récupérer données wikipedia (voir p.4)

n°2467524
xenesys
Posté le 08-04-2024 à 21:57:38  profilanswer
 

Bonjour à tous
 
Je recherche de l'aide pour excel/macro/vba
 
j'ai voulu me faire un fichier excel pour lister les jeux vidéos auxquels j'ai joués et pour essayer de récupérer certaines infos depuis leur page wikipedia, j'ai commencé à me torturer en faisant une macro avec l'aide de copilot.
Globalement je m'en sors pas trop mal sachant que je n'y connais pas grand chose mais sur la dernière ligne droite je bug.
 
En fait ce sont plusieurs macros de copilot que j'ai modifié au fil des essais.
plusieurs points sont pas encore bons et je galère :  
 
(1) D'un jeu à l'autre la donnee "Genre" n'est pas au même endroit sur la page wikipedia. Donc la donnée récupérée n'est pas bonne/tronquée/etc. Et làje sèche complètement.  
J'ai modifié les offset pour tomber pile dessus pour un jeu mais je sais que c'est foireux....
Même avec Copilot j'arrive pas à trouver une solution pour toujours tomber sur le bon emplacement. Si ce souci est résolu ca voudrait dire que n'importe quelle donnée pourrait être trouvée pour remplir le tableau Excel ?  
 
(2) Le "cellule.Offset(0, 8).Value = Genre" ne fonctionne pas. Il ne va pas remplir la colonne que j'ai choisi pour mettre cette donnée et je n'ai pas trouvé de solution. >>> Trouvé !!  :pt1cable:  
 
(3) le script plante en fonction des jeux sélectionnés....
 
en gros j'ai réussi à faire ca :  
 
Merci pour qui pourra m'aider.  :jap:  
 
*******************************

Code :
  1. 'test new
  2. Sub ExempleExtractionGenre()
  3.     On Error GoTo ExempleErreur
  4.     Dim MonLienURL As String
  5.     Dim CodeHTML As String
  6.     Dim recherche As String
  7.     Dim url As String
  8.    
  9.     ' Récupérer la valeur de la cellule sélectionnée
  10.     recherche = ActiveCell.Value
  11.    
  12.     ' Remplacer les espaces par des underscore dans la recherche
  13.     recherche = Replace(recherche, " ", "_" )
  14.    
  15.     ' Construire l'URL de recherche sur Wikipedia
  16.     url = "https://fr.wikipedia.org/wiki/" & recherche
  17.        
  18.      CodeHTML = ExtraireSourceHTML(url)
  19.     ' Recherche du genre dans le code HTML
  20.     Dim PositionGenre As Long
  21.     PositionGenre = InStr(1, CodeHTML, "Genre" )
  22.     If PositionGenre > 0 Then
  23.         Dim FinGenre As Long
  24.         FinGenre = InStr(PositionGenre, CodeHTML, "<" )
  25.         Dim Genre As String
  26.         Genre = Mid(CodeHTML, PositionGenre + 159, FinGenre - PositionGenre - 42)  >> (1)
  27.         MsgBox "Genre du jeu : " & Genre
  28.     Else
  29.         MsgBox "Genre non trouvé."
  30.     End If
  31.         ActiveCell.Offset(0, 8).Value = genre  >> (2)
  32.    
  33.     Exit Sub
  34. ExempleErreur:
  35.     MsgBox "Une erreur est survenue..."
  36. End Sub


 
****

Code :
  1. Public Function ExtraireSourceHTML(LienURL As String) As String
  2.     On Error GoTo ExtraireSourceHTMLErreur
  3.     With CreateObject("MSXML2.XMLHTTP" )
  4.         .Open "GET", LienURL, False
  5.         .send
  6.         If .readyState = 4 Then
  7.             If .Status <> 200 Then
  8.                 ExtraireSourceHTML = CVErr(xlErrNA)
  9.             Else
  10.                 ExtraireSourceHTML = .responseText
  11.             End If
  12.         Else
  13.             ExtraireSourceHTML = CVErr(xlErrNA)
  14.         End If
  15.     End With
  16.     Exit Function
  17. ExtraireSourceHTMLErreur:
  18.     ExtraireSourceHTML = CVErr(xlErrNA)
  19. End Function


Message édité par xenesys le 15-08-2024 à 18:28:25

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

n°2467571
rufo
Pas me confondre avec Lycos!
Posté le 09-04-2024 à 23:06:32  profilanswer
 

Mediawiki a une API. Regarde si tu peux pas l'utiliser. Après, le VBA, c'est pas franchement le langage le plus approprié pour faire ce genre de traitement :/
Du Python ou PHP serait sans doute mieux.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2467611
xenesys
Posté le 10-04-2024 à 11:24:57  profilanswer
 

Merci pour la réponse.
Copilot m'avait sorti un script avec l'appel d'un API mais ça ne marchait pas vraiment et j'ai pas su adapter/corriger le script.
Je testerai à nouveau.  
 
Pour python/php faut que je regarde si je peux me débrouiller sachant que je ne connais rien en codage.


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2467661
xenesys
Posté le 10-04-2024 à 21:44:35  profilanswer
 

Voilà j'ai retenté avec l'API mais visiblement ca marche pas à l'extraction.  
je suis allé fouiller sur le site de l'api de wikimedia mais j'avoue que je suis perdu.
https://www.mediawiki.org/wiki/Exte [...] xtracts/fr
https://www.mediawiki.org/wiki/API:Query/fr
 
je vais continuer à regarder de ce coté.
 
 
****************
 

Code :
  1. Sub GetWikipediaData()
  2.     Dim objHTTP As Object
  3.     Dim strURL As String
  4.     Dim strResponse As String
  5.     Dim strPageName As String
  6.     Dim strGenre As String
  7.     Dim startGenre As Integer
  8.     Dim endGenre As Integer
  9.     ' Utiliser le contenu de la cellule A1 comme titre du jeu vidéo
  10.     strPageName = Sheets("Catalogue Games" ).Range("A5" ).Value
  11.     'verif nom du jeu
  12.     MsgBox "le jeu est : " & strPageName
  13.        ' Construire l'URL de la page Wikipedia
  14.     strURL = "https://fr.wikipedia.org/w/api.php?format=xml&action=query&prop=extracts&explaintext=&titles=" & strPageName
  15.     ' Créer un nouvel objet HTTP
  16.     Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP" )
  17.     ' Envoyer une requête HTTP GET à l'URL
  18.     objHTTP.Open "GET", strURL, False
  19.     objHTTP.send
  20.     ' Récupérer la réponse
  21.     strResponse = objHTTP.responseText
  22.     ' Rechercher le genre dans la réponse
  23.     startGenre = InStr(strResponse, "Genre" )
  24.     endGenre = InStr(startGenre, vbCrLf)
  25.     ' Extraire le genre
  26.     strGenre = Mid(strResponse, startGenre + 11, endGenre - startGenre - 11) >>>> ICI ca plante
  27.     ' Écrire le genre dans la cellule B1
  28.     Sheets("Catalogue Games" ).Range("I5" ).Value = strGenre
  29.     ' Nettoyer
  30.     Set objHTTP = Nothing
  31. End Sub


Message édité par xenesys le 26-04-2024 à 19:18:10

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2467770
Marc L
Posté le 11-04-2024 à 18:53:21  profilanswer
 

Bonjour !
 
Sans peut-être passer par l'API, il manque au moins deux liens pour deux jeux et pour chacun l'exact résultat escompté
ou encore mieux un lien DropBox - ou autre hébergeur de fichiers - sur un classeur Excel avec tout le nécessaire
à savoir source des pages Web et résultats attendus …


Message édité par Marc L le 11-04-2024 à 18:54:57
n°2467848
xenesys
Posté le 12-04-2024 à 17:50:34  profilanswer
 

Bonjour
pour des jeux j'ai testé :
https://fr.wikipedia.org/wiki/Princess_Peach:_Showtime! (avec lui que le offset a fonctionné pas avec les autres - normal)
donnée à récupérer :   Action-aventure

 

https://fr.wikipedia.org/wiki/Horizon_Forbidden_West
donnée à récupérer :  Action-RPG, aventure

 

et à mettre dans la case "catégorie"

 

j'ai mis une partie de mon xlsm ici :
y a toutes les tentatives de scripts avec
https://1fichier.com/?b52ql9ht82ux8djr7000

 

Au final j'avais espérer compléter mon tableau avec le script : Développeur , Éditeur et Genre.
pour le moment je le fais à la main.


Message édité par xenesys le 12-04-2024 à 17:55:08

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468384
Marc L
Posté le 19-04-2024 à 09:39:18  profilanswer
 

 
  Bonjour, merci pour les liens.
 
  En effectuant une requête directe cela a bien fonctionné pour Horizon et Princess, pour Elder Scroll il a fallu ruser mais pas moyen pour les deux restants,
  même en essayant de louvoyer avec les titres "Catégorie" etc et comme le code HTML source de ces pages non normalisées ne contient pas "Genre" …
 
  Par contre en pilotant Internet Explorer c'est l'enfance de l'art !
  J'hésitais entre différentes méthodes, j'ai finalement opté pour celle du gamin débutant en VBA vers qui j'ai adressé cet exercice de simple logique
  ayant résolu simplement ce mini challenge : « si la première cellule d'une table HTML est égale à "Genre" alors l'info est dans la seconde cellule. »
  Très simple, suffit-il encore de juste prendre deux minutes pour bien observer comment fonctionne la page Web, d'inspecter les éléments …
 
          Démonstration VBA / Windows à coller uniquement dans le module de la feuille Feuil1 (Catalogue Games)
          ne nécessitant pas l'activation de référence spécifique, remplissant juste les vides de la colonne H :

Code :
  1. Sub DemoIE1()
  2.        Const F = "TRANSPOSE(IF(H2:H#=0,IF(A2:A#>0,ROW(H2:H#))))"
  3.        Dim R, oTable As Object
  4.        Application.Cursor = xlWait
  5.        On Error GoTo Fin
  6.   With CreateObject("InternetExplorer.Application" )
  7.       .Visible = False
  8.    For Each R In Filter(Evaluate(Replace(F, "#", [A1].CurrentRegion.Rows.Count)), False, False)
  9.       .navigate "https://fr.wikipedia.org/wiki/" & Cells(R, 1)
  10.        While .Busy Or .readyState < 4:  DoEvents:  Wend
  11.    For Each oTable In .document.getElementsByTagName("TABLE" )
  12.        If oTable.Cells(0).innerText = "Genre" Then Cells(R, 8) = oTable.Cells(1).innerText: Exit For
  13.    Next
  14.        If IsEmpty(Cells(R, 8)) Then Cells(R, 8) = "                                      ¤"
  15.    Next
  16. Fin:
  17.        If Err.Number <> -2147023706 Then .Quit
  18.   End With
  19.        Application.Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
  20.        Application.Cursor = xlDefault
  21.        Set oTable = Nothing
  22. End Sub


n°2468397
xenesys
Posté le 19-04-2024 à 18:14:49  profilanswer
 

Franchement merci beaucoup.  [:acachou:10]
Je vais tester tout cela. Depuis l'autre jour, j'ai tenté des choses mais rien de mieux.
J'avais pas du tout pensé à demander à copilot de prendre la donnée de la case à coté de "genre". Vu que c'est sous forme de tableau j'aurais dû y penser.


Message édité par xenesys le 19-04-2024 à 18:15:31

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

 
  Oubliez 'Copilot', d'abord il faut juste vérifier le contenu du code HTML source pour voir si une simple requête peut être appliquée
  et comme ici la donnée ciblée n'existe pas dans la source alors se tourner vers d'autres voies comme les fonctions Web d'Excel
  - ne font pas toujours l'affaire - ou Power Query par exemple …
  Une autre méthode est d'utiliser les fonctions VBA texte pour extraire la donnée ciblée du code HTML une fois la page complètement chargée,
  c'est un peu plus compliqué à coder que de scanner le contenu des tables.
  Et pour alimenter des colonnes contigües - F, G & H - d'une feuille de calculs une simple variation lisant les tables HTML peut être mise en œuvre.


Message édité par Marc L le 19-04-2024 à 19:44:30
n°2468406
xenesys
Posté le 20-04-2024 à 07:19:27  profilanswer
 

je m'aide de copilot parce que je ne savais pas comment aborder la chose et j'y connais trop peu en programmation pour être à l'aise...
j'ai décomposé mes demandes et je les ai empilées au fil des tests. (recherche de la case / recherche sur wikipedia / etc).
Mais il restait la partie pour vraiment toujours tomber sur le "genre" où je n'arrive pas à trouver la bonne solution.

 

en tout cas j'ai à peu près compris comment procède votre script mais j'aurais été incapable de le créer.

 

Sinon conclusions de mes essais : ca marche bien. La petite voix m'a surpris la 1ère fois.  :lol:
même si certaines pages reviennent bredouille alors qu'il y a bien la même structure de page.
j'ai utilisé l'inspecteur de firefox pour voir pour comparer 2 pages mais j'ai pas compris pourquoi l'une renvoie bien la donnée et pas l'autre.

 

Pour d'autres je sais que cela ne marchera pas car le titre de la case ne renvoie pas correctement vers la bonne page wikipédia.

 

je vais regarder comment ca marche pour les "fonctions VBA texte" si je peux en faire quelque chose.

 

en tout cas merci beaucoup.


Message édité par xenesys le 20-04-2024 à 08:39:09

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

n°2468407
xenesys
Posté le 20-04-2024 à 08:03:26  profilanswer
 

en expliquant à copilot qu'il y avait certaines cases non remplies il a compris la présence des infobox, a fait évoluer le code.
Des cases sont toujours vides mais d'autres ont été remplies maintenant.
 
 

Code :
  1. 'essai v4/copilot/infoboxwikipedia
  2. Sub DemoIE4()
  3.     Const F = "TRANSPOSE(IF(H2:H#=0,IF(A2:A#>0,ROW(H2:H#))))"
  4.     Dim R, oTable As Object, oCell As Object, oDiv As Object
  5.     Dim found As Boolean
  6.     Application.Cursor = xlWait
  7.     On Error GoTo Fin
  8.     With CreateObject("InternetExplorer.Application" )
  9.         .Visible = False
  10.         For Each R In Filter(Evaluate(Replace(F, "#", [A1].CurrentRegion.Rows.Count)), False, False)
  11.             .navigate "https://fr.wikipedia.org/wiki/" & Cells(R, 1)
  12.             While .Busy Or .readyState < 4:  DoEvents:  Wend
  13.             found = False
  14.             ' Check tables
  15.             For Each oTable In .document.getElementsByTagName("TABLE" )
  16.                 For Each oCell In oTable.Cells
  17.                     If oCell.innerText = "Genre" Then
  18.                         Cells(R, 9) = oCell.NextSibling.innerText
  19.                         found = True
  20.                         Exit For
  21.                     End If
  22.                 Next
  23.                 If found Then Exit For
  24.             Next
  25.             ' Check infoboxes
  26.             If Not found Then
  27.                 For Each oDiv In .document.getElementsByClassName("infobox_v2" )
  28.                     For Each oCell In oDiv.getElementsByTagName("TD" )
  29.                         If oCell.innerText = "Genre" Then
  30.                             Cells(R, 9) = oCell.NextSibling.innerText
  31.                             found = True
  32.                             Exit For
  33.                         End If
  34.                     Next
  35.                     If found Then Exit For
  36.                 Next
  37.             End If
  38.             If Not found Then Cells(R, 9) = " ¤¤ "
  39.         Next
  40. Fin:
  41.         If Err.Number <> -2147023706 Then .Quit
  42.     End With
  43.     Application.Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
  44.     Application.Cursor = xlDefault
  45.     Set oTable = Nothing
  46. End Sub


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

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

 

  • Il ne faut pas boucler sur toutes les cellules d'une table mais sur toutes ses lignes afin de tester uniquement la première cellule de chaque ligne …


  • Encore une fois Copilot serait toujours et encore à l'Ouest ou mieux aware à la JCD car dans tes liens de jeux "infobox_v2" n'existe pas !

        Comme pour "Genre" dans le code source primaire.
        Sinon merci d'indiquer quelles pages de jeux sont concernées …
 
 
    Questions :
 
1) A part la colonne H, quelles sont les colonnes à remplir ?
    Et si elles sont contigües le code en serait simplifié.
 
2) Quel est le critère pour traiter ou pas une ligne ? (Pour éviter de perdre du temps pour ce qui a déjà été fait …)
    Par exemple le critère de ma démonstration est les cellules vides de la colonne H.

Message cité 1 fois
Message édité par Marc L le 20-04-2024 à 08:43:10
n°2468409
xenesys
Posté le 20-04-2024 à 09:51:31  profilanswer
 

avant de répondre aux questions, j'ai constaté une erreur de ma part..... dans la semaine j'avais rajouté une colonne.... donc ce n'est plus H mais I et pas vu qu'il fallait corriger cela.
Donc je suis reparti des 1ers scripts.
Entre temps j'ai corrigé un certain nombre de titres de jeux donc ca a mieux fonctionné (j'ai gardé de coté les anciennes colonnes remplies par les scripts pour comparer)
 
La v2 a déjà mieux rempli même s'il en manquait.
La v3 + copilot a fonctionné parfaitement. Aucune case vide. Au mieux j'ai ¤¤¤ dans la case (nom du jeu pas conforme avec wikipedia - je corrigerai à la main).
 
1) Pour le genre juste une colonne (la " I " maintenant)
2) j'avoue ne pas bien comprendre.... :??:  >> je pense avoir mieux compris : vérifier la colonne à remplir suffit je pense. je vois pas autre chose pour éviter de perdre du temps.
 
Je vais essayer d'adapter pour les éditeurs/Développeur/autre.  
Finalement votre script était quasi parfait dès le début.
 
-----

Code :
  1. 'essai v2
  2.     Sub DemoIE2()
  3.             Const F = "TRANSPOSE(IF(I2:I#=0,IF(A2:A#>0,ROW(I2:I#))))"
  4.             Dim R, oTable As Object
  5.             Application.Cursor = xlWait
  6.             On Error GoTo Fin
  7.        With CreateObject("InternetExplorer.Application" )
  8.            .Visible = False
  9.         For Each R In Filter(Evaluate(Replace(F, "#", [A1].CurrentRegion.Rows.Count)), False, False)
  10.            .navigate "https://fr.wikipedia.org/wiki/" & Cells(R, 1)
  11.             While .Busy Or .readyState < 4:  DoEvents:  Wend
  12.         For Each oTable In .document.getElementsByTagName("TABLE" )
  13.             If oTable.Cells(0).innerText = "Genre" Then Cells(R, 9) = oTable.Cells(1).innerText: Exit For
  14.         Next
  15.             If IsEmpty(Cells(R, 9)) Then Cells(R, 9) = " ¤¤ "
  16.         Next
  17. Fin:
  18.             If Err.Number <> -2147023706 Then .Quit
  19.        End With
  20.             Application.Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
  21.             Application.Cursor = xlDefault
  22.             Set oTable = Nothing
  23.     End Sub


--------------
 
 
 

Code :
  1. 'essai v3 + copilot
  2. Sub DemoIE3()
  3.     Const F = "TRANSPOSE(IF(I2:I#=0,IF(A2:A#>0,ROW(I2:I#))))"
  4.     Dim R, oTable As Object, oCell As Object
  5.     Dim found As Boolean
  6.     Application.Cursor = xlWait
  7.     On Error GoTo Fin
  8.     With CreateObject("InternetExplorer.Application" )
  9.         .Visible = False
  10.         For Each R In Filter(Evaluate(Replace(F, "#", [A1].CurrentRegion.Rows.Count)), False, False)
  11.             .navigate "https://fr.wikipedia.org/wiki/" & Cells(R, 1)
  12.             While .Busy Or .readyState < 4:  DoEvents:  Wend
  13.             found = False
  14.             For Each oTable In .document.getElementsByTagName("TABLE" )
  15.                 For Each oCell In oTable.Cells
  16.                     If oCell.innerText = "Genre" Then
  17.                         Cells(R, 9) = oCell.NextSibling.innerText
  18.                         found = True
  19.                         Exit For
  20.                     End If
  21.                 Next
  22.                 If found Then Exit For
  23.             Next
  24.             If Not found Then Cells(R, 9) = " ¤¤¤ "
  25.         Next
  26. Fin:
  27.         If Err.Number <> -2147023706 Then .Quit
  28.     End With
  29.     Application.Speech.Speak IIf(Err.Number, Err.Description, "Fini" ), True
  30.     Application.Cursor = xlDefault
  31.     Set oTable = Nothing
  32. End Sub


Message édité par xenesys le 26-04-2024 à 19:18:51

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468416
xenesys
Posté le 20-04-2024 à 17:48:58  profilanswer
 

suite à essais au final tout fonctionne.
Genre, Développeur, Éditeur.
J'ai juste changé ici "If oCell.innerText = "Genre" Then" et si le titre est conforme à Wikipédia la donnée est bien récupérée.
j'adapte la valeur de la colonne ici "Cells(R, 9)" pour la donnée souhaitée.

 

Merci pour l'aide. Sans votre script j'y serai pas arrivé.
Copilot a quand même eu son utilité et ca m'a permis de découvrir son usage. ^^


Message édité par xenesys le 21-04-2024 à 07:21:24

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

Marc L a écrit :

Il ne faut pas boucler sur toutes les cellules d'une table mais sur toutes ses lignes afin de tester uniquement la première cellule de chaque ligne …


  Ma démonstration revisitée où que soit la colonne 'Catégorie' et au cas où 'Genre' ne se trouve pas toujours dans la première ligne d'une table HTML
  et, par sécurité, à placer directement dans le module de la feuille au lieu d'un module standard :

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

n°2468434
xenesys
Posté le 21-04-2024 à 09:22:54  profilanswer
 

Merci pour cette "ultime" version.
j'ai testé pour les éditeurs/dev/genre : Ca marche nickel aussi.

 

je vais voir si je peux récupérer d'autres infos avec ce même script ^^


Message édité par xenesys le 21-04-2024 à 09:41:03

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468446
Marc L
Posté le 21-04-2024 à 17:12:25  profilanswer
 

 
  Il me faudrait la liste des infos à récupérer avec leurs colonnes associées surtout quand 'Genre' devient 'Catégorie' dans Excel par exemple …
  Ou encore un nouveau lien sur le fichier actuel avec un peu plus de jeux "référence" ayant des paginations différentes.
 
  Afin de simplifier le code, d'éviter une usine à gaz de If en cascade, l'idéal pour les colonnes dont les infos se trouvent dans des tables HTML est
  qu'elles soient contigües comme par exemple dans le classeur original 'Développeur Éditeur Catégorie' dans les colonnes F:H …
  Dans ce cas quel que soit le nombre de colonnes contigües cela demande juste deux lignes de code dont un seul If.
 
  Et encore plus idéal pour simplifier le code de ces colonnes contigües dont la source se trouve dans une table HTML est
  leurs entêtes dans la feuille de calculs correspondant exactement aux pages web comme 'Genre' et non pas 'Catégorie' …


Message édité par Marc L le 21-04-2024 à 17:14:18
n°2468449
xenesys
Posté le 21-04-2024 à 18:10:25  profilanswer
 

Merci pour l'aide mais je vais en rester à ces colonnes.
En regardant les pages des jeux, je vois pas trop d'utilité d'en rajouter plus.
Je suis déjà bien content du résultat et de l'expérience ^^

 

j'avais déjà changé "Catégorie" pour "Genre" pour qu'ils soient tous identiques à Wikipédia.


Message édité par xenesys le 21-04-2024 à 18:10:46

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468450
Marc L
Posté le 21-04-2024 à 18:21:41  profilanswer
 

 
  Bien. A noter dans le cas de colonnes contigües - peu importe leur nombre - une procédure VBA optimisée ne demande pas plus de 30 lignes de code …


Message édité par Marc L le 21-04-2024 à 18:22:22
n°2468451
xenesys
Posté le 21-04-2024 à 18:48:58  profilanswer
 

Juste une dernière chose : j'ai mis des images pour illustrer certains jeux dans un commentaire.
Une idée s'il y a mieux/plus simple pour cela ?
j'ai trouvé cette idée car quand on passe la souris dessus on a l'image mais il faut tout faire à la main.


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468453
Marc L
Posté le 21-04-2024 à 19:36:16  profilanswer
 

 
  Cela doit être possible : juste avant de le faire à la main, activer l'Enregistreur de macros puis opérer manuellement
  puis désactiver l'Enregistreur puis voir la procédure VBA ainsi générée qui doit être optimisée ensuite …

n°2468455
Marc L
Posté le 21-04-2024 à 19:42:09  profilanswer
 

 
  Une autre idée : au lieu d'augmenter significativement la taille du classeur en incluant des images
  juste incorporer un lien hypertexte de l'URL - ou du fichier si stocké localement - de l'image dans la cellule du nom du jeu …

n°2468477
xenesys
Posté le 22-04-2024 à 08:02:55  profilanswer
 

merci pour l'aide. je vais tenter cela. :)


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468480
xenesys
Posté le 22-04-2024 à 08:43:44  profilanswer
 

en fouillant je suis tombé sur une solution :
https://excel-downloads.com/threads [...] .20051402/
reste à créer tous les liens mais au moins le xls ne sera pas alourdi par les photos.

 

edit : juste a savoir si un lien peut fonctionner si la place en local des photos est déplacée
en gros c:\catalogue\jeux.xlsm et le lien "...\images\jeux1.jpg" au lieu de "c:\catalogue\images\jeux1.jpg"

 


edit 2 : j'ai quand même essayé de récupérer les dates des sorties mais il y a tellement variations sur wikipedia que ca va devenir une usine pour filtrer. donc je vais rester à la main.


Message édité par xenesys le 22-04-2024 à 09:37:52

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468536
Marc L
Posté le 22-04-2024 à 12:35:07  profilanswer
 

 
  Avec le peu d'information et les rares jeux dans le classeur exemple aucun souci pour récupérer 'Date de sortie' …
 

n°2468568
xenesys
Posté le 23-04-2024 à 08:17:01  profilanswer
 

pour l'année de sortie, voici plusieurs exemples avec un affichage différent :
https://fr.wikipedia.org/wiki/Horizon_Forbidden_West
https://fr.wikipedia.org/wiki/Subnautica:_Below_Zero
https://fr.wikipedia.org/wiki/Immortals_Fenyx_Rising
https://fr.wikipedia.org/wiki/Doom_Eternal
https://fr.wikipedia.org/wiki/Age_of_Mythology

 

il y a entre les dates les éléments  "PC, PlayStation 4, PlayStation 5,  Nintendo Switch, MacOS", les zones géographiques, qui peuvent trainer au milieu de tout ca, être séparés.
Donc j'imagine qu'il faut filtrer la plateforme du fichier excel pour ensuite aller récupérer la bonne plateforme sur Wikipédia.
Et "Subnautica:_Below_Zero" est encore différent puisqu'il est donné aussi la date "accès anticipé".
Bref c'est pas grave du tout sachant que c'est juste l'année qui m'intéresse.


Message édité par xenesys le 23-04-2024 à 08:36:12

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468617
Marc L
Posté le 23-04-2024 à 16:13:12  profilanswer
 

 
  Je peux charger facilement la première année trouvée mais pour la plateforme faut-elle encore que celle du classeur corresponde à celle de la page !
  Par exemple 'PC' dans le classeur pour Horizon Forbidden West n'existe pas dans sa page source Wiki … (idem pour Half Life 3)
 
  Autre point, 'Copilot' et son 'infobox_v2' :
  en cherchant parmi quatre méthodes pour charger la date laquelle serait la plus appropriée je suis tombé sur 'infobox_v3' : erreur de frappe ?
  Si oui alors je suis d'accord, si toutes les données à télécharger se trouvent uniquement dans cet élément
  alors il vaut mieux limiter les recherches à ses tables au lieu de la page entière, l'exécution en sera un iota plus rapide.
  Si non, j'aimerais des liens de pages où cet 'infobox_v2' apparaît …


Message édité par Marc L le 23-04-2024 à 17:42:12
n°2468633
xenesys
Posté le 23-04-2024 à 17:46:09  profilanswer
 

j'avoue ne pas avoir testé plus que ca le script "essai v4/copilot/infoboxwikipedia" avec la infobox v2. je viens de tester en corrigeant pour v3 et ca semble fonctionner aussi.
c'est copilot qui a sorti le "v2". j'ai pas su dire s'il avait juste ou faux.
pour l' infobox il y a visiblement déjà eu 4 versions >> https://fr.wikipedia.org/wiki/Mod%C [...] vid%C3%A9o (en bas de page "archive" )
 
Pour la date, d'une fiche à l'autre parfois il y a PC, windows bref c'est pas toujours hyper carré. J'ai eu pareil pour les genres qui  ne sont pas nommés exactement pareils sur chaque fiche.
j'ai même fait un script pour nettoyer un peu tout ca (et c'est incomplet je pense):
 

Code :
  1. Sub remplacetexte()
  2. '
  3. ' remplacetexte
  4. 'STR : Stratégie en temps réel / Stratégie temps réel
  5. 'FPS : Tir à la première personne / Jeu de tir à la première personne
  6. 'TPS : Tir à la troisième personne / jeu de tir à la troisième personne /  Tir 3e personne
  7. 'RPG : Jeu de rôle
  8.  
  9.     Set myActiveCell = ActiveCell
  10.    
  11.     Range("Tableau1[Genre]" ).Select
  12.     Selection.Replace What:="Stratégie en temps réel", Replacement:="STR", _
  13.         LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
  14.         False, ReplaceFormat:=False
  15.     ActiveWindow.SmallScroll Down:=16
  16.     Selection.Replace What:="Stratégie temps réel", Replacement:="STR", LookAt _
  17.         :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  18.         ReplaceFormat:=False
  19.     ActiveWindow.SmallScroll Down:=16
  20.     Selection.Replace What:="Jeu de tir à la première personne", Replacement:="FPS", LookAt _
  21.         :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  22.         ReplaceFormat:=False
  23.     ActiveWindow.SmallScroll Down:=16
  24.     Selection.Replace What:="Tir à la première personne", Replacement:="FPS", LookAt _
  25.         :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  26.         ReplaceFormat:=False
  27.    ActiveWindow.SmallScroll Down:=16
  28.     Selection.Replace What:="jeu de tir à la troisième personne", Replacement:="TPS", LookAt _
  29.         :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  30.         ReplaceFormat:=False
  31.    ActiveWindow.SmallScroll Down:=16
  32.     Selection.Replace What:="Tir à la troisième personne", Replacement:="TPS", LookAt _
  33.         :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  34.         ReplaceFormat:=False
  35.    ActiveWindow.SmallScroll Down:=16
  36.     Selection.Replace What:="Tir 3e personne", Replacement:="TPS", LookAt _
  37.         :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  38.         ReplaceFormat:=False
  39.    ActiveWindow.SmallScroll Down:=16
  40.     Selection.Replace What:="Jeu de rôle", Replacement:="RPG", LookAt _
  41.         :=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  42.         ReplaceFormat:=False
  43.        
  44.     Range("B1" ).Select
  45.     myActiveCell.Activate
  46. End Sub


 
 
Au final pour la date franchement c'est pas grave.


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

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468649
xenesys
Posté le 23-04-2024 à 19:54:10  profilanswer
 

Allez je mets à disposition mon catalogue avec tous les scripts :
Catalogue Games.xlsm / 9.42 Mo / https://1fichier.com/?9mh8cjffciebruo7mcjd

 

si ca peut aider d'autres personnes à refaire leur catalogue personnel.


Message édité par xenesys le 23-04-2024 à 19:56:55

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468663
Marc L
Posté le 24-04-2024 à 09:32:32  profilanswer
 

 
  Là il y a du monde !
 
  Bonne nouvelle : toutes les pages existantes
  - une cinquantaine de jeux du catalogue complet n'ont pas de page Wiki, je n'y inclus pas ceux pour lesquels il faut ajouter une extension -
  contiennent 'infobox_v3' donc à utiliser comme limite de recherche au lieu de la page complète.
 
  Je dois maintenant tester toutes les pages pour voir s'il y a d'autres cas spéciaux de date
  avant une démonstration pour les quatre colonnes - mais contigües - à télécharger ensemble …
 

n°2468664
xenesys
Posté le 24-04-2024 à 09:47:19  profilanswer
 

pour les jeux qui n'ont pas de wiki, c'est possible d'avoir des noms ?
j'ai corrigé beaucoup de noms mais pas impossible d'en avoir oublié (je suis en train de tous les repasser en vue...)

 

par ex : Bioshock Infinite : Clash in the Clouds >> https://fr.wikipedia.org/wiki/Biosh [...] the_Clouds pas de fiche car c'est une extension du jeu qui est incluse dans la page du jeu principal.
Certaines extension renvoient vers la page du jeu d'origine


Message édité par xenesys le 24-04-2024 à 11:48:50

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468672
Marc L
Posté le 24-04-2024 à 12:03:53  profilanswer
 

 
  La procédure ci-dessous cherche pour chaque page de jeu quelle version 'infobox' elle utilise dans son code source HTML
  via des requêtes Web donc ce n'est pas le code HTML de la page une fois chargée comme via Internet Explorer,
  progression visible en bas dans la barre d'état, résultat affiché à la fin dans la colonne N.
 
  Si une page n'existe pas le résultat sera S#404
  S'il y a eu besoin de l'extension '_(jeu_vidéo)' alors le caractère ¤ est ajouté au résultat et,
  s'il apparaît seul, la page avec l'extension n'a rien donné.
 
  Encore une fois à coller uniquement dans le module de Feuil1 (Catalogue Games) au lieu d'un simple module,
  là où est située la procédure évènementielle Worksheet_Activate et, une fois en place,
  la procédure doit être visible via Alt F8 comme Feuil1.TestReq1 sinon ce n'est pas bon !
 

Code :
  1. Sub TestReq1()
  2.  Const S = "infobox_v", J = "_(jeu_vidéo)", Z = "*" & J
  3.    Dim L%, V, T$(), R&, P&
  4.        L = Len(S) + 1
  5.        V = ListObjects(1).ListColumns(1).DataBodyRange
  6.        ReDim T(1 To UBound(V), 0)
  7.   With CreateObject("WinHttp.WinHttpRequest.5.1" )
  8.        On Error Resume Next
  9.    For R = 1 To UBound(V)
  10.        Application.StatusBar = "Sur " & UBound(V) & " requêtes : #" & R
  11.       .Open "GET", "https://fr.wikipedia.org/wiki/" & V(R, 1), False
  12.       .setRequestHeader "DNT", "1"
  13.        Err.Clear
  14.       .send
  15.     If Err.Number = 0 Then
  16.        If .Status = 200 Then
  17.               P = InStr(1, .responseText, S, 1)
  18.            If P Then T(R, 0) = Mid(.responseText, P, L) & T(R, 0) _
  19.                 Else If Not V(R, 1) Like Z Then T(R, 0) = " ¤": V(R, 1) = V(R, 1) & J: R = R - 1
  20.        Else
  21.            T(R, 0) = "S#" & .Status & T(R, 0)
  22.        End If
  23.     Else
  24.        T(R, 0) = "E#" & Err.Number
  25.        Exit For
  26.     End If
  27.        If R Mod 10 = 0 Then DoEvents
  28.    Next
  29.   End With
  30.        [N2].Resize(UBound(T)) = T
  31.        Application.StatusBar = False
  32. End Sub


Message édité par Marc L le 24-04-2024 à 12:46:42
n°2468712
xenesys
Posté le 24-04-2024 à 17:38:38  profilanswer
 

testé = que des V3 avec quelques ¤
certains titres sont S#404 mais c'est normal après vérification car pas de fiche existante en français.

 

je vais pouvoir continuer de mettre à jour certains titres de jeux


Message édité par xenesys le 24-04-2024 à 17:53:24

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468822
xenesys
Posté le 26-04-2024 à 11:30:25  profilanswer
 

Pour le moment ca marche très bien. Aucun souci rencontré.
 
 
J'ai voulu voir pour tout ce qui est BD.
J'ai testé mais je ne comprends pas du tout pourquoi ca ne marche pas vu que la page est construite de facon identique (sauf qu'ici c'est une infobox_v2) d'après ce que j'ai vu :
J'ai testé juste avec tintin : https://fr.wikipedia.org/wiki/Les_Aventures_de_Tintin
Mais ca ne fonctionne pas du tout (genre(s) , éditeur, etc) je n'ai que des ¤¤ comme résultat alors que le nom est correct.


---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468867
Marc L
Posté le 26-04-2024 à 15:37:58  profilanswer
 

 
  Je suis sur la fin des tests pour les dates + autres colonnes.
 
  Sinon pour les BD cela a l'air encore plus facile car tout est dans la table de l'infobox de la page une fois chargée
  donc en scannant la première colonne uniquement (et non pas toutes les cellules) …
 
  Suivre donc l'exécution de la procédure en mode pas à pas pour voir où cela pêche.
 

n°2468876
xenesys
Posté le 26-04-2024 à 17:19:38  profilanswer
 

c'est ce que j'ai fait mais je ne détecte rien.... je suis clairement pas au niveau pour ca ^^""""  
 
il boucle comme prévu ici

Code :
  1. If oTable.Rows(L).Cells(0).innerText = "éditeur" Then S = oTable.Rows(L).Cells(1).innerText: Exit For
  2.             L = L + 1
  3.         Loop Until L = oTable.Rows.Length


 
mais ne bascule jamais sur le "Then S = ..." donc j'en ai conclu qu'il ne trouve pas le terme "éditeur" sauf que j'ai testé plusieurs écritures sans resultat (j'ai même fouillé avec l'inspecteur de firefox pour vérifier mais idem)


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

---------------
Topic MSI X570-X470&Co | RetourXP OC 2700X+DDR4
n°2468879
Marc L
Posté le 26-04-2024 à 17:43:58  profilanswer
 

 
  Comme cela fonctionne bien de mon côté, sans même piloter IE, juste avec une requête et un document HTML  
  donc il y aurait déjà une mauvaise orthographe de l'élément cherché …
  Ensuite je ne peux pas deviner donc vaudrait mieux poster le code délimité entre balises via l'icône C.
 

n°2468880
Marc L
Posté le 26-04-2024 à 18:06:26  profilanswer
 

 
  Même si je l'ai clairement évoqué lors de mon premier post de ce jour, je vais insister : copier / coller n'est pas coder !
  Car comme souligné pour la page Wiki BD tout est dans la table de l'infobox_v2, bien visible en inspectant la page
  donc pourquoi s'évertuer à boucler sur des tables alors que cet infobox_v2 est une table ?!
 
  Du reste, dans une page Wiki de jeu vidéo, quel est donc le type d'élément de l'infobox_v3 ?
  C'est le B-A-BA de l'inspection d'une page HTML et sans cela, coder serait vain …
 

n°2468882
xenesys
Posté le 26-04-2024 à 18:27:48  profilanswer
 

AYÉ !! viens de trouver l'erreur... = un espace oublié après "Éditeur "
c'est en testant avec "Site web " que j'ai constaté l'oubli vu qu'avec Site web cela a fonctionné.

 

édit: oh purée c'est pire que prévu y a encore moins d'homogénéité dans les pages... "Genre" "Genres" "Genre(s)"


Message édité par xenesys le 26-04-2024 à 18:40:59

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


  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   profilanswer
 

 Page :   1  2  3  4
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Excel macro/vba récupérer données wikipedia (voir p.4)

 

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 (voir p.4)


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