Résolu Modifier l'adresse web d'une requête

  • Auteur de la discussion Ashtonmalseg
  • Date de début

Ashtonmalseg

Nouveau membre
Bonjour,

J'ai besoin de rédiger une macro me permettant de modifier l'adresse web d'une requête en fonction des éléments que je recherche.
L'adresse web de ma requête a cette tête :

Code:
http://stats.entreprise.fr/broker?nom=entrepriseA&annee=2013&noreg=99&_service=stats
[url=http://stats.entreprise.fr/broker?nom=entrepriseB&annee=2012&noreg=99&_service=CA]http://stats.entreprise.fr/broker?nom=entrepriseB&annee=2012&noreg=99&_service=CA[/url]
http://stats.entreprise.fr/broker?nom=entrepriseB&annee=2013&noreg=99&_service=stats

J'aimerai pouvoir renseigner des cellules Excel qui modifieraient les valeurs de l'adresse web ci-dessus (entreprise, année, noreg, service...) pour récupérer les données issues de la page web correspondante.

Je me suis débrouillé avec la fonction "enregistrer une macro" mais l'adresse de la requête reste toujours le même. Je ne sais pas comment faire entrer des variables dans l'adresse à prendre en compte pour ma requête.

De plus ce serait des combinaisons très nombreuses je ne peux donc pas enregistrer une requête pour chacun de mes besoins.

Pouvez-vous m'aider?
Merci beaucoup,
J'utilise office 2010
 

zeb

Modérateur
Salut,

Pourquoi faire ça en Visual Basic ?
Il suffit de concaténer le contenu de tes cellules dans une autre !

Dans A1 :
Dans B1 : broker?nom=entrepriseA&annee=2013&noreg=99&_service=stats
Dans C1 : =A1 & "/" & B1

:spamafote:
 

Ashtonmalseg

Nouveau membre
Bonjour,

Merci pour cette réponse rapide. C'est bien l'idée que j'ai pour modifier facilement l'adresse. Ma difficulté est comment automatiser le fait qu'Excel ira chercher les données de cette adresse vers un nouvel onglet quand je la change ou quand je clique sur un bouton? Plutôt que de récupérer cette adresse, lancer le gestionnaire de données externes, copier/coller l'adresse lancer l'extraction, etc.

En gros puis-je écrire en Visual Basic : va chercher les données de la page internet dont l'adresse est inscrite en C1?

Merci
 

KyrO_82

Grand Maître
Salut,

"En gros puis-je écrire en Visual Basic : va chercher les données de la page internet dont l'adresse est inscrite en C1?"

Bien sûr. L'adresse de ta requête est une variable comme les autres, suffit de la former en fonction du contenu de tes cellules.
 

zeb

Modérateur
Euh, former des URL; c'est une chose.
Allez chercher des données (?) c'en est-une autre.

Quand il aura le contenu de la page, il en fait quoi Excel ?
Et pis ces adresses, elle renvoient quoi ? Du texte, du HTML, des données binaires brutes, du JSON, un tableau Excel ?
 

Ashtonmalseg

Nouveau membre
Le souci est que je ne sais pas passer de ça
Code:
Sub Macro3()
'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://stats.entreprise.fr/broker?nom=entrepriseA&annee=2013&noreg=99&_service=stats" _
        , Destination:=Range("Feuil1!A1"))
        .Name = "DonnéesExternes_1"
        .FieldNames = True
        ....
        .Refresh BackgroundQuery:=False
    End With
End Sub

A ça

Code:
Sub Macro3()
''
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;"Feuil2!B2" _
        , Destination:=Range("Feuil1!A1"))
        .Name = "DonnéesExternes_1"
        .FieldNames = True
        ...
    End With
End Sub

Encore une fois je me débrouille avec l'enregistrement de macro et peux parfois les modifier lorsque c'est suffisament lisible, mais là je ne tombe que sur des erreurs en insérant le nom de la cellule qui contient l'adresse qui m'intéresse.

Les données que je récupère sont sous forme de tableau excel. Je retraite ensuite de manière automatisée les infos contenues dans ces tableaux. C'est quelque chose que je fais déjà aujourd'hui mais de manière manuelle. Ces données sont mises à jour de manière hebdomadaires et j'aimerai récupérer ces info directement et plus rapidement qu'en allant sur le site, remplir les formulaires, obtenir la page, demander l'enregistrement sous excel puis copier/coller dans mon classeur d'analyse.
 

Ashtonmalseg

Nouveau membre
Bonsoir,

Je vais vous donner le site exact, ce sera peut-être plus facile pour m'aider.

Je viens de trouver un moyen qui pourrait fonctionner mais j'ai un message d'erreur venant du site.
J'ai créé une requête dynamique que voici :
Code:
http://stats.atih.sante.fr/cgi-bin/broker?finess=["Finess","Quel Finess"]&annee=["Année","Quelle année"]&base=["Base","Quelle base"]&noreg=["Région","Quelle Région?"]&type=["GHM","Quel classement"]&_program=["Programme","Quel Programme"]&_service["Service","Quel service?"]&_debug["Debug","Mode debug"]
Je peux ainsi demander de récupérer les données dans des cellules spécifiques.
L'objectif est donc de reformer l'adresse suivante :
Code:
http://stats.atih.sante.fr/cgi-bin/broker?finess=140017237&annee=2013&base=0&noreg=99&type=ghm&_program=mcoprog.affiche_cm.sas&_service=stats&_debug=0

Il se trouve que j'ai un message d'erreur du site :
Code:
Please specify a value for _SERVICE. The administrator has not defined a default service to use in this case

Je vérifie les cellules supposées remonter l'information mais elles me paraissent bonnes.
J'ai également réduit la chaine de caractère (j'ai lu quelquepart qu'il ne faut pas plus de 255 caractères)...
Je ne sais plus quoi essayer.

Une piste?
Merci pour votre aide.
 

zeb

Modérateur
Si A1 contient 140017237 ; A2, 2013 ; A3, 0, A4, 99 ; A5, "ghm" ; A6, "mcoprog.affiche_cm.sas" ; A7, stats et A8, 0 ;
Alors ta formule devient :

Code:
= "http://stats.atih.sante.fr/cgi-bin/broker?finess=" & A1 & "&annee=" & A2 & "&base=" & A3 & "&noreg=" & A4 & "&type=" & A5 & "&_program=" & A6 & "&_service=" & A7 & "&_debug=" & A8

(Ce n'est pas de la programmation VB, ça, c'est de la simple bureautique :/ )
 

Ashtonmalseg

Nouveau membre
Bonjour Zeb,

Je crois que je me suis mal exprimé.

Je sais comment recréer une adresse. Ce que je veux c'est éviter de copier/coller cette adresse dans mon navigateur à chaque fois que je change un paramètre.
Je sais que l'on peut importer des données via l'option "données externes" depuis un site internet. Je souhaite faire ce travail une fois (avec le bon code d'adresse) et ensuite automatiser l'import des données chaque fois que je change une cellule.


Je veux pouvoir obtenir le tableau pour toutes les régions par exemples en changeant uniquement la cellule A4 par exemple.

L'intérêt de passer par du VB me permet d'intégrer tout ça au fichier et de pouvoir en faire un fichier capable de faire cette tâche automatisée sans devoir y joindre des requêtes particulières.

Merci pour ton aide.
 

zeb

Modérateur
..........

(Je viens de relire ton premier message à la lumière de ces dernières informations. C'est un peu plus clair. Pour me faire pardonner, je m'y colle.)
 

KyrO_82

Grand Maître
Juste pour préciser, parce que je me suis incrusté en début de conversation, je me débrouille bien en VB (.NET) et saurais faire ça en quelques minutes dans ce langage si il ne s'agissait pas d'extraire les données d'une table Excel (je n'ai jamais fais de prog MS Office) et de formater ces données en VBA (jamais fais de VBA).
C'est pour ça que je ne participe plus :/
 

zeb

Modérateur
Mais vas-y KyrO ! N'hésite jamais. C'est un forum ouvert ici, pas un site salons privés.
--> Il me semble quand même que le parsing des données peut être fait par Excel (c'est l'intérêt de la fonction données externes).

----------------------------

Bon, sinon Ashtonmalseg, fais la manip' une fois avec une adresse. Tu auras pris la précaution de démarrer l'enregistreur de macros. A l'issue, tu auras un bout de code tout moche. Il te suffira de le modifier pour le rendre paramétrable.

Si tu publies ce code ici (*), nous pourrons t'aider à le modifier.


_____________________
(*) Attention, le modérateur est un psychopathe. Si tu oublies d'encadrer tes bouts de code par les balises [code=vb] et [/code], il est capable de faire un malheur.
 

Ashtonmalseg

Nouveau membre
Bonjour à tous,

Voici le code :
Code:
Sub test()
'
' test Macro
'

'
    With ActiveSheet.QueryTables.Add(Connection:= _
        "URL;http://stats.atih.sante.fr/cgi-bin/broker?Finess=060780715&annee=2013&base=100&noreg=99&type=ghm&_program=mcoprog.affiche_cm.sas&_service=stats" _
        , Destination:=Range("Feuil3!$A$1"))
        .Name = _
        "broker?Finess=060780715&annee=2013&base=100&noreg=99&type=ghm&_program=mcoprog.affiche_cm.sas&_service=stats"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub

J'ai tenté de modifier le début par
Code:
 With ActiveSheet.QueryTables.Add(Connection:=Range("Feuil1!$B$13").Value _
       , Destination:=Range("Feuil3!$A$1"))

Sans succès vous le savez...

Je ne sais pas comment rendre variable la portion adresse.



KyrO je ne sais pas si le fichier qu je vais chercher est un tableau Excel ou non. Ce que je sais c'est que c'est un tableau. Je souhaite le récupérer sur Excel pour le retravailler ensuite. Si ta solution peut s'embarquer facilement dans u fichier Excel je prends... :)

Merci pour votre aide en tout cas
 

zeb

Modérateur
Gné,

Si tu fais ActiveSheet.QueryTables.Add(Connection:="blabla", ...) ça marche.
Mais si tu mets "blabla" dans la cellule A1 puis que tu fais ActiveSheet.QueryTables.Add(Connection:=Range("A1"), ...), ça ne marche plus !

:/ Vérifie bien que c'est bien la même chose...
 

Ashtonmalseg

Nouveau membre
Je te confirme que ça ne marche pas.

Je t'envoie le fichier [strike]xxxxxxxxxxxxxxx[/strike]

Je suis vraiment perdu.
Tu trouveras quelques tests. La Macro "test" fonctionne.
Je fais mes tests avec la macro "test2"...
 

zeb

Modérateur
Meilleure réponse
Par principe, pas d'échange de fichier plein de macros. Merci.

Vérifie bien que ce que tu mets dans ta cellule est exactement ce que tu veux voir dans Connection.

Admettons que tu veuilles afficher le Finess 060780715, pour l'année=2013, avec une base de 100, un noreg de 99 et un type ghm, en utilisant le programme mcoprog.affiche_cm.sas et le service de stats.

Mets ces informations dans tes cellules.
Constitue l'url dans une variable et vérifie :
Code:
Dim ma_connexion As String
ma_connexion = "URL;http://stats.atih.sante.fr/cgi-bin/broker" & _
    "?Finess=" & Range("A1").Value & _
    "&annee=" & Range("A1").Value & _
    "base=" & Range("A2").Value & _
    "&noreg=" & Range("A3").Value & _
    "&type=" & Range("A4").Value & _
    "&_program=" & Range("A5").Value & _
    "&_service=" & Range("A6").Value

If ma_connexion = "URL;http://stats.atih.sante.fr/cgi-bin/broker?Finess=060780715&annee=2013&base=100&noreg=99&type=ghm&_program=mcoprog.affiche_cm.sas&_service=stats" Then
    MsgBox "Ok"
Else
    MsgBox "Houston, Houston... On a un problème"
End If

Dim QT as QueryTable
Set QT = ActiveSheet.QueryTables.Add(Connection:= ma_connexion, Destination:=Range("Feuil3!$A$1"))
QT.Name = "sam archpa"
QT.FieldNames = True
QT.RowNumbers = False
...
 

Ashtonmalseg

Nouveau membre
Merci beaucoup Zeb,

Après adaptation cela fonctionne parfaitement.

A toute fin utile pour les prochains je mets mon code final.

Code:
Sub Recupdata()

'Définition de ma connexion
Dim ma_connexion As String
ma_connexion = "URL;http://stats.atih.sante.fr/cgi-bin/broker" & _
    "?Finess=" & Range("Feuil1!B5").Value & _
    "&annee=" & Range("Feuil1!B6").Value & _
    "&base=" & Range("Feuil1!B7").Value & _
    "&noreg=" & Range("Feuil1!B8").Value & _
    "&type=" & Range("Feuil1!B9").Value & _
    "&_program=" & Range("Feuil1!B10").Value & _
    "&_service=" & Range("Feuil1!B11").Value  

Sheets("Feuil3").Select
    With ActiveSheet.QueryTables.Add(Connection:=ma_connexion, Destination:=Range("Feuil3!$A$1"))
        .Name = _
        "Casemix_Etablissement"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
End Sub

A partir de là je vais pouvoir l'adapter pour d'autres besoins. Je n'ai plus qu'à identifier le terme des différentes options des requêtes (WebselectionType notamment).

Merci encore et à bientôt
 

Ashtonmalseg

Nouveau membre


Il manquait simplement un & devant base et puis j'ai mis les bonnes cellules.
J'ai aussi compris quelque chose d'intéressant qui est que l'on peut utiliser le & pour concatener comme on le fait dans les cellules...
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 079
Messages
6 716 707
Membres
1 586 247
Dernier membre
MrAzgarIII
Partager cette page
Haut