W.I.S. Laboratory
menu-bar

Excel VBA


ExcelVBAがOneDrive内で動かない

ExcelのVBAで書いたアプリケーションをOneDrive内に入れて起動すると、エラーが出て動かなくなった。
調べてみると、「ChDrive ThisWorkbook.Path」や「ChDir ThisWorkbook.Path」といった場所でエラーが起きている。
なんで?と思い、ThisWorkbook.Pathの値を表示させてみると、「https://d.docs.live.net/xxxxxxxx/...」という内容になっている。(個人向けのOneDriveの場合。法人向けの場合は「https://xxxx-my.sharepoint.com/personal/...」となる)
ファイルの置き場所のパスが、URLになってしまっているのだ。
URLに対してChDriveだのChDirだのを実行しようとしているのでエラーが起きて当然だが、どうしてこんなことになるのか。

こうなる原因はOneDriveの「ファイルのコラボレーション」機能だった。
これがONになっていると、複数の人が単一のExcelファイルを同時に編集することが可能になる。
まるでGoogleDocsのようで便利な機能なのだが、それを実現するためにクラウド上のデータに直接アクセスしているようで、その迸り(とばっちり)がVBAに降り掛かってしまったようだ。

それならOneDriveの「ファイルのコラボレーション」をOFFにすれば解決するんじゃないかと思えるが、その通り解決する。
OneDriveの設定画面に「ファイルのコラボレーション」があれば、それをOFFにすれば良い。
しかし、最近のOneDriveにはこの「ファイルのコラボレーション」の設定項目自体が無いのだ。
むしろそっちが問題なのだが、MicrosoftはVBAが動かなくなることよりも複数人数で同時にファイルを編集できることの確実性を選択した・・ということになるのだろう。
まあたしかに、PCを購入したらドキュメントやピクチャはおろかデスクトップに置いたファイルまでOneDriveに自動的に飛ぶ設定になっているのだから、毎日世界のあちこちでファイルの競合が起きているに違いないわけで、そっちをなんとかしなければならないのは分からないでもない。
とはいっても、決して少なくないVBA開発者を敵に回しても良いという理由にはならない・・と言いたいが、我々末端のSEは巨大企業の気まぐれに振り回される運命なのだ。
気づけばもう何十年もそんな生活をしている。

そんなわけで、VBAのほうを書き換えてなんとか動くようにしなくてはならない。
ThisWorkbook.Pathでローカルフォルダのパスが取得できないなら、別の方法でパスを取得すれば良いわけだ。
ローカルのOneDrive直下までのパスは、環境変数「OneDrive」に保存されている。
環境変数はEnviron関数で取得できる。

あとはここからVBAが書かれたExcelファイルがある場所までのパスをどうやって取得するかだ。
これはもう強引にいくしかない。
「https://d.docs.live.net/xxxxxxxxxxxxxxxx/...」をスラッシュで分割して、5番目の要素から最後までを「\」で結合していく。

こんな感じだろうか。
上の関数を呼び出せば、ローカルパスを返してくれる。
当面はこれで凌いでいけそうだが、ThisWorkbook.Pathで取得できるURLが今後変わらないかどうかはMicrosoft次第なので、URLが変わる度にこの関数も書き換えなくてはならないかもしれない。


[ 戻る ]
saluteweb