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.
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 parWorkbooks.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
- Obtenir le chemin local fiable du dossier OneDrive courant.
- Construire le chemin complet vers
book.xlsx
. - Déterminer si le classeur est déjà ouvert pour éviter les doublons.
- Lancer
Workbooks.Open
uniquement si nécessaire. - 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\Org – Bibliothè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é | Raison | Fragment de code |
---|---|---|
Détecter la racine OneDrive | Assure la portabilité entre comptes perso et pro | Environ$("OneDrive") _ Or Environ$("OneDriveCommercial") |
Utiliser le chemin local | Workbooks.Open refuse les URL HTTPS | Workbooks.Open "C:\Users\..." |
Éviter les doublons | Économie de RAM & prévention des conflits | For Each wb In Workbooks |
Gérer Dir() | Anticipe un éventuel désynchronisation locale | If Dir$(fPath) = "" Then ... |
Tester ReadOnly | Couvre les scénarios de co‑authoring | If 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") & "/Library/CloudStorage/OneDrive-" & 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éthode | Avantages | Inconvénients | Recommandé ? |
---|---|---|---|
Passer l’URL HTTPS à Workbooks.Open | Simplicité apparente | Ne fonctionne pas hors web ; dépend du cache Office Online | Non |
Mapper OneDrive sur un lecteur réseau (Z: ) | Rend le chemin lisible | Interdit par la plupart des politiques IT ; peu fiable si plusieurs comptes | Non, sauf environnement verrouillé |
Utiliser ThisWorkbook.Path tel quel | Rapide si Excel renvoie déjà un chemin local | Impré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, maintenable | Nécessite quelques lignes de code supplémentaires | Oui |
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 !