OneDrive 下にエクセルのブックを置いておくと、当該ブックの Path が正常に取得できなくなる現象が発生する場合があります。
具体的には、
- VBA で ThisWorkbook.Path 等が
"https://d.docs.live.net/<cid>/ドキュメント/~"
のようになってしまう - セルに数式で「=CELL("filename")」とした場合にも同様
のような不具合が発生します。
解消方法を探してみましたが抜本的なものはなく、対策はどれも一長一短があるようです。
もっとよい方法があれば教えてください。
Office アプリケーションを使用して、開いた Office ファイルを同期する設定を無効化します。
※参考: Thisworkbook.PathがURLを返すようになった時の対応 - Excelが大好きだ!
同期を無効化することになるので、Office ドキュメントの共同編集および共有を行っている場合には問題が発生しそうです。
今のところこの問題が発生するのは OneDrive 下に置いた場合のみのようなので、問題が発生するマクロ有効ブックは OneDrive 下に置かないようにします。
ブックを開くときに ThisWorkbook.Path をチェックして該当する場合には警告を出すようなコードを仕込んでおくのもよいかもしれません。
OneDrive 下に置かない(もしくは OneDrive 自体を無効化してローカルフォルダとして使う)ことになるので、バックアップや共有などで支障がでるでしょう。
ユーザーの OneDrive フォルダへのシンボリックリンクもしくはジャンクションを作成し、以降はそこ経由でマクロ有効ブック等を読み込む(直接 OneDrive は触らない)ようにすれば、OneDrive の設定変更やマクロの修正等は不要のようです。
サンプルとして、このバッチファイル(MakeOneDriveLink.bat)を右クリック→名前を付けてリンク先を保存にてダウンロード(拡張子は.batにしておくこと)したものを実行すれば、OneDriveフォルダが存在する場合にユーザーフォルダ直下にそれにリンクした「OneDrive.Work」というジャンクションが作成されます(ただし、現状、複数アカウントを想定していませんのでご注意ください。個人向けと法人向けの両方がある場合、OneDrive.Workは法人向けOneDriveへリンクされ、個人向けアカウントは無視されます)。
OneDrive の設定はそのままにできますが、誤って元の OneDrive フォルダ下で作業してしまうと意味がありません。
対策2.でも例示したブックを開くときに ThisWorkbook.Path をチェックして該当する場合には警告を出すようなコードを仕込んでおく等、何らかの対策が必要でしょう。
ThisWorkbook.Path 等が URL("https://~"
)だった場合にそれをローカルのファイルパスに置換するような Function がいくつか公開されているので、それを用います。
- vba - Excel's fullname property with OneDrive - Stack Overflow
- how to get physical path instead of URL (OneDrive)
- [VBA]OneDriveで同期しているファイルまたはフォルダのURLをローカルパスに変換する関数 | 黒い箱の中
コードの修正が必要なため、ブックの .Path や .FullName 等があちこちで使われている場合には修正と動作確認が面倒なことになりそうです。