Excel VBAでOneDriveフォルダに配置したエクセルでThisWorkbook.PathがインターネットのURLを返して困った

Excel VBA

はじめに

先日納品したExcelのVBAのプロジェクトで、お客様から「使えないんだけど、、、」という問い合わせをもらったので、調べてみたらけっこうハマったのでメモっておきます。

原因

エラーの内容を見ると、どうもフォルダの作成時に失敗している模様。

フォルダの作成にはMakeSureDirectoryPathExists()を使っているのですが、どうもこれがFalseを返しているようです。

この関数は、引数として与えたパスにフォルダが存在していなければ勝手に作ってくれるという便利関数なのですが、普通に使っている分にはよほどエラー(False)を返してくることはありません。

今回も、普通に適切なパスを渡してやっているはずなのに、お客様の環境ではエラーになるとのことでした。

最初はOSやエクセルのバージョンも疑いましたが、特に問題なし。

ふと思いついて、エクセルがOneDriveフォルダにある場合はどうなるんだろう?と思い、自分の環境でOneDriveフォルダの中に問題のエクセルを放り込んで実行してみたところ、見事に問題を再現することができました。

どうやら、OneDriveフォルダにおいてあるエクセルのVBAでThisWorkbook.Pathを参照すると、OneDriveのインターネット上のファイルパスが返ってくるようなのです。

例えばこんな感じになります。

https://から始まるパスになっていますね。

こんなパスを使ってフォルダを作ろうとしてもうまくいくわけがありません。

OneDriveフォルダはローカルのフォルダと同期しているので、自分としては、ローカルに保存したつもりなのに、外部URLの形でファイルパスが返ってくるようです。

解決方法

まあ、OneDriveでないフォルダにおいておけば問題ないのですが、それではお客様も納得しない場合もあるかもしれません。

しかし、調べてみたところ、プログラム側で簡単に解決する方法はないようです。

もう少し正確に言うと、あるにはあるけど不確実な部分があったり、割と難解なコードが増えたりするので、できれば避けたいという感じです。

そんなわけで色々探して、やっとみつけました。

「これならギリ許容か」というくらいスレスレの解決策です。

詳細は以下を見て下さい。

How to Sync Any Folder With SkyDrive on Windows 8.1
Before Windows 8.1, it was possible to sync any folder on your computer with SkyDrive using symbolic links. This method no longer works now that SkyDrive is bak...

簡単に言うと、OneDrive上にエクセルファイルを置き、そのファイルが置いてあるフォルダのシンボリックリンクをOneDriveではないフォルダに置く、というものです。

もう少し詳しく書いてみます。

  1. OneDrive上にフォルダを作り、そこに対象のエクセルを置く
  2. OneDriveでないローカルフォルダを用意する
  3. コマンドプロンプトを管理者権限で起動する
  4. コマンドプロンプトでシンボリックリンクを作成する
  5. 作成されたシンボリックリンク内のエクセルを使う

4.の手順で実行するコマンドは以下のようになります。

mklink /d “C:\Original\Folder\Location” “C:\Users\NAME\OneDrive\FOLDERNAME\”

これで無事にThisWorkbook.PathがローカルPC上のパスを返すようになりました。

コメント

タイトルとURLをコピーしました