Skip to content

Instantly share code, notes, and snippets.

@furyutei
Last active October 15, 2021 01:51
Show Gist options
  • Save furyutei/20902048fe029c169aa29db9ae23f603 to your computer and use it in GitHub Desktop.
Save furyutei/20902048fe029c169aa29db9ae23f603 to your computer and use it in GitHub Desktop.
[Excel][VBA] OneDrive 下に置いたブックの Path がおかしくなる不具合とその対策

[Excel][VBA] OneDrive 下に置いたブックの Path がおかしくなる不具合とその対策

OneDrive 下にエクセルのブックを置いておくと、当該ブックの Path が正常に取得できなくなる現象が発生する場合があります。

具体的には、

  • VBA で ThisWorkbook.Path 等が "https://d.docs.live.net/<cid>/ドキュメント/~" のようになってしまう
  • セルに数式で「=CELL("filename")」とした場合にも同様

のような不具合が発生します。

解消方法を探してみましたが抜本的なものはなく、対策はどれも一長一短があるようです
もっとよい方法があれば教えてください

対策

1. Office ファイルの同期を無効化する

Office アプリケーションを使用して、開いた Office ファイルを同期する設定を無効化します。
※参考: Thisworkbook.PathがURLを返すようになった時の対応 - Excelが大好きだ!

同期を無効化することになるので、Office ドキュメントの共同編集および共有を行っている場合には問題が発生しそうです。

2. 該当ブックを OneDrive 下に置かない

今のところこの問題が発生するのは OneDrive 下に置いた場合のみのようなので、問題が発生するマクロ有効ブックは OneDrive 下に置かないようにします。
ブックを開くときに ThisWorkbook.Path をチェックして該当する場合には警告を出すようなコードを仕込んでおくのもよいかもしれません。
ブックのPathがおかしい場合に警告

OneDrive 下に置かない(もしくは OneDrive 自体を無効化してローカルフォルダとして使う)ことになるので、バックアップや共有などで支障がでるでしょう。

3. OneDrive フォルダへのシンボリックリンク(ジャンクション)を作成する

ユーザーの OneDrive フォルダへのシンボリックリンクもしくはジャンクションを作成し、以降はそこ経由でマクロ有効ブック等を読み込む(直接 OneDrive は触らない)ようにすれば、OneDrive の設定変更やマクロの修正等は不要のようです。

サンプルとして、このバッチファイル(MakeOneDriveLink.bat)を右クリック→名前を付けてリンク先を保存にてダウンロード(拡張子は.batにしておくこと)したものを実行すれば、OneDriveフォルダが存在する場合にユーザーフォルダ直下にそれにリンクした「OneDrive.Work」というジャンクションが作成されます(ただし、現状、複数アカウントを想定していませんのでご注意ください。個人向けと法人向けの両方がある場合、OneDrive.Workは法人向けOneDriveへリンクされ、個人向けアカウントは無視されます)。

OneDrive の設定はそのままにできますが、誤って元の OneDrive フォルダ下で作業してしまうと意味がありません。
対策2.でも例示したブックを開くときに ThisWorkbook.Path をチェックして該当する場合には警告を出すようなコードを仕込んでおく等、何らかの対策が必要でしょう。

4. OneDrive の URL をローカルのファイルパスに変換するようにコードを修正する

ThisWorkbook.Path 等が URL("https://~")だった場合にそれをローカルのファイルパスに置換するような Function がいくつか公開されているので、それを用います。

コードの修正が必要なため、ブックの .Path や .FullName 等があちこちで使われている場合には修正と動作確認が面倒なことになりそうです。

ソースコード

Option Explicit
Private Sub Workbook_Open()
Call IsIllegalPath(ShowMessage:=True)
End Sub
Public Function IsIllegalPath(Optional TargetWorkbook As Workbook, Optional ShowMessage As Boolean = False) As Boolean
With IIf(TargetWorkbook Is Nothing, Me, TargetWorkbook)
If Not .Path Like "https:*" Then Exit Function
IsIllegalPath = True
If Not ShowMessage Then Exit Function
Call MsgBox( _
"このマクロ有効ブック(" & .Name & ")は現在のフォルダ" & vbLf & _
.Path & vbLf & _
"では正常に動作しません" & vbLf & vbLf & _
"【 Office と同期している OneDrive 下には置かないでください 】", _
vbCritical, _
"配置フォルダエラー" _
)
End With
End Function
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment