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 SubPar 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 = .responseTextcela 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
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 Functiontableau.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 :') !
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].Valueet 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/
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à ...
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.1L'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=ALes 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 SubCette 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