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 :

Variable de texte dans une function


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club Avatar de Electro02
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Avril 2018
    Messages : 31
    Points : 8
    Points
    8
    Par défaut Variable de texte dans une function
    Bonjour.

    Voici mon souci.

    Parmi d'autres, j'utilise ce bout de code, dans une fonction, pour la création d'un distancier Excel usant des API de Google 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
    Function AversB(A As String, B As String) As deAaB
    
    Dim Depart As String, Arrivee As String, Site As String
    Dim Json As Object, Elem As Object, Elem1 As Object
    Dim ok As Boolean
    
        With Sheets("Distancier_via_GoogleMaps")
            Depart = SupprCaracSpe(A)
            Arrivee = SupprCaracSpe(B)
            
            On Error Resume Next
            Site = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" & Depart & "&destinations=" & Arrivee & "&mode=driving&language=fr-FR&key=XxXXx_XXXxX_xxXXx_XxXxX"
            Set Json = oRecordSet(Site)
    
            For Each Elem In Json.rows
                For Each Elem1 In Elem.elements
                    ok = Not (Elem1.status = "ZERO_RESULTS")
                    AversB.dist = Elem1.distance.Value / 1000
                    AversB.duree = Elem1.duration.Value / 24 / 60 / 60
                Next Elem1
            Next Elem
    
            ScriptControl.AddCode "Object.prototype.item=function( i ) { return this[i] } ; "
            AversB.ptA = Json.origin_addresses.item(0)
            AversB.ptB = Json.destination_addresses.item(0)
    
            If Not ok Then
                AversB.dist = 0
                AversB.duree = 0
            End If
    
            Set Json = Nothing
        
        End With
        
    End Function
    Ce code, associé à d'autres FUNCTION et à une SUB, fonctionne à merveille... et même encore il y a quelques jours si on supprimait la clé API personnelle (key=)

    Mais depuis quelques jours, les API Google Maps sont (presque) plus gratuites, et mon outil doit être utilisé par plusieurs personnes, dans des lieux différents.
    Je n'ai pas envie de partager ma clé API perso avec tous et payer pour les autres lol... et l'utilisation en mode "anonyme" ne fonctionne plus donc.

    Dans mon fichier Excel, j'ai donc ajouter une cellule dans une autre feuille, où il est demandé à l'utilisateur de saisir sa clé API.

    Sauf que je n'arrive pas à l'intégrer dans mon code Function que je vous ai présenté... J'avais pensé à l'ajout d'une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (...)
    Dim API_Perso As String
    API_Perso = Range("A1").Value   'ou Cells(1, 1).Value
    
    (...)
    
    Site = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" & Depart & "&destinations=" & Arrivee & "&mode=driving&language=fr-FR&key=" & API_Perso
    
    (...)
    Mais cela ne fonctionne pas... Je débute dans les macros, mais je crois bien que je ne peux pas déclarer la valeur d'une cellule dans une variable, et l'utiliser comme dans un Sub, non ?

    J'avais pensé à une macro qui copie-coller le contenu "texte" d'une cellule directement au sein de la macro suivante (genre j'insère ma ligne 'site = "https://......' avec la clé en cellule A1 et une première macro me copie le texte en ligne 12 de la macro suivante, qui contient le code 'FUNCION', dans le Module 1 VBA... Mais je ne sais pas si c'est possible.

    Y a t-il une solution concrète ? Laquelle ? Comment ?

    Merci mille fois !

  2. #2
    Futur Membre du Club Avatar de Electro02
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Avril 2018
    Messages : 31
    Points : 8
    Points
    8
    Par défaut
    Si ça peut aider : le code complet dans mon Module 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Option Explicit
     
    Public ScriptControl As Object
     
    Public Type deAaB
        ptA As String
        ptB As String
        dist As Single
        duree As Single
    End Type
    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
     
    Sub Serie()
    Dim Tdata As Variant, lg As Long, i As Long
    Dim Trajet As deAaB
     
    Range("J1").Value = "Veuillez patienter svp..."
     
        With Sheets("Distancier_via_GoogleMaps")
            lg = .Cells(rows.Count, "A").End(xlUp).row
            Tdata = .Range(.Cells(2, "A"), .Cells(lg, "F")).Value
     
            For i = 1 To lg - 1
                Trajet = AversB(SupprCaracSpe(Tdata(i, 1)), SupprCaracSpe(Tdata(i, 2)))
                Tdata(i, 5) = Trajet.ptA
                Tdata(i, 6) = Trajet.ptB
                Tdata(i, 3) = 1 * Format(Trajet.dist, "# ###.00")
                Tdata(i, 4) = Trajet.duree
            Next i
     
            .Range("A2").Resize(UBound(Tdata, 1), UBound(Tdata, 2)) = Tdata
        End With
     
        Range("J1").Value = "Cliquez sur ETAPE 2 svp"
     
    End Sub
    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
     
    Function SupprCaracSpe(Sv As Variant) As String
     
    Dim S As String
     
        S = CStr(Sv)
        S = Replace(S, "'", " ")
        S = Replace(S, "L ", "")
        S = Replace(S, "â", "a")
        S = Replace(S, "à", "a")
        S = Replace(S, "ä", "a")
        S = Replace(S, "ê", "e")
        S = Replace(S, "é", "e")
        S = Replace(S, "è", "e")
        S = Replace(S, "ë", "e")
        S = Replace(S, "ï", "i")
        S = Replace(S, "ô", "o")
        S = Replace(S, "ö", "o")
        S = Replace(S, "û", "u")
        S = Replace(S, "ù", "u")
        S = Replace(S, "ü", "u")
     
        SupprCaracSpe = S
     
    End Function
    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
     
    Function AversB(A As String, B As String) As deAaB
     
    Dim Depart As String, Arrivee As String, Site As String
    Dim Json As Object, Elem As Object, Elem1 As Object
    Dim ok As Boolean
     
        With Sheets("Distancier_via_GoogleMaps")
            Depart = SupprCaracSpe(A)
            Arrivee = SupprCaracSpe(B)
     
            On Error Resume Next
            Site = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" & Depart & "&destinations=" & Arrivee & "&mode=driving&language=fr-FR&key=XXXXX_XXXXX_XXXXX_XXXXX"
            Set Json = oRecordSet(Site)
     
            For Each Elem In Json.rows
                For Each Elem1 In Elem.elements
                    ok = Not (Elem1.status = "ZERO_RESULTS")
                    AversB.dist = Elem1.distance.Value / 1000
                    AversB.duree = Elem1.duration.Value / 24 / 60 / 60
                Next Elem1
            Next Elem
     
            ScriptControl.AddCode "Object.prototype.item=function( i ) { return this[i] } ; "
            AversB.ptA = Json.origin_addresses.item(0)
            AversB.ptB = Json.destination_addresses.item(0)
     
            If Not ok Then
                AversB.dist = 0
                AversB.duree = 0
            End If
     
            Set Json = Nothing
     
        End With
     
    End Function
    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
     
    Function oRecordSet(txt As String, Optional www As Boolean = True) As Object
     
    Dim Html As Object, Obj As Object
    Dim S As String
     
        Set ScriptControl = CreateObject("MSScriptControl.ScriptControl")
        ScriptControl.Language = "JScript"
     
        If www Then
            Set Html = CreateObject("MSXML2.XMLHTTP")
            With Html
            .Open "GET", txt, False
            .send
            S = .responsetext
            End With
        Else
            S = txt
        End If
     
        Set Obj = ScriptControl.Eval("(" & S & ")")
        Set oRecordSet = Obj
        Set Obj = Nothing
     
    End Function

  3. #3
    Futur Membre du Club Avatar de Electro02
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Avril 2018
    Messages : 31
    Points : 8
    Points
    8
    Par défaut
    Je me débrouillerai donc sans votre aide :-(

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par Electro02 Voir le message
    Dans mon fichier Excel, j'ai donc ajouter une cellule dans une autre feuille, où il est demandé à l'utilisateur de saisir sa clé API.

    Sauf que je n'arrive pas à l'intégrer dans mon code Function que je vous ai présenté... J'avais pensé à l'ajout d'une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (...)
    Dim API_Perso As String
    API_Perso = Range("A1").Value   'ou Cells(1, 1).Value
    
    (...)
    
    Site = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=" & Depart & "&destinations=" & Arrivee & "&mode=driving&language=fr-FR&key=" & API_Perso
    
    (...)
    Mais cela ne fonctionne pas... Je débute dans les macros, mais je crois bien que je ne peux pas déclarer la valeur d'une cellule dans une variable, et l'utiliser comme dans un Sub, non ?
    A priori, ton code est correct même si, perso, j'aurais plutôt écrit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    API_Perso = Range("A1").Text
    Fais un Debug.Print Site juste après ton Site = ... et regarde ce que ça donne dans le fenêtre d'exécution pour vérifier si l'adresse construite est correcte.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Futur Membre du Club Avatar de Electro02
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Avril 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Avril 2018
    Messages : 31
    Points : 8
    Points
    8
    Par défaut
    Non le code ne fonctionnait pas en ajoutant une variable de clé API.
    Mais le souci venait des fonctions et de la gestion Json.
    Le souci a été résolu.

    Merci en tout cas.

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

Discussions similaires

  1. [vb-net] Recherche de texte dans une variable
    Par skaraa dans le forum Windows Forms
    Réponses: 5
    Dernier message: 17/09/2007, 16h48
  2. Enregistrer la saisie d'un text dans une variable.
    Par dazed_dive dans le forum Flash
    Réponses: 4
    Dernier message: 16/04/2007, 10h57
  3. Réponses: 3
    Dernier message: 06/09/2006, 09h06
  4. Variables de Sessions crées dans une Function perdues
    Par vampiloup dans le forum Langage
    Réponses: 7
    Dernier message: 12/01/2006, 16h50
  5. Plusieurs lignes de texte dans une variable texte
    Par Loko dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 15/12/2005, 12h51

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