通常、ThisWorkbook.Pathを使えば自分自身の格納ディレクトリのパスを取得できますが、OneDriveで同期しているファイルの場合、OneDrive上のURLが返却されます。
(例:)
https://アカウント名-my.sharepoint.com/personal/・・・
※パスは、法人向け(OneDrive for Business)か個人向けかでドメイン部分が異なるようです
調べてみた結果、以下サイトで公開している関数が一番スマートな対処法でした。
[VBA]OneDriveで同期しているファイルまたはフォルダのURLをローカルパスに変換する関数 | 黒い箱の中
ポイントは以下の3点。
- 環境変数を取得するVBAのEnviron関数を使って、OneDriveのローカルパスを取得
- URLは法人向けと個人向けがあるのでそれぞれURLのパターンで判別
- URLの後半("/Documents")以降は、OneDrive内のフォルダ階層をURLで表現しているので、"/Documents"以降を抜き出しつつ"/"を""に変換して連結