XL 2010 Demande d'aide pour modifier une matrice

Gagnebin Nicolas

XLDnaute Nouveau
Bonjour tout le monde,

Je suis nouveau sur ce forum, une connaissance m'a conseillé de m'adresser à votre équipe pour obtenir de l'aide pour mon problème.

Je suis en train de faire un travail nécessaire pour notre école. Le but est de définir quel scénario de développement de notre infrastructure scolaire est le plus pertinent pour notre ville.
Un des critères pris en compte dans cette recherche est le trajet parcouru par les élèves de notre école. Je dois donc trouver un moyen de calculer 1'ooo itinéraires pédestres pour chacun des 4 scénarios retenus.

En recherchant sur le forum, j'ai trouvé le post suivant qui est une bonne base de travail. (pièce jointe Distance Gogle Maps-v3)

https://www.excel-downloads.com/threads/matrice-de-distances-google-maps.229286/#post-1459756

Cependant, je n'ai jamais développé de matrice avec excel et je suis incapable de modifier le fichier proposé pour qu'il réponde à mes besoins.
Le code de la matrice utilise le calcul de l'itinéraire en voiture alors que je devrais avoir la référence pour le trajet pédestre. De plus, les distances affichées sont en kilomètre alors qu'il me faut la valeur en mètres.

Je précise que je n'ai besoin que de la page 1 reproduite dans 4 onglets.

J'ai téléchargé le document proposé et modifié pour qu'il corresponde à mes attentes.

En modifiant le fichier, (pièce jointe Distance Gogle Maps-doc perso) la matrice ne fonctionne plus car les références ne sont plus adéquates puisque j'ai ajouté deux colonnes et supprimé deux onglets.

Est-ce que quelqu'un veut bien me donner un coup de main?

Merci d'avance
Nicolas
 

Pièces jointes

  • Distance Google Maps-doc perso.xlsm
    5.8 MB · Affichages: 34
  • Distance Google Maps-v3.xlsm
    56.7 KB · Affichages: 45

vgendron

XLDnaute Barbatruc
Bonjour

Je ne suis pas allé voir dans le code, mais avec les tests que j'ai faits:
1) sur le fichier d'origine (Distance Google maps v3)
la macro "Lancer" récupère les adresses de la colonne A en tant que point de départ, et les adresses de la ligne 1 en point d'arrivée
va sur google maps pour récuperer les distances et temps de trajets
les copies dans les deux Matrice

j'ai ajouté deux adresses de ton fichier à toi (Rue du Vieux-Château 4 et Rue du Haut-Fourneau 36) que j'ai mis en dessous de strasbourg colonne A
relancé la macro . et ca m'annonce 1.2km - temps de trajet 3'
--> la macro semble capable de reconnaitre tes adresses..
--> il faut sans doute lui préciser que tu cherches l'itinéraire piéton

2) Dans TON fichier. il n'y a plus les matrices..??
 

Gagnebin Nicolas

XLDnaute Nouveau
Bonjour vgendron,
Je te remercie pour ta réponse.

Tu as exactement cerné ma demande. Je voudrais modifier la matrice pour qu'elle me sorte l'itinéraire piéton et que le résultat soit affiché en m et non en km.

Ensuite, j'ai modifié le fichier pour que je puisse afficher les colonnes noms et prénoms de mes élèves mais cela fait dysfonctionner les matrices initiales puisque les données de références changent de colonnes. Par contre, les matrices sont toujours présentes puisqu'il reste possible de les visualiser
 

vgendron

XLDnaute Barbatruc
Cf PJ

j'ai trouvé la ligne qui spécifie le type de trajet: Walking =true
et *1000 pour avoir les mètres

et non. dans ton fichier.. les onglets "Matrice Distance et Matrice Temps" sont absents.
 

Pièces jointes

  • Distance Google Maps-v4.xlsm
    51.6 KB · Affichages: 39

Gagnebin Nicolas

XLDnaute Nouveau
Merci pour ce bon début.

Maintenant j'ai compris ta remarque sur les matrices. Effectivement, j'ai supprimé les matrices distances et temps car je n'en ai pas besoin.
Est-ce que cela a des conséquences sur le codage à faire?

J'ai vérifié les résultats obtenus dans ton fichier: ils ne correspondent pas à la réalité. Je doute que *1000 soit la solution a apporter
 

vgendron

XLDnaute Barbatruc
Dernière édition:

Gagnebin Nicolas

XLDnaute Nouveau
J'ai refait un contrôle des données obtenues. La modification en mètre est bel et bien correcte en utilisant *1000 comme tu l'as fait.

Ce qui ne fonctionne pas c'est le mode walking. Les valeurs d'itinéraires obtenues sont celles du mode driving. Es-tu certain que la formule est correcte? Moi cela me dépasse complétement
 

vgendron

XLDnaute Barbatruc
hello

Voir PJ
la ligne de code qui t'intéresse est celle ci, dans le module 1 - macro Calculer
VB:
'passage en mode Pieton TRUE
surl = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & _
Départ & "&destinations=" & Arrivée & _
"&mode=walking=true&units=metric"

je pense que le =true posait problème et n'est pas nécessaire d'où la modif suivante - a tester.
VB:
'passage en mode Pieton TRUE
surl = "http://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & _
Départ & "&destinations=" & Arrivée & _
"&mode=walking&units=metric"

pour ouvrir l'éditeur VBA: Alt+F11

le principe du code
récupère les adresses de départ et arrivée, lance l'API google maps
récupère les distances et temps calculés
les copie dans les matrice
regarde dans le code, j'y ai ajouté des commentaires ici et la en vert--> à partir de ce que j'ai compris du code. bien sur
 

Pièces jointes

  • Distance Google Maps-v4.xlsm
    51.8 KB · Affichages: 62

saloon019

XLDnaute Nouveau
Bonjour,

Merci pour toutes ces infos concernant distancematrix googlemap
perso j'ai dû modifier la fonction pour le retour de résultat :
- les distances sont parfois en mètres au lieu de kilomètres
- j'ai mis les temps en secondes (puis les diviser par 86400 et mettre .numberformat de la cellule en time "hh:mm:ss") si vous les voulais en centième d'heure il faut multiplier par 24.
- il y a pour les distance supérieures à 1000 kms un espace XML (code ascii 160), j'ai essayé de faire un replace de chr(160) mais çà ne marche pas..
du coup je récupère uniquement les valeurs ascii pour des nombres et virgule ou point
- j'ai rajouté aussi dans mon projet les options de choix de trajet

VB:
Function DriveDistanceGoogleMaps(From As String, Dest As String, GoogleMapsKey As String, OptimizeOpt As Integer) As String

    Dim oHttpReq As MSXML2.XMLHTTP
    Dim bodytxt, Temps_Texte, distance As String
    Dim temps As Long
    Dim z As Integer
    
    Set oHttpReq = New MSXML2.XMLHTTP
    
    From = Replace(From, " ", "+")
    Dest = Replace(Dest, " ", "+")

    Select Case OptimizeOpt
        Case 0
            OptimizeOption = ""
        Case 1
            OptimizeOption = "&avoid=tolls"
        Case 2
            OptimizeOption = "&avoid=highways"
        Case 3
            OptimizeOption = "&avoid=ferries"
        Case 4
            OptimizeOption = "&avoid=indoor"
        Case Else
            OptimizeOption = ""
    End Select

    oHttpReq.Open "get", "https://maps.googleapis.com/maps/api/distancematrix/xml?origins=" & From & "&destinations=" & Dest & "&units=metric" & OptimizeOption & "&mode=driving&key=" & GoogleMapsKey, "false"

    oHttpReq.send
    
    bodytxt = oHttpReq.responseText

    bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, "<text>") - 5)
    If InStr(1, bodytxt, "</text>") <> 0 Then Temps_Texte = Left(bodytxt, InStr(1, bodytxt, "</text>") - 1)
    If Temps_Texte <> "" Then
        Temps_Texte = Replace(Temps_Texte, " semaines", "w")
        Temps_Texte = Replace(Temps_Texte, " semaine", "w")
        Temps_Texte = Replace(Temps_Texte, " jours", "j")
        Temps_Texte = Replace(Temps_Texte, " jour", "j")
        Temps_Texte = Replace(Temps_Texte, " heures", "h")
        Temps_Texte = Replace(Temps_Texte, " heure", "h")
        Temps_Texte = Replace(Temps_Texte, " minutes", "m")
        Temps_Texte = Replace(Temps_Texte, " minute", "m")
        Temps_Texte = Replace(Temps_Texte, " secondes", "s")
        Temps_Texte = Replace(Temps_Texte, " seconde", "s")

        Hours = Split(Temps_Texte, " ")
        z = 0
        On Error GoTo fin
        If Right(Hours(z), 1) = "w" Then temps = temps + Val(Hours(z)) * 7 * 24 * 60 * 60: z = z + 1
        If Right(Hours(z), 1) = "d" Then temps = temps + Val(Hours(z)) * 24 * 60 * 60: z = z + 1
        If Right(Hours(z), 1) = "h" Then temps = temps + Val(Hours(z)) * 60 * 60: z = z + 1
        If Right(Hours(z), 1) = "m" Then temps = temps + Val(Hours(z)) * 60: z = z + 1
        If Right(Hours(z), 1) = "s" Then temps = temps + Val(Hours(z)): z = z + 1
fin:
        On Error GoTo 0
    End If
        
    
    bodytxt = Right(bodytxt, Len(bodytxt) - InStr(1, bodytxt, "<text>") - 5)
    If InStr(1, bodytxt, "</text>") <> 0 Then distance = Left(bodytxt, InStr(1, bodytxt, "</text>") - 1)
    
    distance = Replace(distance, ",", ".")
    
    Temps_Texte = ""
    j = 1
    While j < Len(distance) + 1
        If ((Asc(Mid(distance, j, 1)) > 47) And (Asc(Mid(distance, j, 1)) < 58)) Or (Asc(Mid(distance, j, 1)) = 44) Or (Asc(Mid(distance, j, 1)) = 46) Then
            Temps_Texte = Temps_Texte & Mid(distance, j, 1)
        End If
        j = j + 1
    Wend
        
    If InStr(1, bodytxt, "m") <> 0 And InStr(1, bodytxt, "km") = 0 Then
        If Temps_Texte = "1" Then
            temps = "0"
            Temps_Texte = 0
        End If
        Temps_Texte = str(CDbl(Temps_Texte) / 1000)
    End If
    
    DriveDistanceGoogleMaps = Temps_Texte
    travelDuration = CStr(temps)
    
    Set oHttpReq = Nothing

End Function
 

Discussions similaires

Statistiques des forums

Discussions
315 138
Messages
2 116 685
Membres
112 837
dernier inscrit
Sting