はじめに
Excel VBA などで同一フォルダにあるファイルにアクセスしようとしたとき、その Excel がOneDrive/SharePoint で共有されたフォルダに存在すると、URL 形式のファイルパスしか得られず、苦労した人は少なからずいることと思います。
Qiita においてもどうにか回避しようとする記事が散見されます。
例に漏れず、私もいろいろ苦労し、先人のお知恵も拝借しつつ、結論としては「根本的にはムリ」となりました。組織内に利用する人が少ない場合には、VBA はアドインで共有し、それを利用するブックは個人ごとに作成する、という運用にしたこともあります。
もう数年にわたって悩んできたわけですが、今日、偶然、ローカルパスを拾うことに成功しました。
この界隈の悩める方々にとって救世主になるかもしれないので、情報共有いたします。
肝は Application.ThisWorkbook.Path
さっそく、次のスクリプトを実行してみます。
Sub ローカルパスを得たい()
Debug.Print ActiveWorkbook.Path
Debug.Print Environ("OneDriveCommercial")
Debug.Print Environ("OneDriveConsumer")
Debug.Print Environ("OneDrive")
Debug.Print Environ("UserProfile")
Debug.Print Application.ThisWorkbook.Path
End Sub
結果です。
https://kojimafarmXXXXXXXX.sharepoint.com/sites/core/Shared Documents/2025
C:\Users\khoji\OneDrive - 小島農園
C:\Users\khoji\OneDrive
C:\Users\khoji\OneDrive - 小島農園
C:\Users\khoji
C:\Users\khoji\小島農園\コア - ドキュメント
ActiveWorkbook.Path
を始め、今まで試してきたさまざまなローカルパスを得るメソッドやプロパティは URL 形式になっちゃうんですが、なぜか Application.ThisWorkbook.Path
は Windows ファイルシステムパス形式になっています。
おわりに
公式情報は見つけられていませんし、いろいろな環境で試したわけでもありません。
なので、他の方の環境で使えるかどうかわかりませんが、悩める皆さまが少しでも救われるといいな、と思います。