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 :

VBA + Internet (Google Maps ?) : Calcul des kilomètres entre deux adresses [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 020
    Par défaut VBA + Internet (Google Maps ?) : Calcul des kilomètres entre deux adresses
    Bonjour,
    Jadis j'ai glané sur Internet un code pour calculer le nombre de kilomètres entre deux adresses... mais il est obsolète :

    Code VBA : 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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    '-------------------------------------------------------------------------------
    ' Pensez à ajouter les bibliothéques "Microsoft HTML Object Library"
    ' et "Microsoft Internet Controls".
    '-------------------------------------------------------------------------------
     
    '-------------------------------------------------------------------------------
    Public Function DuréeTrajetEntreAdresses(AdresseDépart As String, AdresseArrivée As String, _
                                             Optional VoirGoogleMaps As Boolean = False) As Long
    '-------------------------------------------------------------------------------
    ' Renvoie la durée du trajet entre deux adresses passées en argument, en
    ' utilisant Google Maps, exprimée en minutes ou 0 si erreur.
    '-------------------------------------------------------------------------------
    Dim i As Byte
    If AdresseDépart = AdresseArrivée Then Exit Function
    If AdresseDépart = "" Or AdresseArrivée = "" Then Exit Function
     
    ' Lance GoogleMars. Si erreur alors 0 et recommence (maxi 10 fois):
    ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Do
        DuréeTrajetEntreAdresses = TrajetGoogleMaps(AdresseDépart, AdresseArrivée, VoirGoogleMaps)
        i = i + 1: If i > 10 Then Exit Do
    Loop While DuréeTrajetEntreAdresses = 0
     
    End Function
     
    '-------------------------------------------------------------------------------
    Public Function TrajetGoogleMaps(AdresseDépart As String, AdresseArrivée As String, _
                                     Optional VoirGoogleMaps As Boolean = False) As Long
    '-------------------------------------------------------------------------------
    ' Ouvre Google Maps sur le calcul du trajet des adresses passées en arguments.
    ' Retourne : la durée du trajet en minutes (sans circulation), ou 0 si ereur.
    ' Exemple d'appel : TrajetGoogleMaps("22 rue Cassette, 75006, Paris", "Bordeaux")
    '-------------------------------------------------------------------------------
    Dim IE As New InternetExplorer
    Dim IEDoc As HTMLDocument
    Dim i As Long, Min As Integer, h As Integer, T As Double
    Dim OldStatusBar As Boolean ' Mémorise l'état d'origine de la barre d'état.
    Dim OldCursor As Long       ' Mémorise l'état d'origine du curseur.
     
    On Error Resume Next
     
    ' Active la barre d'état:
    OldStatusBar = Application.DisplayStatusBar
    Application.DisplayStatusBar = True
    Application.StatusBar = "Calcul du trajet : " & AdresseDépart & " / " & AdresseArrivée
    OldCursor = Application.Cursor
    Application.Cursor = xlWait
     
    ' Ouvre IE, et lance le calcul:
    IE.Visible = VoirGoogleMaps
    IE.navigate "https://www.google.fr/maps/dir/" & AdresseDépart & "/" & AdresseArrivée
     
    ' Attend que IE soit disponible:
    Do Until IE.readyState = READYSTATE_COMPLETE And IE.Busy = False
        DoEvents
    Loop
     
    ' Recherche dans le document où est écrit le résultat "sans circulation":
    Set IEDoc = IE.document
    T = Timer: While T + 1 > Timer: Wend
     
    ' Pointe sur le champ qui contient le trajet calculé:
    Set Ret = IEDoc.getElementsByClassName("section-directions-trip-summary section-directions-trip-secondary-text")
     
    ' Extraction dans le libellé de la durée en minutes et heures:
    Min = InStr(1, Ret.Item(0).textContent, "min", vbTextCompare)
    If Min > 0 Then Min = Mid(Ret.Item(0).textContent, Min - 3, 2)
    h = InStr(1, Ret.Item(0).textContent, "h", vbTextCompare)
    If h > 0 Then h = Mid(Ret.Item(0).textContent, h - 3, 2)
     
    ' Convertion en minutes de la durée:
    TrajetGoogleMaps = h * 60 + Min
     
    ' Si VoirGoogleMaps est vrai:
    If VoirGoogleMaps = True Then MsgBox "Cliquez ici pour fermer Google Maps", vbOKOnly, "Google Maps"
     
    ' Ferme Internet:
    IE.Quit
    Set IE = Nothing
     
    ' Restaure la barre d'état d'origine:
    Application.StatusBar = ""
    Application.Cursor = OldCursor
    Application.DisplayStatusBar = OldStatusBar
     
    End Function
    '-------------------------------------------------------------------------------

    J'ai besoin d'une nouvelle version, qui me renvoie le nombre de kilomètres entre deux adresses et si possible la durée du trajet (le tout en mode voiture).
    Si vous avez des pistes, ou un code tout fait, je suis preneur.

    Merci d'avance.

  2. #2
    Expert éminent

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 552
    Par défaut
    Bonjour

    Je n'ai pas regardé le code en détail mais cela fait 2 ans environ que l'accès aux infos et calculs de Google map est payant...

  3. #3
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 198
    Par défaut
    Hello,


    En fait le script ne fonctionne plus car googlemaps n'accepte plus internet explorer comme navigateur et la page a changé par rapport au script.
    Plusieurs solutions pour remplacer le script :
    1 - utiliser googleapis qui permet d'avoir directement en format xml un trajet en spécifiant que quelques paramètres exemple :
    avec ce code :
    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
    Sub RecupTrajet()
        Dim url As String
        url = "https://maps.googleapis.com/maps/api/distancematrix/xml" & _
              "?origins=Paris&destinations=Bordeaux&sensor=false&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        Dim request As New MSXML2.XMLHTTP60
        request.Open "GET", url, False
        request.send
        If (request.Status <> 200) Then
            Debug.Print "HTTP Status is not OK (200)"
            Debug.Print request.responseText
        Else
             Debug.Print request.responseText
        End If
     
    End Sub
    j'obtiens ceci comme résultat (attention le paramètre key n'est pas valide dans le code ci-dessus) :
    Code xml : 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
     <status>OK</status>
     <origin_address>Paris, France</origin_address>
     <destination_address>Bordeaux, France</destination_address>
     <row>
      <element>
       <status>OK</status>
       <duration>
        <value>20859</value>
        <text>5 heures 48 minutes</text>
       </duration>
       <distance>
        <value>584930</value>
        <text>585 km</text>
       </distance>
      </element>
     </row>
    </DistanceMatrixResponse>

    concernant de savoir si cela peut-être gratuit(si on ne dépasse pas un certain quota) car cela est assez complexe à comprendre.
    moi pour l'instant j'ai une api key et je n'ai rien payé à Google (Facturation à 0 €)
    Sinon pour remplacer Internet Explorer il y a SeleniumBasic (voir ici ) mais cela oblige à installer le logiciel et le WebDriver du navigateur que l'on utilise. De plus SeleniumBasic n'a pas été mis à jour depuis 8 ans.
    Il y aussi un nouveau projet qui utilise des modules de classes. Il s'agit de Chromium-Automation-with-CDP-for-VBA de Licence MIT
    Chromium Automation for VBA - CDP Framework
    This is a method to directly automate Chromium-based web browsers, such as Chrome, Edge, and Firefox, using VBA for Office applications by following the Chrome DevTools Protocol framework. This git is an enhanced framework based on the original pioneering article by ChrisK23 on CodeProject. You can find the original article as well as his example here at https://www.codeproject.com/Tips/530...dge-using-VBA\
    What It Can Do
    This method enables direct automation with Chromium-based web browsers for VBA without the need for a third-party software like SeleniumBasic. The framework also includes many examples and useful functions added to the original repository while keeping the whole design as simple as possible to help you understand and get started quickly with deploying the CDP framework for your VBA solutions.
    En fait dans les releases il y a un complément .xlam qu'il faut télécharger et lancer et dedans il y a les modules de classes et un module de démo que l'on copie dans le classeur où l'on veut les utiliser. Cela rajoute environ 200Ko au classeur.

    Voici un exemple pour obtenir la durée et la longueur d'un trajet dans googlemaps.
    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
    Public Sub TrajetGoogleMaps(AdresseDépart As String, AdresseArrivée As String, _
                                     Optional CacherGoogleMaps As Boolean = False)
    '-------------------------------------------------------------------------------
    ' Ouvre Google Maps sur le calcul du trajet des adresses passées en arguments.
    ' Exemple d'appel : TrajetGoogleMaps("22 rue Cassette, 75006, Paris", "Bordeaux")
    '-------------------------------------------------------------------------------
    Dim objBrowser As New CDPBrowser
    Dim result
        On Error Resume Next
        'on lance MS EDGE
        objBrowser.start "edge", cleanActive:=True, reAttach:=True
        ' on peut cacher le navigateur
        If CacherGoogleMaps Then objBrowser.hide
        objBrowser.navigate ("https://www.google.fr/maps/dir/" & AdresseDépart & "/" & AdresseArrivée)
        objBrowser.wait till:="interactive"
        'Clic sur le bouton qui correspond à  un trajet en voiture
        objBrowser.getElementByXPath("//button/img[@data-tooltip='Voiture']").click
        'Clic sur la section du résultat en attendant son apparition
        objBrowser.getElementByID("section-directions-trip-0").onExist.click
        'Récupération du texte qui donne le temps et le kilométrage du trajet en attendant son apparition
        result = objBrowser.getElementByXPath("//div[@class='TGDfee']").onExist.innerText
        Debug.Print result
        objBrowser.quit
    End Sub
    Sub TestTrajet()
       TrajetGoogleMaps "22 rue Cassette, 75006, Paris", "Bordeaux", False
    End Sub
    voici ce que j'obtiens :
    5 h 51 min (581 km)
    Ami calmant, J.P

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 519
    Par défaut
    l'API Google DistanceMAtrix est payante (autant aller à la source pour l'info => https://developers.google.com/maps/d...-billing?hl=fr )

  5. #5
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 198
    Par défaut
    Citation Envoyé par umfred Voir le message
    l'API Google DistanceMAtrix est payante (autant aller à la source pour l'info => https://developers.google.com/maps/d...-billing?hl=fr )
    Dans le lien que j'ai mis voilà ce qui est expliqué et qui me laisse perplexe :
    Informations sur les tarifs de l’API Google Maps
    Il faut savoir que chaque requête est payante, dès la première. Cependant, Google vous offre tous les mois les 200 premiers dollars.


    La seconde chose à connaître, c’est la notion de « niveaux ». De 0 à 100 000 (100k) requêtes, nous sommes au « niveau 1 ». Au-delà, nous passons au « niveau 2 », où le montant par requête est plus bas. Aussi, la facturation se fait par lots de 1 000 (1k) requêtes.


    Dans la partie suivante, où tous les services vous seront présentés, il y aura quatre tarifs indiqués :


    Tarifs « simple », niveau 1 : $2 / 1k requêtes ; niveau 2 : $1.60 / 1k requêtes.
    Tarif « bas », niveau 1 : $5 / 1k requêtes ; niveau 2 : $4 / 1k requêtes.
    Tarif « avancé », niveau 1 : $10 / 1k requêtes ; niveau 2 : $8 / 1k requêtes.
    Tarifs « CGP », dépend de l’infrastructure utilisée pour le service.
    Il faut dire que mon API key est dans un mode essai et devrait bientôt expirée
    Pendant la période d'essai, votre premier compte de facturation Cloud est en mode d'essai, et aucuns frais ne sont facturés sur votre mode de paiement. L'essai prend fin une fois les 300 USD dépensés ou, au plus tard, au terme de la période d'essai.

    Au plus tard le dernier jour de l'essai, vous devez mettre à niveau votre premier compte de facturation Cloud vers un compte payant pour éviter que l'utilisation de Google Maps Platform soit interrompue (consultez Passer à un compte payant).

  6. #6
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 1 020
    Par défaut
    Bonjour,
    Merci pour vos réponses.
    Vous devinez bien que je ne suis pas spécialiste du sujet mais est-il possible avec un objet créé par CreateObject("Microsoft.XMLHTTP") d'utiliser le site "https://www.coordonnees-gps.fr/itineraire" au lieu de "GoogleMaps", qui fait la même chose, y renseigner l'adresse d'origine (dans address), l'adresse de destination (addressDest) puis de cliquer sur le bouton "Calcul itinéraire" (btn btn-success).
    Reste alors à lire le résultat.
    Facile à dire mais peut-être plus compliqué à faire...

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 198
    Par défaut
    Citation Envoyé par laurent_ott Voir le message
    Vous devinez bien que je ne suis pas spécialiste du sujet mais est-il possible avec un objet créé par CreateObject("Microsoft.XMLHTTP") d'utiliser le site "https://www.coordonnees-gps.fr/itineraire" au lieu de "GoogleMaps", qui fait la même chose, y renseigner l'adresse d'origine (dans address), l'adresse de destination (addressDest) puis de cliquer sur le bouton "Calcul itinéraire" (btn btn-success).
    Reste alors à lire le résultat.
    Facile à dire mais peut-être plus compliqué à faire...
    Le souci c'est la saisie des adresses et le clic sur le bouton : sans navigateur cela me semble impossible : xmlhttp ne fait que récupérer du html il ne peut pas faire d'action sur la page. Donc la meilleure solution c'est le pilotage de navigateur ou alors l'utilisation d'une API (comme DistanceMatrix) mais dans ce cas il est rare que cela ne soit pas payant. C'est cette API que ton site "https://www.coordonnees-gps.fr/itineraire" utilise :
    Les résultats de cette page sont obtenus à partir de l'API Google Maps Platform, jugée préférable à Mappy itinéraire ou Michelin itinéraire.

  8. #8
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 198
    Par défaut
    Hello,
    la plus performante des solutions est bien sûr l' API googleapis qui met moins de 200 ms à renvoyer un résultat. Les autres solutions mettent plusieurs secondes. Avec un crédit gratuit de 200$ par mois et en limitant son quota à 1000 requêtes par jour (ce qui est faisable) , cela reste gratuit car un crédit de 200$ correspond à 40000 requêtes.
    Donc si vous n'avez pas trop de requêtes à faire par jour vous pouvez envisager d'utiliser l'API googleapis sans coût. A vérifier quand même que ce que j'affirme n'est pas faux
    Ami calmant, J.P

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Vxi3] Calcul des ponts entre deux dates
    Par Laurent P dans le forum Webi
    Réponses: 7
    Dernier message: 19/11/2013, 09h30
  2. [Google Maps] Temps de parcours entre deux points
    Par patriote dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 25/11/2012, 13h26
  3. Calculer des champs entre deux tables
    Par bhami9 dans le forum Bases de données
    Réponses: 7
    Dernier message: 12/10/2010, 18h34
  4. [Google Earth] - Synchroniser des lieux entre deux PC
    Par Valenten dans le forum SIG : Système d'information Géographique
    Réponses: 0
    Dernier message: 16/09/2010, 13h51
  5. Google Maps - calcul de distance entre 2 adresses
    Par nico_4802 dans le forum Services Web
    Réponses: 5
    Dernier message: 13/12/2009, 03h40

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