Recuperation d'un bout de texte, Webrowser VBA

CA MARRRRRRRRCHEEEEEEEEEEEEE !!!!!!!!!!!!!!!!!!!!!!!!!!!!

J'ai remplacé param par ca valeur directement en chaine de caractère (entre " " ) et putain ca marchee!!!!!!!!!!!!!!!!

Pardon mais c'est l'euphorie ici !!

Steelson je t'aime !

J'ai un champ énorme de possibilité qui s'ouvre à moi !!! je vais gagner un temps fabuleux !!

MERCI !!!!!


Je te demanderai juste mnt une petite explication de ton code notamment ou est-ce que tu decides l'emplacement de l'écriture du resultat, pourquoi mettre des variables entre crochet etc..

Et après ! Je me ferais de super fonction grâce à ton aide !!

J'ai modifié ton code :

Dim param1$ 'ici

Sub requete1()
Dim URL$, obj As New DataObject
'On Error Resume Next
    DoEvents
    URL = [URL_1].Value
    'On Error Resume Next
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .Send
        If .Status = 200 Then
            [Source].Value = .responseText
            decode_url
            decode_param
            requete2
        End If
    End With
End Sub

Sub requete2()
Dim param As String

Dim XMLHTTP As New MSXML2.XMLHTTP
    myurl = [URL_2]
    With XMLHTTP
        .Open "POST", [URL_2].Value, False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .Send param1 'ici

        If .Status = 200 Then
            [txt_final].Value = Split(Split(.responseText, [txt_Avant])(1), [txt_Apres])(0)
        End If
    End With
End Sub

Sub decode_url() ' URL
    avant = "action="""
    apres = """ method"
    [URL_2].Value = Split(Split([Source].Value, avant)(1), apres)(0)
End Sub

Sub decode_param() ' parametres POST
Dim entrees, noms, valeurs, i, chaine

    chaine = ""

    avant = "<input type=""hidden"""
    apres = ">"
    entrees = Split([Source].Value, avant)

    For i = 1 To UBound(entrees) ' le 0 est avant le début, donc ne pas tenir compte !

        avant = "name="""
        apres = """"
        noms = Split(Split(entrees(i), avant)(1), apres)(0)

        avant = "value="""
        apres = """"
        valeurs = Split(Split(entrees(i), avant)(1), apres)(0)

        chaine = chaine & "&" & noms & "=" & valeurs

    Next

    param1 = Mid(chaine, 1, Len(chaine)) 'ici (le problème venait qu'il fallait partir à 1 et non à 2

End Sub

Par contre je ne comprend toujours pas comment tu fais pour mettre les valeurs sur la feuille 1, ca me frustre !


Ni comment tu recup les valeurs dans les cellules A3 et A4 d'ailleurs !

On avance ... mais retour à la littérature (tous ne disent pas la même chose)

https://www.google.fr/search?q=exemple+xmlhttp+vba+excel+post&oq=exemple+xmlhttp+vba+excel+post

Comme je n'ai jamais utilisé POST en VBA excel je découvre aussi

Il faudrait que j'écrive un programme php et que je le mette sur serveur pour tester moi-même !

A suivre


AlienFall a écrit :

Par contre je ne comprend toujours pas comment tu fais pour mettre les valeurs sur la feuille 1, ca me frustre

Ni comment tu recup les valeurs dans les cellules A3 et A4 d'ailleurs !

Les zones sont nommées dans excel URL_1, URL_2, param, source, etc. (regarde dans formules > gestionnaire de noms)

et dans excel j'utilise leur nom entre crochet

par exemple :

[Source].Value = .responseText

cela affecte la réponse de la requête http à la zone nommée Source

Bon.. ca marche pas si bien que ça en fait.. J'ai un soucis sur l'automatisation, puisqu'il semblerait que le lien vari quand je fais varier mes tiers.......

Du coup j'ai pour idée de faire partir ma requête depuis la page de base, mais problème, ça ne marche que si j'ai le bon corps de demande ou "Paramètres déduits de la source" dans ton fichier Excel, or vu que je suis lien avant je n'est plus le "method" : "action" pour recup les paramètres, mais si je les mets en "dur" parce que j'arrive à les récupérer (depuis mon nav) ça fonctionne..

Enfin je sais pas si c'est clair,

Du coup, Est-ce que tu es toujours d'attaque pour me donner un coup de main?

Ce que je vais faire de mon côté est un site internet test avec double envoi :

1- adresse internet qui va renvoyer vers une page contenant une nouvelle URL et la "form" à retrouner

2- une autre page internet qui va répondre à l'URL déduite de la page précédente et qui va réagir en POST

Cela va quand même me prendre un petit moment dans mes loisirs ... mais c'est nécessaire.


Entre temps, j'allais te proposer certaines manip :

- mettre dans la macro en "dur" les paramètres issus de la case B4

.Send [param]

remplacé par

.Send "bla=rty&bla=ert" 

et lancer requete2()

  • éventuiellement supprimer le dernier paramètre car après = il n'y a rien !
  • ... d'autres idées ?

Au fait, j'espère que tout ceci n'est pas fait pour ne récupérer qu'une seule valeur ?

AlienFall a écrit :

Bonjour a tous,

Je cherche à récupérer un simple bout de texte sur une page internet accessible seulement depuis les postes de mon entreprise.

Alors j'ai pas mal bidouillé le code, et je crois que j'y suis presque, je triche sur l'url déduit en mettant un URL en dur, et pour le send j'envoi que trois variables (mais ça a pas l'air de le gener plus que ça).

AlienFall a écrit:

Bonjour a tous,

Je cherche à récupérer un simple bout de texte sur une page internet accessible seulement depuis les postes de mon entreprise.

Le soft servira à récupérer le code NAF de plus de 1,000 clients, et aussi une liste d'équipement (mais sur une autre page -- donc un autre problème), mais allons s'y pas à pas

Aurais-tu une méthode pour récupérer dans une chaine de caractère un tableau contenant tout les occurrences d'un modèle basé sur : (********) parce que mon code marche presque !

Mais pour recuperer le code NAF je fais un Split (de plus) sur les parenthèses, ça marche dans 90% des cas, mais si le texte est par exemple : "Mon métier c'est ça (et c'est bien) : (codeNAF)" je recupére :

(et c'est bien), au lieu de : (codeNAF)

Du coup y a t-il une fonction pour récupérer chaque partie d'un string qui commencerait par "(" et finirait par ")"

L'idée est d'ensuite de faire un test sur un IsNumeric(Left(variable,1,4)) pour retrouver le code NAF

Rappel un code NAF ressemble à ça : "8451A" , "4512B" , "6523E" etc..

AlienFall a écrit :

Aurais-tu une méthode pour récupérer dans une chaine de caractère un tableau contenant tout les occurrences d'un modèle basé sur : (********) parce que mon code marche presque !

Pour récupérer un tableau complet ...

AlienFall a écrit :

Du coup y a t-il une fonction pour récupérer chaque partie d'un string qui commencerait par "(" et finirait par ")"

L'idée est d'ensuite de faire un test sur un IsNumeric(Left(variable,1,4)) pour retrouver le code NAF

Rappel un code NAF ressemble à ça : "8451A" , "4512B" , "6523E" etc..

Un méthode = expression régulière

23code-naf.xlsm (14.34 Ko)

Hello,

Merci pour tes fonctions, celle sur le NAF est parfaite, elle fonctionne très bien, je suis a deux doigts de réussir ma récupération automatique, quand je lance ma macro, 135 client renvoi bien le NAF mais 153 ne renvoi rien, je suis entrain de plancher sur l'origine du problème, je me demande si c'est au niveau du ".send" parce que fondamentalement les liens sont les mêmes.. Ca devrait marcher..

Je crois que le problème aussi est que le split ne trouve pas "Activité" et l'autre partie de txt, qui me permettent d'isoler le code NAF

Bref, si jamais tu as des pistes je suis preneur

Encore merci pour ton aide depuis les 7 derniers jours !

Peut-être que la page ne te renvoie qu'une partie des 1000 et qu'il faut ensuite "paginer" ?

Je suis en train de faire mon site internet pour décoder en POST... et savoir comment cela se passe.

Ok super, c'est vraiment génial que tu fasse ça, tu vas pouvoir nous donner les clefs pour bien comprendre le mécanisme du send / post !

Par contre, j'ai un soucis avec la fonction code NAF :

Function ChercheChaine(chaine, pattern)
  Set obj = CreateObject("vbscript.regexp")
  obj.pattern = pattern
  Set a = obj.Execute(chaine)
  If a.Count > 0 Then ChercheChaine = a(0) Else ChercheChaine = ""
End Function
tableau.ListRows(i).Range(3) = ChercheChaine(Resultat, "[0-9]+[A-W]")

Le problème vient de la en fait, la fonction ne renvoi rien, pourtant les entrées ont l'air similaire cf PJ


J'ai eu une idée en voyant la fonction et ça a marché j'ai changé ["A-W"] par ["A-Z"] et ça marche, c'était tout bête


Je suis passé a 219 réussi pour 67 échecs ! On avance, on avance :') !

e1 e2

Je ne sais même pas pourquoi j'avais mis A-W au lieu de A-Z !!

Il faudrait même mettre

[0-9]{4}[A-Z]

Un tuto intéressant ...

https://www.lucaswillems.com/fr/articles/25/tutoriel-pour-maitriser-les-expressions-regulieres

AlienFall a écrit :

resultat

De nouveau l'erreur sur le Send [param]

Hé bien en fait il faut mettre

.Send [param].Value

et cela fonctionne sur le test que je viens de faire sur un site tout simple en POST !!

Facheuse manie qu'autorise excel dans certains cas de con fondre la cellule et son contenu ! on finit par prendre toujours la solution de facilité ....

Ah d'accord ! Oui je comprend mieux, après pour éviter ce genre d'erreurs j'ai toujours entendu qu'il fallait coder en "Option Explicit" pour être forcé à déclarer tout les variables et bien manipuler les objets.

Je suis toujours sur ma récupération de code NAF qui fonctionne mnt a 100% je suis passé aux équipements et la maintenant je bloque un peu sur de la logique :

Je laisse un fichier Word en PJ, l'idée est de réussir a récupérer automatique que le contenu en gras, tu aurais des pistes que je puisse explorer? Parce que le soucis c'est que des équipements il en existe beaucoup, il faudrait trouver une sorte de règle logique pour les isoler :/


Mais je suis content j'ai réussi à bien adapter le code pour récupérer le code source dans le second cas et ça fonctionne, maintenant c'est plus qu'une question de traitement de texte \o/

16lass.docx (12.20 Ko)
AlienFall a écrit :

maintenant c'est plus qu'une question de traitement de texte \o/

Excel permet aussi de gérer les objets via getElementsByTagName ... mais la plupart des sites sont encore mal configurés pour cela ! donc je préfère encore aujourd'hui une bonne solution de traitement de texte !

A noter que j'ai mis la source de la première interrogation dans une cellule, mais c'est possible car le code html est très petit (cela permettait d'en contrôler le déroulement). C'est souvent loin d'être le cas, il faut donc rester dans l'environnement VBA pour traiter un texte-source long.


AlienFall a écrit :

Je laisse un fichier Word en PJ, l'idée est de réussir a récupérer automatique que le contenu en gras, tu aurais des pistes que je puisse explorer? Parce que le soucis c'est que des équipements il en existe beaucoup, il faudrait trouver une sorte de règle logique pour les isoler :/

Il sont tous encadrés par

Consulter ____________________ >

et

</

Il faudrait soit bricoler un split(spli( soit une expression régulière !!

Je peux regarder cela demain matin à la fraîche éventuellement

Comme prévu, un test de décodage pour extirper les éléments en gras.

Enfin le principe est là ...

14test-decodage.xlsm (15.32 Ko)

Hello ! C'est super merci ! J'ai réussi en me servant de ton fichier a faire un petit algo qui fait exactement ce que je voulais ! Merci beaucoup !

Il me reste un dernier problème ! Et je te promets qu'en suite j'arrête de t'embêter ! J'ai finis la récup des NAFs, la récup des équipements, mais on ma demandé aussi de récup la présence ou non de Site Web sur une page d'information client, j'ai essayé avec nos méthodes précédemment créé mais cette fois la requête est fait par un GET dans le code, et je n'arrive pas a déclencher la requête sur Excel, a chaque fois je récupère le code source de la "requête précédente".

Mais il n'y a cette fois aucun "corps de demande" ce qu'on envoyé avant,

J'ai recup la requete d'envoi :

GET /SCOMNEW/devbooster.aspx?langue=fr&pays=FR&look=INTRANET_2000&mnc=scom&banque=XXXXX&xxxxx=XXXXX&_tie=TIEXXXXXXXXXXXXXXX&_ple=TIE&_refatr=3+++XXXXXXXXXXXXXXX6&ref=XXXXXXXXXXXXXXX&typeref=xxxxx&xxxxx=XXXXXXXXXXXXXXX&xxxxx=XXXXX&page=scom&session=A&banqueOld=XXXXX HTTP/1.1

L'adresse du site ressemble à ça :

http://xxx-xx-xxxxx.fr/SCOMNEW/?&xxxxxOld=XXXXX&xxxxx=XXXXXXXXXXXXXXX&ref=XXXXXXXXXXXXXXX&tiers=XXXXXXXXXXXXXXX&langue=FR&page=scom&pays=FR&session=A&banqueOld=XXXXX&mnc=scom&look=intranet%5F2000&profil=F50B&xxxxx=XXXXX&xxxxx=XXXXX&ses=A

Les fois d'avant ça marchait parce que j'arrivais a isoler la parti que je voulais en trouvant le lien qui pointé dessus, mais la c'est un GET, du coup je suis à nouveau perdu :p


En fait j'ai compris, ton code est vraiment parfait, parce que ça marche !! C'est juste que la page est beauuuucoup trop grande ! J'arrive pas a la recup en entier, c'est pour ça que je trouve pas les infos, y'a que le quart du code est stocké dans la variable :/

Tu aurais une idée pour spliter ou agrandir un "string" ?


C'est bizarre il n'y pourtant "que" 160.000 caractères, bon la variable fait 160ko du coup, mais bon ^^' Je pensais qu'un string pouvais contenir beaucoup plus :/

Ma variable s'arrête a 32.362 caractères soit 32ko, mmmmh ca doit surement être logique le 32 doit pas sortir de nul part

Mmmmmh

J'ai résolu mon problème en utilisant :

Sub creer_TXT(variable As String)
  Close
  chemin = "C:\Users\XXXXXXX\Desktop\"
  Open chemin & "FichierTxt.txt" For Output As #1
  Print #1, variable
  Close
End Sub

Cette fonction permet d'écrire une variable dans un fichier txt, en fait ce n'est pas mon String qui était limité mais la cellule "A1" qui (il semblerait) ne peut recevoir que 32ko de donnée

Du coup grâce a l'enregistrement dans un fichier Txt j'ai pu trouvé ou mon "txtAvant" / "txtAprés" déconné et ça marche parfaitement !!

Par contre dernier soucis, pour la recherche de Site Web c'est 4 voir 5x plus lent que les deux autres, je pense que le problème vient du fait que la page est immense et donc le split est plus long a trouver la partie que je veux.. Et ca je pense que je peux rien y faire :/

AlienFall a écrit :

En fait j'ai compris, ton code est vraiment parfait, parce que ça marche !! C'est juste que la page est beauuuucoup trop grande !

Et c'est exactement ce que j'écrivais hier !!

Steelson a écrit :

A noter que j'ai mis la source de la première interrogation dans une cellule, mais c'est possible car le code html est très petit (cela permettait d'en contrôler le déroulement). C'est souvent loin d'être le cas, il faut donc rester dans l'environnement VBA pour traiter un texte-source long.

et c'est en effet une excellente méthode également

AlienFall a écrit :

J'ai résolu mon problème en utilisant : ...

Cette fonction permet d'écrire une variable dans un fichier txt,

et en effet, on peut aussi rester dans l'environnement VBA

AlienFall a écrit :

en fait ce n'est pas mon String qui était limité


AlienFall a écrit :

dernier soucis, pour la recherche de Site Web c'est 4 voir 5x plus lent que les deux autres, je pense que le problème vient du fait que la page est immense et donc le split est plus long a trouver la partie que je veux

il faudrait tenter la méthode getElementsByTagName

Du coup la fonction GetElementbyTagName je l'utilise a quel moment? Après le send? A la place du Split?

à la place du split

Bon ce n'est pas de moi et je ne maîtrise pas tout ! Il faut que le site soit correctement structuré.

Un autre post intéressant ici qu'on aurait pu utiliser pour détecter les paramètres (c'est plus "pro", mais je m'en sors souvent bien en traitant le texte).

https://forum.excel-pratique.com/excel/macro-connexsion-siter-internet-t96056.html#p556523

Rechercher des sujets similaires à "recuperation bout texte webrowser vba"