OneDrive 使用時に ThisWorkbook.Path でパスを取得できない問題

Excel VBA では、そのコードが記述されているエクセルファイル自体が存在するフォルダー名を取得するときに ThisWorkbook.Path を使用します。

同じフォルダー内にあるデータファイルにアクセスする際など、使用する機会が多いコードなので ThisWorkbook.Path 自体は説明するまでもないはず。しかしながらフォルダーが OneDrive と同期されている場合、このコードでは不具合が発生します。

例えば、ThisWorkbook.Path でフォルダー名を取得し、そのフォルダー内にあるファイルを開こうとすると以下のエラーが表示されます。

この原因は、OneDrive と同期されていないフォルダーに置いたときには不具合が発生しないことから特定できました。

取得されたフォルダー名を表示させてみればわかりますが、通常であれば “C:\Users\~” のようなローカルドライブ名が取得されるはずなのに対し、OneDrive と同期されたフォルダーでは “https://d.docs.live.net/~” のような URL 表示となっています。これが不具合の原因です。

OneDrive との同期を外せば問題なく動作するようになりますが、さすがにそれは現実的ではないので、両方のケースで不具合が起きなくなるような対応が必要です。

方法はいくつか考えられますが、簡単なのは OneDrive という環境変数を取得し、 URL 表示されたフォルダー名の一部を置き換えるというものです。

コマンドプロンプトを起動し、”SET” と入力して Enter キーを押すと環境変数の一覧が表示されますが、その中に OneDrive という項目があります。ここにローカルフォルダー名が設定されているため、この文字列に置き換えてやればいいわけです。

コードの一例は、以下の通り。ThisWorkbook.Path で取得した文字列の最初の4文字が “http” の場合、4つ目のスラッシュまでを環境変数から取得した文字列に置き換えています。

使用方法は、”ThisWorkbook.Path” の代わりに “Get_OneDrivePath(ThisWorkbook.Path)” を使うだけです。

Function Get_OneDrivePath(ByVal ThisWorkBook_Path As String)

    'OneDrive 使用時にファイルのパスがURLとなる問題への対処

    If LCase(Left(ThisWorkBook_Path, 4)) <> "http" Then
        Get_OneDrivePath = ThisWorkBook_Path
        Exit Function
    End If

    Dim OneDrivePath As String, N_Slash As Integer

    '環境変数からOneDriveのフォルダを取得
    OneDrivePath = Environ("OneDrive")

    '4つ目のスラッシュまでをOneDriveフォルダ名に置換え
    N_Slash = 0
    For i = 1 To Len(ThisWorkBook_Path)
    If Mid(ThisWorkBook_Path, i, 1) = "/" Then
        N_Slash = N_Slash + 1
    End If
    If N_Slash = 4 Then
        Get_OneDrivePath = OneDrivePath & "\" & Mid(ThisWorkBook_Path, i + 1)
        Exit For
    End If
    Next i

End Function

ただし、環境変数から取得しているため OneDrive という環境変数が存在しない場合は機能しません。通常は OneDrive のはずですが、PCによっては異なっているかもしれないため、動作しない場合は自身の環境を確認してください。