Ouvrir un fichier Excel OneDrive en VBA : chemin local, détection d’ouverture et co‑authoring

Besoin d’ouvrir automatiquement, via VBA, un fichier Excel stocké dans le même dossier OneDrive que votre macro ? Découvrez comment récupérer le chemin local fiable, vérifier si le classeur est déjà ouvert et contourner les limitations de Workbooks.Open sans jamais passer par l’URL HTTPS.

Sommaire

Pourquoi les chemins OneDrive posent problème en VBA ?

Quand votre classeur est synchronisé par OneDrive ou SharePoint, son adresse peut prendre deux formes :

  • Une URL distante comme https://d.docs.live.net/… (inutilisable par Workbooks.Open).
  • Un chemin physique dans le disque local, tel que C:\Users\Marie\OneDrive – Contoso\Reporting\.

Excel n’expose pas toujours le chemin physique : ThisWorkbook.Path renvoie parfois l’URL, parfois le dossier local, et la logique varie selon la version d’Office et le type de compte (perso vs. Entreprise). Résultat : la macro échoue souvent avec l’erreur « Fichier introuvable ».

Objectif et fil conducteur de la macro

  1. Obtenir le chemin local fiable du dossier OneDrive courant.
  2. Construire le chemin complet vers book.xlsx.
  3. Déterminer si le classeur est déjà ouvert pour éviter les doublons.
  4. Lancer Workbooks.Open uniquement si nécessaire.
  5. Gérer proprement les erreurs, le mode lecture seule et la co‑édition.

Étape 1 : localiser OneDrive par les variables d’environnement

Le client OneDrive (grand public ou Microsoft 365) renseigne plusieurs variables ; exploitez‑les d’abord, puis complétez par une détection avancée si besoin.

'Renvoie la racine locale OneDrive, sinon chaîne vide
Function GetOneDriveRoot() As String
    GetOneDriveRoot = Environ$("OneDrive")                 'Compte personnel
    If GetOneDriveRoot = "" Then _
        GetOneDriveRoot = Environ$("OneDriveCommercial")  'Compte pro/éducation
    If GetOneDriveRoot = "" Then _
        GetOneDriveRoot = Environ$("OneDriveConsumer")    'Cas plus rare
End Function

Pourquoi cette approche est robuste ?
Les variables ci‑dessus sont injectées par l’exécutable OneDrive dès qu’une synchronisation locale existe, quels que soient :

  • Le nom de l’utilisateur Windows.
  • Le nom (parfois long) de l’organisation Microsoft 365.
  • Le nombre de bibliothèques synchronisées simultanément.

Cas de plusieurs bibliothèques : choisir la bonne racine

Dans les environnements d’entreprise, l’utilisateur peut synchroniser plusieurs sites SharePoint/Teams ; ils s’affichent sous la forme C:\Users\utilisateur\OrgBibliothèque\. Si votre macro et book.xlsx cohabitent dans la même bibliothèque, ThisWorkbook.Path donnera déjà le sous-dossier adéquat ; il suffira d’en extraire la racine. Exemple :

'À partir du chemin du classeur courant,
'remonter jusqu’à la racine OneDrive correspondante
Function GetRootFromWorkbook() As String
    Dim p As String: p = ThisWorkbook.Path
    Do While InStr(p, " - ") > 0 And Right$(p, 1) <> "\"
        If Dir$(p, vbDirectory) <> "" And Dir$(p & "\*.lnk") <> "" Then Exit Do
        p = Left$(p, InStrRev(p, "\") - 1)
    Loop
    GetRootFromWorkbook = p
End Function

Conseil : si l’utilisateur change la bibliothèque cible, votre code restant basé sur ThisWorkbook.Path continuera de fonctionner sans qu’aucune variable d’environnement ne soit modifiée.

Étape 2 : construire le chemin complet de book.xlsx

Une fois la racine obtenue, assemblez le chemin relatif :

Function BuildTargetPath() As String
    Dim targetName As String: targetName = "book.xlsx"
    Dim basePath As String: basePath = ThisWorkbook.Path  'Même dossier que la macro
    BuildTargetPath = basePath & Application.PathSeparator & targetName
End Function

Vous pouvez aussi dériver le chemin relativement à la racine OneDrive si vos fichiers se trouvent dans différents sous‑dossiers mais restent dans la même bibliothèque.

Étape 3 : savoir si le classeur est déjà ouvert

Balayer la collection Workbooks vous évite d’ouvrir un doublon :

Function WorkbookIsOpen(ByVal fullName As String) As Boolean
    Dim wb As Workbook
    For Each wb In Application.Workbooks
        'Avec LCase pour neutraliser la casse, indispensable sous Windows
        If LCase$(wb.FullName) = LCase$(fullName) Then
            WorkbookIsOpen = True
            Exit Function
        End If
    Next wb
End Function

Étape 4 : ouvrir le fichier uniquement si nécessaire

Sub OpenCompanionBook()
    Dim fPath As String: fPath = BuildTargetPath()

```
If Dir$(fPath) = "" Then
    MsgBox "Fichier introuvable : " & fPath, vbExclamation, "Erreur d'accès fichier"
    Exit Sub
End If

If Not WorkbookIsOpen(fPath) Then
    Dim ref As Workbook
    On Error Resume Next
    Set ref = Workbooks.Open(fPath)   'Toujours le chemin local, jamais HTTPS
    On Error GoTo 0

    If ref Is Nothing Then
        MsgBox "Ouverture impossible. Le fichier est peut‑être verrouillé." _
               , vbExclamation, "Erreur d'ouverture"
    ElseIf ref.ReadOnly Then
        MsgBox "Le fichier a été ouvert en lecture seule. Une édition concurrente est probable.", _
               vbInformation, "Lecture seule"
    End If
End If
```

End Sub 

Tableau récapitulatif des bonnes pratiques

Étape cléRaisonFragment de code
Détecter la racine OneDriveAssure la portabilité entre comptes perso et proEnviron$("OneDrive") _ Or Environ$("OneDriveCommercial")
Utiliser le chemin localWorkbooks.Open refuse les URL HTTPSWorkbooks.Open "C:\Users\..."
Éviter les doublonsÉconomie de RAM & prévention des conflitsFor Each wb In Workbooks
Gérer Dir()Anticipe un éventuel désynchronisation localeIf Dir$(fPath) = "" Then ...
Tester ReadOnlyCouvre les scénarios de co‑authoringIf wb.ReadOnly Then ...

Étape 5 : anticiper les erreurs de synchronisation

Un fichier peut ne pas être encore téléchargé lorsque la macro s’exécute (icône de nuage dans l’Explorateur Windows). Appelez alors la commande Shell "attrib +U " & Chr(34) & fPath & Chr(34), vbHide pour forcer le « hydration » avant l’ouverture, ou invitez l’utilisateur à patienter.

Étape 6 : variantes avancées

6.1 – Ouverture asynchrone pour accélérer l’interface

Dans un formulaire ou un ruban Excel, lancer l’ouverture sur un thread dédié (API Windows CreateThread) évite le gel de l’UI si la connexion est lente. Cependant, VBA natif n’est pas thread‑safe ; réservez cette technique à des développeurs aguerris.

6.2 – Compatibilité Mac

Sous macOS, OneDrive monte les bibliothèques dans /Users/<utilisateur>/Library/CloudStorage/. Les variables d’environnement diffèrent. Ajoutez un test :

If Application.OperatingSystem Like "*Mac*" Then
    root = Environ$("HOME") &amp; "/Library/CloudStorage/OneDrive-" &amp; OrganizationName()
End If

6.3 – Gérer la suppression ou le renommage dynamique

  • Écoutez l’événement Workbook_BeforeClose pour vérifier que les modifications sont correctement synchronisées (propriété Workbook.SyncStatus en VBA : « syncDone », « syncInProgress », etc.).
  • Pour une bibliothèque Teams, vous pouvez lire la colonne de partage « Verrou » (fichier .lock) et prévenir l’utilisateur que le document est en co‑édition.

Comparaison des approches usuelles

MéthodeAvantagesInconvénientsRecommandé ?
Passer l’URL HTTPS à Workbooks.OpenSimplicité apparenteNe fonctionne pas hors web ; dépend du cache Office OnlineNon
Mapper OneDrive sur un lecteur réseau (Z:)Rend le chemin lisibleInterdit par la plupart des politiques IT ; peu fiable si plusieurs comptesNon, sauf environnement verrouillé
Utiliser ThisWorkbook.Path tel quelRapide si Excel renvoie déjà un chemin localImprévisible (URL vs. local) selon la version Office et l’état de synchronisationÀ condition de vérifier la forme renvoyée
Variables d’environnement OneDrive + test Dir()100 % local, portable, maintenableNécessite quelques lignes de code supplémentairesOui

Bonnes pratiques supplémentaires

  • Nommez explicitement les classeurs auxiliaires : évitez Book1, Report, choisissez un nom unique.
  • Signez votre macro pour échapper aux avertissements de sécurité et gagner la confiance des utilisateurs.
  • Journalisez chaque tentative d’ouverture (event log Windows ou simple fichier texte) ; en cas de conflit, le support pourra reproduire le scénario.
  • Testez Application.Version : le comportement de la co‑édition diffère entre Office 2016, 2019 et Microsoft 365.

FAQ rapide

La macro fonctionne chez moi mais pas chez un collègue ; pourquoi ?

Vérifiez qu’il a bien synchronisé la même bibliothèque OneDrive et que le fichier n’est pas marqué « disponible uniquement en ligne ». Utilisez la commande « Toujours conserver sur cet appareil » dans l’Explorateur Windows pour régler le problème.
Puis-je utiliser Workbook.Open() avec une URL HTTPS dans Office 2021 ?

Oui, mais uniquement si l’utilisateur est connecté à Internet et que Office ouvre le fichier via Office Online, ce qui introduit un délai et bloque la plupart des actions VBA. Préférez toujours le chemin local quand c’est possible.
Comment détecter si OneDrive est en pause ?

Le registre Windows maintient la clé HKCU\SOFTWARE\Microsoft\OneDrive\Accounts\Business1\Paused. Si la valeur est 1, avertissez l’utilisateur qu’aucune synchronisation n’a lieu et qu’il doit reprendre la synchronisation avant d’exécuter la macro.

Conclusion

En combinant :

  • Une détection fiable de la racine OneDrive,
  • Une construction dynamique du chemin local,
  • Un test d’ouverture préalable et des garde‑fous en cas d’erreur,

vous obtenez une macro résiliente, compatible avec les comptes personnels et professionnels, les bibliothèques SharePoint, et prête pour la co‑édition. Adoptez ces bonnes pratiques ; vos utilisateurs oublieront qu’Excel se trouve dans le cloud !

Sommaire