Instructions Sendkeys vers page web

Résolu
lionyz Messages postés 62 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 30 octobre 2012 - 23 mars 2009 à 22:13
moscato40 Messages postés 27 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 24 juin 2010 - 23 avril 2009 à 17:41
Bonjour,

Quelqu'un peut il m'expliquer comment faire pour que les instructions
Senkeys "^(A)" -> Tout sélectionner et Senkeys "^(C)" -> copier
agisse sur une page web ouverte avec webbrowser1 et qui a le focus
avec WebBrowser1.SetFocus.

Merci de votre aide

20 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mars 2009 à 09:20
Quel interet de faire cela ?

en effet, jouant avec un WebBrowser, tu as accès a tout en passant par des interfaces COM

que cherches tu a copier ?
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mars 2009 à 14:01
ok, donc clairement pas besoin de presse papier, fichier texte ou SendKeys...

faire :

Private Const SOURCE_URL As String = "http://www.abcbourse.com/marches/nominal.aspx"

Private Sub Command1_Click()
Dim oDoc As HTMLDocument
Dim oMatch As Object
Dim oBody As Object
Set oDoc = WebBrowser1.document
If Not Nothing Is oDoc Then
Set oBody = oDoc.getElementsByTagName("body")
If oBody.length > 0 Then
Set oBody = oBody.Item(0)

With CreateObject("VbScript.RegExp")
.Pattern = "<TR[^>]*>\s+.+\b(\d{2}/\d{2}/\d{4}).+\s+.+>([^<]+).+\s+.+;(\d+\.\d+)</TD></TR>"
.Global = True
.MultiLine = True

For Each oMatch In .Execute(oBody.innerHTML)
MsgBox "Date: " & oMatch.SubMatches(0) & vbNewLine & _
"Nom: " & oMatch.SubMatches(1) & vbNewLine & _
"Division par: " & oMatch.SubMatches(2), vbInformation
Next oMatch
End With
End If
End If
End Sub

Private Sub Form_Load()
WebBrowser1.Navigate2 SOURCE_URL
End Sub

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
Command1.Enabled = False
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Command1.Enabled (URL SOURCE_URL)
End Sub
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mars 2009 à 14:53
non, expression rationnelle

mis au point grace à :
http://www.vbfrance.com/codes/REGEXP-WORKSHOP_17331.aspx
3
lionyz Messages postés 62 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 30 octobre 2012
24 mars 2009 à 11:38
Merci de ta réponse mais je sais peu de chose sur les interfaces COM
Ou puis je trouver les infos sur ce sujet ?

Je cherche à copier le texte d'une page web dans un fichier type bloc note
pour ensuite rechercher les infos dont j'ai besoin en analysant ce texte ligne par ligne.

Je ne sais pas comment rechercher directement ces infos sur la page web

Merci de ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 mars 2009 à 11:55
ça en fait des étapes...

tu joues d'ores et dejà avec un WebBrowser.

tu as donc accès au code source de la page
ainsi qu'a chaque élément de la page.

dans l'absolu, tu pourrais jouer directement avec le presse papier, sans fichier texte intermédiaire.

pourrais tu m'en dire encore un peu plus sur ce que tu souhaites faire ?
quel page web est concernée, quelles infos, etc.

voir
http://www.vbfrance.com/codes/PILOTER-INTERNET-EXPLORER-WEBBROWSER-REPONSE-FORUM_25669.aspx
0
lionyz Messages postés 62 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 30 octobre 2012
24 mars 2009 à 13:10
A l'adresse ci-dessous je cherche à copier les infos qui sont listées
sous les titres < Date         Nom         Division par >

http://www.abcbourse.com/marches/nominal.aspx

Merci de ton aide
0
lionyz Messages postés 62 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 30 octobre 2012
24 mars 2009 à 14:47
Merci pour cet exemple.
Tout est clair sauf l'expression après '.Pattern ='
qui est pour moi un peu comme du chinois
je suppose que ça à voir avec le HTML
0
moscato40 Messages postés 27 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 24 juin 2010
26 mars 2009 à 16:09
Salut,

Hé Renfield, le pattern dans le command1 marche chez moi mais pas ans ton outil REGEXP (sauf si je dégage la dernière balise </TR>, c'est normal ??

Du coup je sèche sur un autre pattern. Y'a t-il des modifs à faire entre ton outil et un code VB6.

Par avance merci
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 mars 2009 à 16:15
juste les " a doubler, mais c'est lié a la facon de les placer dans une string en VB6

étrange que ca n'ai pas fonctionné...
0
moscato40 Messages postés 27 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 24 juin 2010
26 mars 2009 à 16:33
Ok, je me permets de te poster mon code.

J'ai essayer, toujours sur ce site de lire les cours des actions. Mais rien ne se passe dans vb6, alors que dans RegExp, le pattern semble bon.

Private Const SOURCE_URL As String = "http://www.abcbourse.com/Marches/aaz.aspx"

Private Sub Command1_Click()
Dim oDoc As HTMLDocument
Dim oMatch As Object
Dim oBody As Object
    Set oDoc = WebBrowser1.Document
    If Not Nothing Is oDoc Then
        Set oBody = oDoc.getElementsByTagName("body")
        If oBody.length > 0 Then
            Set oBody = oBody.Item(0)
           
            With CreateObject("VbScript.RegExp")
                .Pattern = "<td[^>]*>]*>(\w.+)</td>[^>]*.+</td>[^>]*>(\d\,\d+)[^>]*>[^>]*>(\d\,\d+)[^>]*>[^>]*>(\d\,\d+)[^>]*>[^>]*>(\d+)[^>]*>[^>]*>(\d\,\d+)[^>]*>[^>]*>(\d\,\d+)"
                .Global = True
                .MultiLine = True
               
                For Each oMatch In .Execute(oBody.innerHTML)
                    MsgBox "Nom: " & oMatch.SubMatches(0) & vbNewLine & _
                           "Premier: " & oMatch.SubMatches(1) & vbNewLine & _
                           "+Haut: " & oMatch.SubMatches(2) & vbNewLine & _
                           "+Bas: " & oMatch.SubMatches(3) & vbNewLine & _
                           "volume: " & oMatch.SubMatches(4) & vbNewLine & _
                           "Veille: " & oMatch.SubMatches(5) & vbNewLine & _
                           "Dernier: " & oMatch.SubMatches(6), vbInformation
                Next oMatch
            End With
        End If
    End If
 
End Sub

Private Sub Form_Load()
    WebBrowser1.Navigate2 SOURCE_URL
End Sub

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
    Command1.Enabled = False
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)    Command1.Enabled (URL SOURCE_URL)
End Sub

Merci par avance d'éclairer ma lanterne. En tout cas, c'est un peu ch... au début, mais faut reconnaître que c'est puissant !!!
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 mars 2009 à 16:46
je retestes ce soir.

ta regexp me plait pas completement.

elle trouve 65 items
j'en compte a premiere vue 98 sur la page de base...
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
27 mars 2009 à 08:22
Pense a ajouter dans les references du projet:
Microsoft HTML Object Library
Microsoft VBScript Regular Expressions 5.5

J'ai ajouté dans les controles:
Microsoft Flexgrid control


un piège duquel il faut se méfier : les montants à 4 chiffres et plus. un espace est inséré...



Private Const SOURCE_URL As String = "http://www.abcbourse.com/Marches/aaz.aspx"

Private Sub Command1_Click()
Dim oDoc As HTMLDocument
Dim oMatch As Match
Dim oMatches As MatchCollection
Dim oBody As Object
Dim sContent As String
Dim nPos As Long
Dim nRow As Long
With MSFlexGrid1
.cols = 7
.rows = 2
.FixedCols = 1
.FixedRows = 1

.TextMatrix(0, 0) = "Nom"
.TextMatrix(0, 1) = "Premier"
.TextMatrix(0, 2) = "+Haut"
.TextMatrix(0, 3) = "+Bas"
.TextMatrix(0, 4) = "Volume"
.TextMatrix(0, 5) = "Veille"
.TextMatrix(0, 6) = "Dernier"
End With

Set oDoc = WebBrowser1.document
If Not Nothing Is oDoc Then
Set oBody = oDoc.getElementsByTagName("body")
If oBody.length = 1 Then
Set oBody = oBody.Item(0)

sContent = oBody.innerHTML
nPos = InStr(sContent, "../graphes")
If nPos Then
sContent = Mid$(sContent, nPos - 10)
nPos = InStr(sContent, "</TABLE>")
If nPos Then
sContent = Left$(sContent, nPos - 10)
sContent = Replace(sContent, " ", vbNullString)

With New RegExp
.Pattern = ">([^<]+).+\s.+\s.+>(\d+,\d+).+\s.+>(\d+,\d+).+\s.+>(\d+,\d+).+\s.+>(\d+).+\s.+>(\d+,\d+).+\s.+>(\d+,\d+).+\s.+\s.+>(-?\d+,\d+)%"
.Global = True
.MultiLine = True

Set oMatches = .Execute(sContent)
MSFlexGrid1.rows = 1 + oMatches.Count
For Each oMatch In oMatches
nRow = nRow + 1
MSFlexGrid1.TextMatrix(nRow, 0) = oMatch.SubMatches(0)
MSFlexGrid1.TextMatrix(nRow, 1) = oMatch.SubMatches(1)
MSFlexGrid1.TextMatrix(nRow, 2) = oMatch.SubMatches(2)
MSFlexGrid1.TextMatrix(nRow, 3) = oMatch.SubMatches(3)
MSFlexGrid1.TextMatrix(nRow, 4) = oMatch.SubMatches(4)
MSFlexGrid1.TextMatrix(nRow, 5) = oMatch.SubMatches(5)
MSFlexGrid1.TextMatrix(nRow, 6) = oMatch.SubMatches(6)
Next oMatch
End With
End If
End If
End If
End If
End Sub

Private Sub Form_Load()
WebBrowser1.Navigate2 SOURCE_URL & "?L=A"
End Sub

Private Sub WebBrowser1_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
Command1.Enabled = False
End Sub

Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Command1.Enabled (Left$(URL, Len(URL) - 4) SOURCE_URL)
End Sub
0
moscato40 Messages postés 27 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 24 juin 2010
27 mars 2009 à 13:50
Salut,

Ca marche nickel. Ta solution est plus simple et plus efficace que la mienne (et elle n'oublie pas de valeur en route !!!). Tu as même devancé mon projet de le mettre dans un MSflexgrid. Tu serais pas un peu voyant extra-lucide ???

En tout cas, j'abandonne pas et je continue à bouffer du regexp pour arrêter de te solliciter tous les quatre matins.

Je note que ça fait 2 solutions complètes que tu "m'offres" mais surtout ça fait 2 cas d'école que je vais essayer de bien analyser et de bien maîtriser.

Comme on dis jamais 2 sans 3, je te dis à la prochaine. Je vais essayer de te trouver un truc un peu plus balèze. J'ai hâte, comme ça je me coucherai un peu moins c... quand tu m'auras proposer ta soluce !!

@+ et merci
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
28 mars 2009 à 03:02
Tu fais des efforts sensibles... tu as pondu un Regexp, etc.

de mon coté, j'en fait donc...

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
moscato40 Messages postés 27 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 24 juin 2010
23 avril 2009 à 15:20
Salut Renfield,

je reviens sur ce post qui date un peu. Je n'arrive pas à enregistrer sur le même Flexgrid toutes les pages de cotations c'est à dire des pages :

http://www.abcbourse.com/Marches/aaz.aspx?L=1
http://www.abcbourse.com/Marches/aaz.aspx?L=A
...
http://www.abcbourse.com/Marches/aaz.aspx?L=Z
(soit 27 pages)

Bien sur je peux enregistrer les données sur un fichier texte externe mais ça me plait pas. Ce qui m'énnerve, c'est que je suis persuadé que je suis tout près et qu'il ne suffit que de simples modifs sur ta solution pour y arriver.

Si ca se trouve, je suis complètement dans l'erreur. Tu pourrais pas me mettre sur la voie stp.

Par avance merci.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 avril 2009 à 15:27
en gros, faut changer:

MSFlexGrid1.rows = 1 + oMatches.Count

en

nRow = MSFlexGrid1.rows + 1
MSFlexGrid1.rows = MSFlexGrid1.rows + 1 + oMatches.Count

c'est a dire de faire continuer le remplissage en repartant de la dernière ligne...

c'est fait de tête, là, a toi d'adapter/corriger
0
moscato40 Messages postés 27 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 24 juin 2010
23 avril 2009 à 15:43
Pour info, ça bug au niveau de :

MSFlexGrid1.TextMatrix(nRow, 0) = oMatch.SubMatches(0)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 avril 2009 à 15:49
"bug" ?

dis m'en plus, ma boule de cristal est cassée
0
moscato40 Messages postés 27 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 24 juin 2010
23 avril 2009 à 15:59
C'est le MSFlexGrid1.TextMatrix(nRow, 0) :

Run-time error '381'
Subscript out of range

Pour ta boule de cristal, on va monter une grande opération humanitaire. Je pense qu'on va réussir à t'en dégoter une. Donnes-nous la référence que tu veux.


Je continue à mettre les mains dans le camboui de mon côté. C'est rigolo.

@+
0
moscato40 Messages postés 27 Date d'inscription mardi 13 mai 2008 Statut Membre Dernière intervention 24 juin 2010
23 avril 2009 à 17:41
C'est bon j'ai trouvé.


Par contre, quand je parcours les différentes pages de cotations, pour ne pas que le flexgrid se vide, je dois stocker le nombre de lignes après chaque insertion des données dans le flexgrid dans un textbox ou un label. C'est la seule solution possible ?

En tout cas, encore merci.

@+
0
Rejoignez-nous