IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Géocoder adresses puis les récupérer dans feuille excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 25
    Par défaut Géocoder adresses puis les récupérer dans feuille excel
    Bonjour à tous,

    Je travail sur un script qui va géocoder des adresses contenues dans une feuille excel puis remplir cette même feuille avec les latitudes et longitudes obtenues. Pour géocoder je créé un page web dynamiquement qui va interroger l'api google.

    Je n'ai qu'un problème c'est comment récupérer les latitudes et longitudes pour les intégrer dans excel. Si quelqu'un avait un exemple même très basique je suis preneur.

    Par exemple créer une page web dynamiquement qui va faire cellule 1.1 + cellule 1.2 (une fonction en javascript) et qui va renvoyer le résultat dans la cellule 1.3.

    Le début du script pourrait ressembler à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    Sub RécupLatln()
    Dim a as string
    Dim b as string
    a = cells(1,1). value
    b = cells(1,2). value
     
    Open "page test" For Output As #1
    Print #1, Chr$(13) & "<html>"
    Print #1, Chr$(13) & "      <head>"
    Print #1, Chr$(13) & "          <script type=" & Chr(34) & "text/javascript" & Chr(34) & ">"
    Print #1, Chr$(13) & " var ch1= " & a & ";"
    Print #1, Chr$(13) & " var ch2= " & b & ";"
     
    Print #1, Chr$(13) & "          function (){"
    Print #1, Chr$(13) & " 			var ch1= " & a & ";"
    Print #1, Chr$(13) & " 			var ch2= " & b & ";"
    Print #1, Chr$(13) & "			Add=ch1+ch2; "
    Print #1, Chr$(13) & "		}"
     
    Print #1, Chr$(13) & "         </script>"
    Print #1, Chr$(13) & "     </head>"
    Print #1, Chr$(13) & "      <body >"
    Print #1, Chr$(13) & "      </body>"
    Print #1, Chr$(13) & "      </html>"
    Close #1
     
    End Sub
    Ensuite il faudrait trouver un moyen de récupérer la valeur Add.

    L'objectif final étant de faire tourner un script un WE complet pour récupérer des coordonnées d'un grand nombre d'adresse (l'api Google limite le géocodage).

    Merci d'avance pour la réponse.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Bonjour,

    Une piste avec une fonction personnalisée qui utilise msxml2.dll et googleapis maps
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    '#######################################
    '### Pour le Early Binding
    '### nécessite la référence
    '### Library MSXML2
    '### C:\WINDOWS\system32\msxml2.dll
    '### Microsoft XML, v2.6
    '#######################################
    Function PointGeodesique(Plage_AdresseCodeVillePays As Range) As String
    Dim XmlH As Object    '(Late Binding) MSXML2.XMLHTTP
    Dim C As Range
    Dim Url$
    Dim A$
    Dim Latitude$
    Dim Longitude$
    '--- Chaîne des paramètres ---
    For Each C In Plage_AdresseCodeVillePays
      If Trim(C) <> "" Then
        Url$ = Replace(Trim(C), Space(1), "+") & ",+"
      End If
    Next C
    Url$ = Url$ & "&sensor=false"
    '--- GoogleAPIs ---
    Url$ = "http://maps.googleapis.com/maps/api/geocode/xml?address=" & Url$
    '--- MSXML2.XMLHTTP ---
    Set XmlH = CreateObject("msxml2.xmlhttp")
    With XmlH
      .Open "get", Url$, False
      .Send
      A$ = Trim(.responseText)
    End With
    '--- Latitude et longitude ---
    Latitude$ = Right(A$, Len(A$) - InStr(1, A$, "<lat>") - 4)
    Latitude$ = Left(Latitude$, InStr(1, Latitude$, "</lat>") - 1)
    Longitude$ = Right(A$, Len(A$) - InStr(1, A$, "<lng>") - 4)
    Longitude$ = Left(Longitude$, InStr(1, Longitude$, "</lng>") - 1)
    '--- Retour ---
    PointGeodesique = "Latitude:" & Latitude$ & " Longitude:" & Longitude$
    End Function
    Exemple d'utilisation :
    On met des données en A1:D1 (rue, code postal, ville, pays) et on tape la formule =PointGeodesique(A1:D1) dans une autre cellule.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    L'objectif final étant de faire tourner un script un WE complet pour récupérer des coordonnées d'un grand nombre d'adresse (l'api Google limite le géocodage).
    Le code que j'ai précédemment fourni ne fonctionnera pas pour les 2 raisons suivantes

    1) Erreur de logique
    Une instruction est erronée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each C In Plage_AdresseCodeVillePays
      If Trim(C) <> "" Then
        Url$ = Replace(Trim(C), Space(1), "+") & ",+"
      End If
    Next C
    il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For Each C In Plage_AdresseCodeVillePays
      If Trim(C) <> "" Then
        Url$ = Url$ & Replace(Trim(C), Space(1), "+") & ",+"
      End If
    Next C
    2) Quota de requêtes dépassé (rédhibitoire)
    Après plusieurs usages, j'obtiens
    "<?xml version=""1.0"" encoding=""UTF-8""?>
    <GeocodeResponse>
    <status>OVER_QUERY_LIMIT</status>
    <error_message>You have exceeded your daily request quota for this API.</error_message>
    </GeocodeResponse>"
    Il faut se tourner vers une autre piste.
    Si j'en trouve une, je la communiquerai.
    A suivre.

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut heu
    bonjour pour info
    Pièce jointe 174451
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Par défaut
    Merci Patrick pour ces infos.
    ***
    J'en déduis qu'il ne faut pas passer par une fonction personnalisée car, à chaque changement sur la feuille, la fonction se recalcule.
    De ce fait, on a vite atteint la limite autorisée.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    J'en déduis qu'il ne faut pas passer par une fonction personnalisée car, à chaque changement sur la feuille, la fonction se recalcule
    .
    Normalement, si elle n'est pas volatile, une fonction ne se recalcule que si un antécédent est modifié.

    eric

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par PMO2017 Voir le message
    Merci Patrick pour ces infos.
    ***
    J'en déduis qu'il ne faut pas passer par une fonction personnalisée car, à chaque changement sur la feuille, la fonction se recalcule.
    De ce fait, on a vite atteint la limite autorisée.
    re


    tu n'a qua passer par par une astuce toute simple
    en début de macro
    tu écrit la formule dans les cellules dynamiquement
    et des que la valeur est autre que rien du copy paste value tu garde donc la valeur des point geo mais plus la formule
    sur tout que la c'est simple c'est la même formule pour toute
    ou alors dans une boucle temporisé intelligemment tu applique la formule

    ou même mieux
    ta formule truc = ta fonctio blablabla
    et bien toute les cellule après la première tu remplace ta fonction par une condition et ta fonction
    ce qui fait que tant que les précédente ne sont pas fait la fonction n'est pas sollicitée
    ca ralentirait considérablement

    et la on serait avec l'attente de la requette etc.... largement dans les 5 par secondes

    c'est tout bête

    re
    ou alors même mieux

    utiliser 2 colonne
    la première colonne vide
    la 2 eme avec un condition sur la cellule de gauche si la gauche est vide >ta fonction sinon rien et en retour de la fonction du pourrait lui donner la va valeur "fait"

    de ce fait même avec le calculate la fonction n'est pas sollicitée si la cellule gauche n'est pas vide
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. [XL-2007] Calculer les jours dans feuille excel
    Par charmante_19 dans le forum Excel
    Réponses: 6
    Dernier message: 06/09/2014, 16h58
  2. Réponses: 1
    Dernier message: 18/01/2009, 09h34
  3. vba excel : insertion d image gif dans feuille excel
    Par chamus dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/01/2007, 13h16
  4. Ecrire dans feuille excel
    Par Matmal11 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/09/2006, 08h49
  5. [VBA] problème choix de cellule dans feuille excel
    Par beegees dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/02/2006, 10h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo