Excel VBAで「ActiveWorkbook.Path」 「ThisWorkbook.Path」コードが利用できなくなった時の対処方法

2024年4月29日

今まで、「ActiveWorkbook.Path」または「ThisWorkbook.Path」コードを使用して、開いているExcelファイルがあるフォルダーのパスを取得していましたが、突然「実行時エラー’76’: パスが見つかりません。」というエラーが表示されるようになり機能しなくなりました。調べてみると、OneDriveの設定で「ファイルのコラボレーション」の項目がなくなっていることに気づきました。

左が以前の画面、右が現在の画面ですが、以前まであった「ファイルのコラボレーション」欄がなくなっています。

これまでは、この設定を「オフ」にすることで問題なく利用できていましたが、設定できなくなってしまったようです。この問題については、以前にも対処方法を記載しましたが、自作した「UrlToLocal」関数を使用することで解決できますので試してみてください。

対処方法

以下のように「UrlToLocal」関数を使ってパスの変換を行います。
 xPath = UrlToLocal(ActiveWorkbook.Path)
 または、
 xPath = UrlToLocal(ThisWorkbook.Path)

「UrlToLocal」関数のコードについては下記の通りです。

Public Function UrlToLocal(ByRef Url As String) As String

   'OneDrive環境変数を格納する変数の定義
    Dim OneDrive As String

   'OneDrive環境変数の取得
    OneDrive = Environ("OneDrive")

   ' URLからローカルパスを作成する
    If Url Like "https://*" Then 'OneDriveのパスかどうかの判定
           
      '「https://・・・・・・・/Documents」までの文字数を取得
      'CharPosi = InStr(1, Url, "/Documents") + 10
      
      'ローカルパス作成
      'Url = OneDrive & Replace(Mid(Url, CharPosi), "/", Application.PathSeparator)
      
     '4番目の「/」の位置を取得
      Dim FourthSlashPosition As Long
      FourthSlashPosition = FindFourthSlashPosition(Url)
      
     'カレントディレクトリのパスを作成
      Url = OneDrive & Replace(Mid(Url, FourthSlashPosition), "/", Application.PathSeparator)
    
    Else
    
      'OneDriveのパス以外だったらカレントドライブ指定
      ChDrive Left(Url, 1)
     
    End If

  '作成したローカルパスを返す
   UrlToLocal = Url


End Function

'-----------------------------------------------------------------------------

'4番目の「/」の位置を求める関数
Function FindFourthSlashPosition(ByVal text As String) As Long
    Dim firstSlashPos As Long
    Dim secondSlashPos As Long
    Dim thirdSlashPos As Long
    Dim fourthSlashPos As Long
    firstSlashPos = InStr(1, text, "/")
    If firstSlashPos > 0 Then
        secondSlashPos = InStr(firstSlashPos + 1, text, "/")
        If secondSlashPos > 0 Then
            thirdSlashPos = InStr(secondSlashPos + 1, text, "/")
            If thirdSlashPos > 0 Then
                fourthSlashPos = InStr(thirdSlashPos + 1, text, "/")
                If fourthSlashPos > 0 Then
                    FindFourthSlashPosition = fourthSlashPos
                Else
                    ' 4番目の「/」が見つからなかった場合の処理
                    FindFourthSlashPosition = -1
                End If
            Else
                ' 3番目の「/」が見つからなかった場合の処理
                FindFourthSlashPosition = -1
            End If
        Else
            ' 2番目の「/」が見つからなかった場合の処理
            FindFourthSlashPosition = -1
        End If
    Else
        ' 最初の「/」が見つからなかった場合の処理
        FindFourthSlashPosition = -1
    End If
        
End Function

「UrlToLocal」関数の詳細につきましては、以前掲載した下記リンク先の記事を参照ください。
 https://scodebank.com/?p=696