Recherche & référence Alternative à Environ() en VBA : détection fiable des dossiers avec OneDrive

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

dysorthographie

XLDnaute Accro

💡 Fonction personnalisée VBA : Obtenir les dossiers spéciaux Windows, compatible OneDrive​


Bonjour à tous,


Je partage ici une fonction VBA que j’ai développée pour obtenir le chemin des dossiers spéciaux Windows (comme le Bureau, Mes Documents, Musique, etc.), de façon fiable même lorsque OneDrive est activé.




📌 Pourquoi cette méthode ?​


La fonction Environ("USERPROFILE") ou Environ("OneDrive") ne donne pas toujours le chemin réel utilisé par Windows, surtout lorsque OneDrive redirige certains dossiers comme Desktop ou Documents.


Pour pallier ce problème, j’utilise l’objet Shell.Application qui interroge directement le système via son interface COM, garantissant ainsi le chemin réel, à jour et correct, quel que soit le contexte.




🔧 Exemple de code​


VB:
Enum ConstEnviron
    DESKTOP = &H0         '   Bureau global (tous les utilisateurs)
    INTERNET = &H1        '   Internet Explorer
    PROGRAMS = &H2        '   Menu Démarrer\Programmes
    Controls = &H3        '   Panneau de configuration
    PRINTERS = &H4        '   Imprimantes
    PERSONAL = &H5        '   Documents (anciennement Mes documents)
    FAVORITES = &H6       '   Favoris Internet
    STARTUP = &H7         '   Menu Démarrer\Démarrage
    RECENT = &H8          '   Documents récents
    SENDTO = &H9          '   Envoyer vers...
    BITBUCKET = &HA       '   Corbeille
    STARTMENU = &HB       '   Menu Démarrer principal
    MYMUSIC = &HD         '   Musique
    MYVIDEO = &HE         '   Vidéos
    DESKTOPDIRECTORY = &H10       '   Bureau utilisateur actuel (dossier physique)
    DRIVES = &H11         '   Poste de travail (Ce PC)
    NETWORK = &H12        '   Réseau
    NETHOOD = &H13        '   Voisinage réseau
    Fonts = &H14      '   Dossier des polices
    TEMPLATES = &H15      '   Modèles
    COMMON_STARTMENU = &H16       '   Menu Démarrer pour tous les utilisateurs
    COMMON_PROGRAMS = &H17        '   Programmes pour tous les utilisateurs
    COMMON_STARTUP = &H18         '   Démarrage pour tous les utilisateurs
    COMMON_DESKTOPDIRECTORY = &H19        '   Bureau global (dossier)
    APPDATA = &H1A        '   Données d’application (Roaming)
    PRINTHOOD = &H1B      '   Voisinage d'impression
    LOCAL_APPDATA = &H1C      '   Données locales de l’application (non-roaming)
    ALTSTARTUP = &H1D         '   Alternative au Démarrage (non utilisé souvent)
    COMMON_ALTSTARTUP = &H1E      '   Alternative Démarrage global
    COMMON_FAVORITES = &H1F       '   Favoris partagés
    INTERNET_CACHE = &H20         '   Cache Internet Explorer
    COOKIES = &H21        '   Cookies
    HISTORY = &H22        '   Historique Internet Explorer
    COMMON_APPDATA = &H23         '   Données d’application partagées (ProgramData)
    Windows = &H24        '   Dossier Windows
    SYSTEM = &H25         '   Dossier System32
    PROGRAM_FILES = &H26      '   Program Files
    MYPICTURES = &H27         '   Images
    PROFILE = &H28        '   Profil utilisateur
    SYSTEMX86 = &H29      '   System32 32 bits sur OS 64 bits
    PROGRAM_FILESX86 = &H2A       '   Program Files (x86)
    PROGRAM_FILES_COMMON = &H2B       '   Program Files\Common Files
    PROGRAM_FILES_COMMONX86 = &H2C        '   Program Files (x86)\Common Files
    COMMON_TEMPLATES = &H2D       '   Modèles partagés
    COMMON_DOCUMENTS = &H2E       '   Documents partagés
    COMMON_ADMINTOOLS = &H2F      '   Outils d’administration partagés
    ADMINTOOLS = &H30         '   Outils d’administration utilisateur
    Connections = &H31        '   Connexions réseau
    COMMON_MUSIC = &H35       '   Musique partagée
    COMMON_PICTURES = &H36        '   Images partagées
    COMMON_VIDEO = &H37       '   Vidéos partagées
    RESOURCES = &H38      '   Ressources (thèmes, sons, etc.)
    RESOURCES_LOCALIZED = &H39        '   Ressources localisées
    COMMON_OEM_LINKS = &H3A       '   Liens OEM (constructeur)
    CDBURN_AREA = &H3B        '   Zone de gravure de CD
    COMPUTERSNEARME = &H3C        '   Ordinateurs à proximité
End Enum
    Function MyEnviron(env As ConstEnviron) As String
    MyEnviron = CreateObject("Shell.Application").Namespace(CLng(env)).Self.Path
End Function
    Private Sub test()
    Debug.Print MyEnviron(PROGRAMS)
End Su



✅ Avantages​


  • Compatible avec OneDrive et les redirections système
  • Ne dépend pas des variables d’environnement parfois obsolètes
  • Facile à intégrer dans vos projets Excel
 


Bonjour,


Dans Excel :


  1. Appuie simultanément sur [Alt] + [F11] pour ouvrir l’éditeur VBA.
  2. Avec la souris, fais un clic droit sur le projet VBA.
  3. Ajoute un module standard.
  4. Copie-colle le code.
  5. Adapte la procédure Sub Test à ton utilisation.

Remarque :
J’ai écrit Private Sub Test car j’ai l’habitude d’utiliser ce type de procédure pour mes tests. En effet, il arrive fréquemment qu’Excel signale une ambiguïté si une procédure nommée Test existe déjà, d’où l’utilisation de Private.



Notes que la fonction MyEnviron dispose d'une inscription instinctive pour déterminer le Nom du répertoire à retourner.
 
bonsoir robert
il serait intéressant d'explorer d'autres object/membre
du genre par exemple
VB:
Sub ttt()

Set WshShell = CreateObject("WScript.Shell")
For i = 0 To WshShell.SpecialFolders.Count - 1
     Cells(i + 1, 1) = i
     Cells(i + 1, 2) = "&H" & Hex(i)
     Cells(i + 1, 3) = WshShell.SpecialFolders(i)
Next
End Sub
sans oublier le membre "ExpandEnvironmentStrings" du même object

et comme le namesspace ne fonctionnera pas partout selon le Windows avec les address numérique que tu donne une gestion d'erreur serait la bienvenue je pense
VB:
Function MyEnviron(env As ConstEnviron) As String
 On Error Resume Next
    Dim lPatH As Object
    Set lPatH = CreateObject("Shell.Application").Namespace(CLng(env))
    If Not lPatH Is Nothing Then
        MyEnviron = lPatH.Self.Path
    Else
        MyEnviron = "N/A"
    End If
    On Error GoTo 0
End Function
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour