Copier coller le contenu d'une page internet

Copier coller le contenu d'une page internet - VB/VBA/VBS - Programmation

Marsh Posté le 28-05-2011 à 21:58:00    

Hello,
 
voilà mon problème, j'essaie de récupérer un tableau sur un site internet pour ensuite inscrire certaines valeurs de ce tableau dans un onglet de mon fichier Excel. Je ne peux pas passer par les connections de Excel sur un site web car il y a une identification à faire sur ce site.
avec la référence Microsoft Internet Controls, j'ai deja pu faire en sorte d'ouvrir cette page via Internet Explorer et j'ai pu aussi récupérer ce tableau via la source html. Le problème c'est qu'il y a des espaces qui surviennent dans ce tableau de façon assez aléatoire, ce qui me décalle toutes les données et rend l'utilisation de ce tableau impossible. Par contre, avec un copier coller a  la main, le tableau est copié avec le même format et il n'y a plus de problème d'espace, ce qui m'a donné l'idée de recopier ce copier coller mais fait entièrement en VBA cette fois. Je me suis donc tourné vers le Application.SendKey en mettant le focus sur la fenetre IE, mais le résultat n'est pas très probant, la copie ne se fait qu'une fois sur 10... J'ai effectivement vu sur les différents sites dont j'ai cherché que le Application.SendKey était déconseillé pour tous les problèmes que cela engendre. J'ai donc cherché du côté de l'API SendMessage, j'ai d'ailleurs trouvé quelque chose qui a l'air intéressant, mais par contre je n'arrive pas du tout a m'en servir...
 
voici mon code que j'ai pour déjà essayé de faire un CTRL + A afin de sélectionner toute la page internet avant de copier :
 

Code :
  1. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As
  2. Integer, ByVal lParam As Any) As Long
  3. Const WM_KEYDOWN As Long = &H100
  4. Const WM_KEYUP As Long = &H101
  5. Const VK_CONTROL As Long = &H11
  6. Const VK_A as Long = &H41
  7. Sub ImporterDonner()
  8. Dim IE as New InternetExplorer
  9. ... ' code pour aller sur la page internet qui m'intéresse
  10. SendMessage(IE.HWND, WM_KEYDOWN, VK_CONTROL, 0)
  11. SendMessage(IE.HWND, WM_KEYDOWN, VK_A, 0)
  12. SendMessage(IE.HWND, WM_KEYUP, VK_A, 0)
  13. SendMessage(IE.HWND, WM_KEYUP, VK_CONTROL, 0)
  14. End Sub


mais cela ne fonctionne pas, d'ailleurs les SendMessage me retournent toujours 0 mais je ne suis pas sur qu'elle me renverrait 1 si le message est bien passé, je n'ai pas trouvé d'info la dessus mais bon au final c'est pas important, je vois bien que l'envoi du message n'a pas fonctionné car la page internet n'est pas selectionné via le ctrl + a.
 
Une idée de pourquoi cela marche pas ? est-ce que je n'utilise pas la bonne méthode ?
 
Merci d'avance de votre aide.


Message édité par Arwon le 29-05-2011 à 10:56:14
Reply

Marsh Posté le 28-05-2011 à 21:58:00   

Reply

Marsh Posté le 28-05-2011 à 23:43:56    

Salut,un exemple de Login avec Identification et Mot de Passe sur Hardware.fr
reste à savoir si applicable à ton site

Option Explicit
 
'   Activer les références
'       Microsoft HTML Objects Library
'       Microsoft Internet Controls
 
Sub Login_HardwareFr()
Dim ie As InternetExplorer
Dim PageHtml As HTMLDocument
Dim HElem As IHTMLElement
 
    Set ie = CreateObject("InternetExplorer.Application" )
    ie.Visible = True
 
    ie.navigate "http://forum.hardware.fr/login.php?config=hardwarefr.inc"
    Do Until ie.readyState = READYSTATE_COMPLETE
        DoEvents
    Loop
 
    Set PageHtml = ie.document
     
    'Pseudo
    Set HElem = PageHtml.getElementsByName("Pseudo" ).Item
    HElem.Value = "xxxxxxxx"
     
    'mot de passe
    Set HElem = PageHtml.getElementsByName("Password" ).Item
    HElem.Value = "yyyyyyyyyyyyyyyy"
     
    ' Bouton Valider
    Set HElem = PageHtml.getElementsByName("Valider" ).Item
    HElem.Click
 
    Do Until ie.readyState = READYSTATE_COMPLETE
        DoEvents
    Loop
     
    ie.navigate "http://forum.hardware.fr/hfr/Programmation/VB-VBA-VBS/liste_sujet-1.htm"
    Set ie = Nothing
End Sub


Message édité par kiki29 le 28-05-2011 à 23:47:02
Reply

Marsh Posté le 29-05-2011 à 10:55:49    

Hello,
 
merci de ta réponse, mais ce n'est pas cette partie la du code qui me pose problème, j'ai déjà fait cette partie du code et cela fonctionne bien, j'arrive a aller sur la page internet que je veux. Je ne l'ai juste pas mis dans mon code car ce n'était pas important pour la résolution de mon problème. Je pense que tu as lu un peu trop vite mon post^^.

Reply

Marsh Posté le 29-05-2011 à 11:27:48    

Salut,

Citation :

Je ne peux pas passer par les connections de Excel sur un site web car il y a une identification à faire sur ce site.


Si tu cherches sur le net tu trouveras des exemples d'import de tableau html,restera à les adapter à ton contexte


Message édité par kiki29 le 29-05-2011 à 11:31:01
Reply

Marsh Posté le 29-05-2011 à 11:42:41    

je parlais de l'option "Requête sur le Web" d'Excel qui ne fonctionne pas a cause de l'identification. De toute facon je ne peux pas utiliser cette méthode car je dois naviguer entre plusieurs mois sur la page ou je dois importer les données et l'URL reste la même, mais j'arrive a exécuter du javascript avec ma classe InternetExplorer donc j'ai pas de soucis pour ça.
 
j'avais pas cherché sur google avec les mots clé "import tableau html", effectivement j'arrive a quelque chose de différent de ce que j'avais pu trouvé. Reste à voir si je n'ai pas le même problème d'espace sur quelques tableaux, ca serait plus propre que de passer par le copier coller...

Reply

Marsh Posté le 31-05-2011 à 09:25:01    

Salut,est-ce que cela t'aidera ? http://www.developpez.net/forums/d [...] r-chexbox/

Reply

Marsh Posté le 31-05-2011 à 11:17:18    

j'ai finalement trouvé une facon de récupérer les tableaux de la page internet, il m'a juste fallu trouver le n° du tableau qui m'intéressait et cela marche très bien.  
 
voici le code retravaillé pour mon besoin :
 

Code :
  1. Dim notable As Long
  2. Dim element As Object ' the elements of the document
  3. Dim table As Object ' the table required
  4. Dim row As Object ' the rows of the table
  5. Dim cell As Object ' the cells of the rows.
  6. Dim I As Long
  7. Dim J As Long
  8. Dim annee
  9. Dim noligne As Long
  10. Set doc = IE.Document
  11. annee = 2011
  12. notable = 11
  13. J = 0
  14. tabno = 0
  15. For Each element In doc.all
  16. If element.nodeName = "TABLE" Then
  17. J = J + 1
  18. End If
  19. If J = notable Then
  20. Set table = element
  21. tabno = tabno + 1
  22. nextrow = nextrow + 1
  23. Set Rng = Sheets("DonnéesATraiter";).Range("A" & nextrow)
  24. For Each row In table.Rows
  25. For Each cell In row.Cells
  26. If InStr(cell.innerText, "/";) Then
  27. Rng.Value = CDate(Replace(Replace(cell.innerText, "/", ".";) & "." & annee, " ", "";))
  28. Else
  29. If Trim(cell.innerText) <> "" Then
  30. Rng.Value = cell.innerText
  31. End If
  32. End If
  33. Set Rng = Rng.Offset(, 1)
  34. I = I + 1
  35. Next cell
  36. nextrow = nextrow + 1
  37. Set Rng = Rng.Offset(1, -I)
  38. I = 0
  39. Next row
  40. Exit For
  41. End If
  42. Next element


merci de ton aide.


Message édité par Arwon le 31-05-2011 à 11:19:38
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed