Instructions Sendkeys vers page web [Résolu]

Signaler
Messages postés
62
Date d'inscription
samedi 10 janvier 2009
Statut
Membre
Dernière intervention
30 octobre 2012
-
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010
-
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

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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 ?
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
non, expression rationnelle

mis au point grace à :
http://www.vbfrance.com/codes/REGEXP-WORKSHOP_17331.aspx
Messages postés
62
Date d'inscription
samedi 10 janvier 2009
Statut
Membre
Dernière intervention
30 octobre 2012

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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
ç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
Messages postés
62
Date d'inscription
samedi 10 janvier 2009
Statut
Membre
Dernière intervention
30 octobre 2012

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
Messages postés
62
Date d'inscription
samedi 10 janvier 2009
Statut
Membre
Dernière intervention
30 octobre 2012

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
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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é...
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

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 !!!
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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...
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

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
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

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.
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
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
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

Pour info, ça bug au niveau de :

MSFlexGrid1.TextMatrix(nRow, 0) = oMatch.SubMatches(0)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
65
"bug" ?

dis m'en plus, ma boule de cristal est cassée
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

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.

@+
Messages postés
27
Date d'inscription
mardi 13 mai 2008
Statut
Membre
Dernière intervention
24 juin 2010

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.

@+