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 :

ActiveWorkbook.Path et OneDrive


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Bâtiment

    Informations forums :
    Inscription : Novembre 2016
    Messages : 7
    Par défaut ActiveWorkbook.Path et OneDrive
    Avec la fonction VBA : ActiveWorkbook.Path
    quand je lançais ma macro qui dans le répertoire du OneDrive que j'ai synchronisé en local sur mon C:\Users\BalboDALI\OneDrive - SITE DEVT\00-Dev\PreparationDossier\macro.xlsm

    J'obtenais :
    C:\Users\BalboDALI\OneDrive - SITE DEVT\00-Dev\PreparationDossier
    Là depuis une mise à jour de microsoft windows10 il y a quelques jours de ça. quand je lance ma macro, la fonction VBA : ActiveWorkbook.Path me ramène le lien suivant sachant que je n'ai change le code de la macro.
    https://my.sharepoint.com/personal/s...arationDossier

    Je ne sais comment faire pour ne pas avoir ce lien hypertexte

  2. #2
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    Bonjour,
    j'ai eu le même problème
    et apparemment résolu en décochant cette option dans les paramètres de OneDrive:

    Nom : C1.JPG
Affichages : 9723
Taille : 23,6 Ko

    @+

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Par défaut
    Hello,

    La solution est rvToulon est possible, mais c'est déconseillé si vous utilisé l'espace de stockage à plusieurs simulnanéments (un des objectifs du cloud).

    la seule solution que j'ai trouvé jusqu'à présent et de modifier ton résultat pour arriver à un chemin local. On pourrait même en créer une fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim cheminOndeDrive As String
    Dim CheminLocal As String
     
    cheminOndeDrive = ActiveWorkbook.Path
    CheminLocal = Replace(cheminOndeDrive, _
       "https://my.sharepoint.com/personal/siteDev_com/Documents", _
       "C:\Users\BalboDALI\OneDrive - SITE DEVT")
     CheminLocal = Replace(CheminLocal, "/", "\")
     
    Debug.Print CheminLocal
    Cordialement
    Wouana

  4. #4
    Membre Expert Avatar de rvtoulon
    Homme Profil pro
    Agent Technique
    Inscrit en
    Mars 2009
    Messages
    1 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Agent Technique
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 042
    Par défaut
    Bonjour,
    l'utilité de ActiveWorkbook.path est de connaître le dossier qui contient le classeur actif, ainsi si le classeur change de dossier le nouvel emplacement sera connu lorsque le code sera lancé de nouveau.
    La solution de wouana19 est correct mais elle implique de mettre l'emplacement du fichier en dur dans le code.
    Et si son fichier change de Dossier? ou si un des collaborateurs change le fichier de place sur onedrive?

    Pour mon utilisation (pour le moment) je décoche, je fais fonctionner mes macros, je recoche si besoin.

    Quand est-il pour Devmartech?

  5. #5
    Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 3
    Par défaut
    Bonjour,

    Je viens de tomber sur cette discussion car j'y le même problème avec mes macros qui ne tourne plus si elles sont sur le disque local avec OneDrive.

    Après quelques recherches, voici ma solution de contournement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub test()
     
    BaseRacineOneDrive = Environ("OneDrive") & "\"
    chemin = ActiveWorkbook.fullname ' ActiveWorkbook.Path  ' pour avoir que le chemin
    C = InStr(1, chemin, "/Documents") + 10
    old_chemin = Left(chemin, C)
    New_Chemin = Replace(Replace(chemin, old_chemin, BaseRacineOneDrive), "/", "\") & "\"
    Debug.Print New_Chemin
     
    End Sub
    Il ne reste plus qu'à tester, en créer une function avec un test du style
    If left(chemin , 5 ) = "https" then
    les commandes ci-dessus
    else
    chemin
    end if

    En espérant que cela fonctionne pour vous

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Par défaut
    Bonjour,

    Oui j'étais passé un moment par cette solution qui fonctionnait bien.
    J'ai par la suite eu un soucis selon le poste utilisé car parfois il y a 2 paramétrages pour OneDrive (OneDrive privé et OneDrive professionnel).
    La commande Environ("OneDrive") prenait, si mes souvenir son bon, le premier OneDrive paramétré sur le poste.

    Mais si un seul OneDrive est installé cela fonctionne.

  7. #7
    Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 3
    Par défaut
    Oui effectivement, car de mon côté je n'ai pas fais de déploiement.

    Une idée comme ça, j'ai remarqué que la formule dans Excel "=INFORMATIONS("REPERTOIRE")" semble donnée le répertoire de base sans les sous dossiers.

    J'ai moi cela donne ça : C:\Users\Mon user\OneDrive - toto\Documents\

    A voir si on peut creuser de ce côté.

  8. #8
    Membre éclairé
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Par défaut
    Pas certain, chez moi cela donne le Répertoire du dossier Mes documents C:\Users\MonNom\Documents\

    … on va trouver une solution...

  9. #9
    Candidat au Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Mai 2020
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2020
    Messages : 3
    Par défaut
    Ok, voici mon code que je vais mettre en place.

    Dans première partie de mon code principale, je trouve le chemin, puis j'appel la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'Détermine le chemin du fichier de base
        chemin = ActiveWorkbook.Path & "\"
     Call Chemin_Local_VS_Onedrive(chemin)
    Voici le code de la fonction.
    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
    Function Chemin_Local_VS_Onedrive(Chemin_test As Variant) As Boolean
    Dim BaseRacineOneDrive As Variant, c As Integer, old_chemin As Variant, New_Chemin As Variant
     
    'Test chemin si OneDrive
    'Debug.Print Chemin_test
     
    If Left(Chemin_test, 6) = "https:" Then
     
    BaseRacineOneDrive = Environ("OneDrive") & "\"
    chemin = ActiveWorkbook.Path  '  ActiveWorkbook.FullName
    c = InStr(1, chemin, "/Documents") + 10
    old_chemin = Left(chemin, c)
    New_Chemin = Replace(Replace(chemin, old_chemin, BaseRacineOneDrive), "/", "\") & "\"
    Chemin_test = New_Chemin
    'Debug.Print New_Chemin
     
    Else
     
    End If
    End Function
    De mon côté, cela fonctionne aussi bien sur le C relié à Onedrive que non relié ainsi que sur un disque réseau.

    Concernant les possibilités de la commande "environ", voici le code pour voir toutes les variables possible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub TestEnviron()
    Sheets.Add
    On Error Resume Next
    For i = 1 To 64
    x = Split(Environ(i), "=")
    Range("A" & i) = x(0)
    Range("B" & i) = x(1)
    Next
    Columns("A:B").Columns.AutoFit
    End Sub
    Avec tout ça du doit trouver ton bonheur.

  10. #10
    Membre éclairé
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Par défaut
    En utilisant ta dernière procédure pour lister les "environ", j'ai justement plus résultats avec OneDrive :

    - OneDrive : C:\Users\MonUser\OneDrive - MaSociete
    - OneDriveCommercial : C:\Users\MonUser\OneDrive - MaSociete
    - OneDriveConsumer : C:\Users\MonUser\OneDrive

    Donc le résultat de Environ("OneDrive") te donne le chemin local pour ton OneDrive privé, mais chez moi c'est mon OneDrive Entreprise (Commercial).

    Donc oui tu peux utiliser tes procédures si tu as uniquement un OneDrive privé, mais attention si ton fichier sera utilisé sur un autre poste, pas certain que cela fonction.

  11. #11
    Invité de passage
    Homme Profil pro
    Supply Chain
    Inscrit en
    Septembre 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Supply Chain

    Informations forums :
    Inscription : Septembre 2021
    Messages : 1
    Par défaut Folder en format Windows d'un Folder Onedrive
    Bonjour,

    J'ai trouvé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L_Path = Evaluate("=INFO(" & Chr(34) & "directory" & Chr(34) & ")")
    Bonne soirée

  12. #12
    Membre éclairé Avatar de goninph
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2013
    Messages : 805
    Par défaut
    Bonjour,

    La fonction de Nicolas.joh fonctionne.

    Problème j'ai OneDrive et la fonction me renvoie le chemin du OneDrive que je ne veux pas

    Comment faire pour trouver l'autre chemin ?

    Je vous remercie
    Meilleures salutations
    Philippe

  13. #13
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Pour retrouver le chemin UNC à partir du chemin http :
    https://www.developpez.net/forums/d1.../#post10721957

  14. #14
    Membre éclairé
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Par défaut
    Hello Arkham,

    Je ne maitrise pas les fonctions avec les librairies API, il faudra vraiment m'y mettre un jour. Je vais chercher des tutos sur le sujet.

    J'avais cherché longtemps cette fonction qui permet de trouver le chemin UNC, merci pour ton partage.

    Par contre il me semble qu'il y a une petite erreur sur la page que tu mentionnes dans ton lien pour la version 64bits. la déclaration de la fonction devrait être en "Private Declare PtrSafe Function ...", non ?
    en effectuant un test cela fonctionne uniquement comme ceci.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #If VBA7 Then
    Private Declare PtrSafe Function DavGetUNCFromHTTPPath Lib "Netapi32.dll" (ByVal Url As LongPtr, ByVal UncPath As LongPtr, lpSize As Long) As Long
    #Else
    Private Declare Function DavGetUNCFromHTTPPath Lib "Netapi32.dll" (ByVal Url As Long, ByVal UncPath As Long, lpSize As Long) As Long
    #End If
    ++

  15. #15
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Citation Envoyé par wouana19 Voir le message
    Par contre il me semble qu'il y a une petite erreur sur la page que tu mentionnes dans ton lien pour la version 64bits. la déclaration de la fonction devrait être en "Private Declare PtrSafe Function ...", non ?
    en effectuant un test cela fonctionne uniquement comme ceci.
    Tout à fait, merci.
    J'ai corrigé le code dans la discussion mentionnée.

  16. #16
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 013
    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 013
    Par défaut
    Bonjour,
    Une question pour ma culture : pourquoi utiliser VBA7 et pas WIN64 pour savoir si l'on utilise une version 32 ou 64 bits ?
    Car de mémoire VBA7 peut être installé sur les deux versions ?

    Merci.

  17. #17
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    1 013
    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 013
    Par défaut
    Bonjour,
    J'ai trouvé l'explication sur la page de Microsoft (je ne peux pas donner le lien car avec mon téléphone c'est compliqué).
    Pour faire bref, tout remonte à la version Excel 2010 qui prend en charge la version 32 bits ou 64 bits d'excel (une nouveauté par rapport à Excel 2007 qui ne tourne qu'en 32 bits et utilise VBA version 6.0), y compris les API, détail important car une API peut dans ce cas utiliser des entiers sur 64 bits. Donc les ingénieurs ont trouvé une astuce pour que le VBA d'excel 2010 soit compatible 32 et 64 bits : faire une nouvelle version du VBA, nommée 7.0, qui inclut les déclarations PtrSafe et LongPtr. Ainsi Excel determine automatiquement s'il faut utiliser des entiers sur 32 ou 64 bits.
    C'est génial car le programmeur n'a à s'occuper de rien et ses API sont compatibles 32 et 64 bits.
    Reste un problème de compatibilité descendante avec les versions antérieures à 2010 d'Excel qui ne connaissent pas ces déclarations (PtrSafe et LongPtr). Il faut donc tester la version du VBA : Si VBA7 (VBA6 n'existe pas) est vrai alors on peut utiliser PtrSafe et LongPtr sinon on reste sur les déclarations classiques pour les API.
    En résumé : une compilation conditionnelle en 2010 (voire quelques années après) était certainement une bonne pratique à l'époque, mais en 2022 tester si un code est compatible avec une version vielle de 15 ans ou plus ne me semble pas vraiment pertinent.

    WIN64 reste indispensable pour certains cas où les structures des données sont différentes.

    Cordialement.

  18. #18
    Membre éclairé
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Décembre 2015
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Décembre 2015
    Messages : 93
    Par défaut
    Hello Laurent,

    Intéressant ta réflexion.
    Je ne savais pas qu'avec les nouvelles versions nous pouvions tout mettre en PtrSafe.
    Je viens de faire un test avec Office365 en 32 et en 64 bits, effectivement cette déclaration unique fonctionne dans les 2 cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Declare PtrSafe Function ChooseColor_Dlg Lib "comdlg32.dll" _
        Alias "ChooseColorA" (pcc As CHOOSECOLOR_TYPE) As LongPtr
    Merci pour cette mise au point. Cela permettra d'alléger le code lors d'utilisation d'API.

    ++

Discussions similaires

  1. [XL-2003] ActiveWorkbook.Path ne renvoie pas le chemin voulu
    Par Heflav dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 04/10/2010, 15h51
  2. Ajouter des chemins dans la variable PATH
    Par Righetto Dominique dans le forum Linux
    Réponses: 7
    Dernier message: 21/03/2004, 17h38
  3. récupérer le path system
    Par Eugénie dans le forum MFC
    Réponses: 4
    Dernier message: 22/12/2003, 13h03
  4. Réponses: 3
    Dernier message: 10/06/2003, 14h16
  5. Redhat-9 changer le path des databases
    Par jean christophe dans le forum Installation
    Réponses: 7
    Dernier message: 30/05/2003, 17h53

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