課題・悩み「OneDriveフォルダを対象にVBAマクロを実行するとエラーが出る」
解決策「Excel VBAを使ってファイルパスを動的に取得する方法」を解説
クラウドストレージサービスの普及に伴い、Excel VBAでもOneDriveに保存されたファイルを扱う機会が増えています。
しかし、OneDriveのパスを使用するとエラーが発生することが多く、その原因を理解して適切に対処することが重要です。
この記事では、Excel VBAでOneDriveパスを使用する際のエラーの原因とその対処方法について詳しく解説します。
Excel VBAを使ってファイルパスを動的に取得する方法を具体的なコードと共に解説します。
【Excel VBAを使ってファイルパスを動的に取得する方法】を図解で解説しています。
VBAのパスをOneDriveにするとエラーが発生する
VBAでOneDrive上にあるフォルダやファイルを対象に処理を実行すると、パスが正しいにも関わらす、エラーが発生することがあります。
[Excel][VBA] OneDrive 下に置いたブックの Path がおかしくなる不具合とその対策 · GitHub
OneDriveのパスの特徴
OneDriveは、クラウドストレージサービスとして、ファイルをインターネット上に保存し、複数のデバイスからアクセスできるようにします。
しかし、この利便性の裏で、ローカルパスとは異なる扱いが必要な場合があります。
OneDriveパスでエラーが発生する理由
Excel VBAでOneDriveパスを使用するとエラーが発生する主な理由は以下の通りです。
パスの同期
OneDriveではファイルがクラウドと同期されますが、同期が完全に終わっていない場合や、ファイルがオンラインのみの状態になっている場合、VBAからそのファイルにアクセスしようとするとエラーが発生します。
特殊文字と長いパス
OneDriveのパスには特殊文字が含まれることがあります。
また、OneDriveのディレクトリ構造が深くなると、パスが非常に長くなり、Windowsのファイルパスの制限に引っかかることがあります。
これにより、ファイルへのアクセスが拒否されることがあります。
アクセス権限
OneDrive上のファイルは、アクセス権限がローカルファイルとは異なる場合があります。
特定のユーザーしかアクセスできないファイルに対してVBAでアクセスしようとすると、権限エラーが発生することがあります。
OneDriveでVBAマクロを使用するためのコード
取得したフルパスが「https」から始まっていた場合は、パソコンに教えてもらったパスに「OneDrive」というパスを繋げてフルパスに修正する必要があります。
Function GetFullPath(workbookPath As String) As String
Dim fullPath As String
If Left(workbookPath, 5) = "https" Then
fullPath = Environ("UserProfile") & "\OneDrive"
Else
fullPath = workbookPath
End If
GetFullPath = fullPath
End Function
unction GetFullPath(workbookPath As String) As String
Dim fullPath As String
If Left(workbookPath, 5) = "https" Then
fullPath = Environ("UserProfile") & "\OneDrive"
Else
fullPath = workbookPath
End If
GetFullPath = fullPath
End Function
新たな処理の追加
フルパス対策サブルーチン
ThisWorkbook.PathがOneDrive上のパスかどうかをチェックします。
httpsで始まる場合はEnviron(“UserProfile”) & “\OneDrive”に変更します。
それ以外の場合はThisWorkbook.Pathを使用します。
フォルダ作成サブルーチンへの適用
basePathをこの新しいパスに変更し、既存のフォルダ作成ロジックを適用します。
関数「GetFullPath」とは?
「GetFullPath」関数は、指定されたファイルパスがOneDrive上にある場合とローカルにある場合とで適切なパスを返す関数です。
この関数を使用することで、ファイルの場所に応じた正しいパスを動的に取得することができます。
コードの詳細解説
変数の宣言
最初に、返り値を格納するための変数 fullPath を宣言します。
Dim fullPath As String
条件分岐によるパスの判定
次に、指定されたパス workbookPath が「https」で始まるかどうかを判定します。
この判定によって、OneDrive上のパスかローカルのパスかを識別します。
If Left(workbookPath, 5) = "https" Then
OneDriveのパスを取得
workbookPath が「https」で始まる場合、OneDrive上のパスと判断し、環境変数 UserProfile を使用してOneDriveのパスを構築します。
fullPath = Environ("UserProfile") & "\OneDrive"
ローカルパスの取得
workbookPath が「https」で始まらない場合は、ローカルパスと判断し、そのまま workbookPath を fullPath に代入します。
fullPath = workbookPath
関数の返り値を設定
最後に、構築されたパスを関数の返り値として返します。
GetFullPath = fullPath
まとめ
OneDriveとローカルパスを判別して適切なパスを返すこの関数を使用することで、VBAスクリプトの管理が容易になります。
今回紹介したコードと解説を参考に、ぜひ実際の業務に役立ててください。
コメント