2023年1月15日【ID:0】
【ex24】OneDrive内のパスをVBAで参照
VBAでExcelファイル配下のパスを取得するために「ThisWorkbook.Path」などを活用することが多いかと思います。
このコードを活用したマクロファイルをOneDrive内に配置したら、正しく実行できなくなったという報告を受けました。
今回は、OneDrive内に配置した場合に「なぜ正しく実行できなくなったのか」と「どうすれば実行できるのか」の2点について解説していきます。
・なぜ正しく実行できなくなったのか
なぜ正しく実行できなくなったのかというと、取得されたパスに問題があるためです。
試しにOneDrive内に保存した「正しく実行できないExcelファイル」に以下のコードを記述し実行してみます。
そうすると、恐らく以下のようにURLが表示されるかと思います。
これが原因です。
本来であれば、ローカルパス(C:\Users\[アカウント]\OneDrive\確認用)が取得されるべきですが、URLが取得されてしまっているため、コードの内容によってはこれが原因でエラーになります。
※Workbooks.Openでは実行できますが、Openステートメントを使う場合(テキストファイルなどを読み込む場合)などはエラーになる可能性があります。
ちなみに、私のOneDriveフォルダはDドライブ配下に配置しております。
D:\OneDrive\
※デフォルト設定の場合は以下になるかと思います。
C:\Users\[アカウント]\OneDrive\
なぜURLが取得されるのかというと、OneDriveの「ファイルのコラボレーション」機能が設定されているためです。
この機能により、OneDrive上のファイルを他のユーザーとリアルタイムで共同編集することができます。
この共同編集とはブックの共有とは異なります。
※ブックの共有とは以前の機能で、共同編集の機能とは異なり機能制限が多くあります。共同編集の機能は古いバージョンには対応していません。
この共同編集とブックの共有の違いについてはこちらでは割愛します。
・どうすれば実行できるのか
上記にて、OneDriveの「ファイルのコラボレーション」機能が設定されていることでパスがURLになることが分かりました。
この理屈から次の対策方法が考えられます。
①ファイルをOneDriveの外に移動する
②「ファイルのコラボレーション」機能をオフにする
ただ、この2つの方法の場合は、共同編集ができなくなってしまいます。
「ファイルのコラボレーション」機能をオンの状態で対応したい場合は、次の方法などがあります。
③URLをローカルパスに変換する機能をVBAで実装する
①に関しては、ファイルの位置を変更することになるため、根本的な解決にはなりません。
そのため②と③について、順に解説していきます。
→②「ファイルのコラボレーション」機能をオフにする
Windows11の場合について解説していきます。
※Windows11以外の場合に関しても同じような手順で行えます。
まず初めに、画面右下のOneDriveのアイコンをクリックします。
以下の画面が表示されたら、設定を開きます。
設定画面の中に「同期とバックアップ」という項目があります。その中の下へ移動すると詳細設定があるため、そちらを展開します。
展開したところに「ファイルのコラボレーション」という項目が表示されるため、こちらをオフに切り替えれば設定完了です。
→③URLをローカルパスに変換する機能をVBAで実装する
対象のExcelファイルを開いて以下の関数を作成します。
GetPath関数により、パスに「https:」が含まれる場合は、ローカルパスに変換して返すような仕組みになっています。
こちらは以下のように活用できます。
※こちらではメッセージボックスで表示させていますが、変数に格納するなどとして活用できます。
GetPath関数は、OneDriveの外であったとしても問題なく活用できるように開発しています。
第2引数の「"D:\OneDrive\"」はOneDriveのフォルダのパスになるので、必要に応じて変更してください。
GetPath関数の仕組みは、第1引数で受け取ったパスに「https:」が含まれる場合は、パスの前半部分を第2引数のOneDriveのローカルパスに置換して返すようになっています。
OneDrive内のパスのURLには法則性があります。
その法則は「4つ目の"/"以降が実際のOneDrive内の相対パス」というものです。
なので、4つ目の「/」の位置をInStrで探して、Left関数により、その位置よりも前の文字列を抽出して置換しています。
GetPath関数を活用することで、以下のようにローカルパスを取得できるようになります。
OneDriveのパスを正しく取得する方法については以上になります。