VBAでOneDriveのパスを取得する方法と注意点《パスがURLになってエラーが発生することを解決!》
VBA(マクロ)でOneDriveのパスを取得する方法について解説します。
OneDriveはマイクロソフトが提供するクラウドストレージサービスで、インターネット上にファイルを保存して、どこからでもアクセスできる便利な機能です。しかし、VBAでOneDrive上のファイルにアクセスしようとすると、パスがURLになってしまったり、エラーが発生したりすることがあります。
本記事では、以下の項目について説明します。
- VBAでOneDriveのパスを取得する際の問題点と原因
- VBAでOneDriveのパスを取得するためのコードと解説
- VBAでOneDrive上のファイルを開く方法と注意点
この記事を読めば、OneDriveでVBAを使う際の基本的な知識とテクニックが身につくはずです。それでは、早速見ていきましょう。
VBA(マクロ)でOneDriveのパスを取得する際の問題点と原因
VBAでOneDriveのパスを取得する際には、通常のThisWorkbook.Pathプロパティを使うと、パスがURLになってしまうことがあります。
例えば、以下のようなコードを実行すると、メッセージボックスにURLが表示されます。
- Sub ShowPath()
- MsgBox ThisWorkbook.Path
- End Sub
このように、パスがURLになってしまうと、VBAでファイルやフォルダを操作する際に不都合が生じます。
例えば、以下のような問題があります。
- Dir関数やFileSystemObjectでフォルダ内のファイル一覧を取得できない
- OpenやSaveAsでファイルを読み書きできない
- パソコンごとにパスが異なるため、汎用性が低い
では、なぜパスがURLになってしまうのでしょうか?その原因は、OneDriveの仕組みにあります。
OneDriveは、インターネット上のサーバーとパソコン上のフォルダを同期させることで、ファイルを共有するサービスです。しかし、同期されたファイルは、実際にはインターネット上のファイルであり、パソコン上のファイルではありません。そのため、VBAでパスを取得しようとすると、インターネット上のファイルのURLを返すのです。
このように、VBAでOneDriveのパスを取得する際には、パスがURLになってしまうことが問題となります。
では、この問題を解決するためにはどうすればよいのでしょうか?次の章では、VBAでOneDriveのパスを取得するためのコードと解説を紹介します。
OneDriveのパスをVBAで取得する方法
OneDriveのパスをVBAで取得する方法は、次のようになります。
ThisWorkbook.Pathで取得できる値
VBAで現在動いているマクロが書かれているブックのパスを取得するには、ThisWorkbook.Pathというプロパティを使います。
例えば、MsgBox ThisWorkbook.Pathとすると、メッセージボックスにパスが表示されます。
しかし、この方法では、OneDriveに保存されているブックの場合、ローカルパスではなくURLが取得されてしまいます。
これでは、VBAでファイルやフォルダの操作をするときに不都合が生じます。
例えば、Dir関数やFileSystemObjectでフォルダ内のファイル一覧を取得しようとすると、エラーになるか、正しく動作しないといった状態になります。
ローカルのThisWorkbook.Pathを取得するVBAサンプル
OneDriveのURLをローカルのパスに変換するには、環境変数を利用する方法があります。
環境変数とは、オペレーティングシステムが持っている変数のことで、VBAではEnviron関数で取得できます。
例えば、Environ(“USERNAME”)とすると、ユーザー名が返されます。
OneDriveに関する環境変数としては、以下の3つがあります。
- OneDrive:OneDriveのローカルパスを示す環境変数
例えば、「C:\Users\ユーザー名\OneDrive」のようになります。 - OneDriveConsumer:個人向けのOneDriveのローカルパスを示す環境変数
例えば、「C:\Users\ユーザー名\OneDrive – 個人用」のようになります。 - OneDriveCommercial:法人向けのOneDriveのローカルパスを示す環境変数
例えば、「C:\Users\ユーザー名\OneDrive – 会社名」のようになります。
これらの環境変数を使って、OneDriveのURLをローカルパスに変換するVBAサンプルを以下に示します。
このサンプルでは、ブックのモジュールにプロパティを作成して、ThisWorkbook.Pathと同様の使い方ができるようにしています。プロパティ名はPath2としていますが、任意の名前に変更できます。
- Public Property Get Path2()
- 'URL以外(httpで始まらない)ならそのまま返す。
- Dim sPath As String
- sPath = ThisWorkbook.Path
- If Not sPath Like "http*" Then
- Path2 = sPath
- Exit Property
- End If
- '環境変数からOneDriveのフォルダを取得
- Dim OneD As String: OneD = Environ("OneDrive")
- If Environ("OneDriveConsumer") <> "" Then OneD = Environ("OneDriveConsumer")
- If Environ("OneDriveCommercial") <> "" Then OneD = Environ("OneDriveCommercial")
- 'URL「[11](https://d.docs)」
- '4番目の"/"以降(上記ならフォルダ名/ファイル名の部分)を取り出す。
- '最初の3つの"/"を別文字にReplaceしてから、InStrで"/"の位置を求めています。
- Dim sTemp As String
- sTemp = Replace(sPath, "/", "_", , 3)
- Path2 = OneD & "\" & Mid(sTemp, InStr(sTemp, "/") + 1)
- End Property
このプロパティを使うと、ThisWorkbook.Path2とすることで、ローカルのパスを取得できます。例えば、MsgBox ThisWorkbook.Path2とすると、メッセージボックスにローカルのパスが表示されます。
OneDriveのパスをVBAで取得するときの注意点
OneDriveのパスをVBAで取得するときには、次の2つの注意点があります。
OneDriveの種類によって環境変数が異なる
OneDriveには、個人向けと法人向けの2種類があります。
個人向けのOneDriveは、マイクロソフトアカウントでログインして利用できるサービスです。
法人向けのOneDriveは、Office 365やMicrosoft 365の一部として提供されるサービスで、組織のアカウントでログインして利用できます。
これらのOneDriveの種類によって、環境変数の名前や値が異なります。
個人向けのOneDriveの場合、環境変数はOneDriveまたはOneDriveConsumerという名前で、値は「C:\\Users\\ユーザー名\\OneDrive – 個人用」のようになります。
法人向けのOneDriveの場合、環境変数はOneDriveCommercialという名前で、値は「C:\\Users\\ユーザー名\\OneDrive – 会社名」のようになります。
したがって、OneDriveのパスをVBAで取得するときには、環境変数の名前や値を確認して、適切なものを使う必要があります。前述のVBAサンプルでは、環境変数の優先順位をOneDriveCommercial > OneDriveConsumer > OneDriveとしていますが、これは一例であり、実際にはユーザーの環境に合わせて変更する必要があります。
OneDriveのフォルダ階層によってパスの加工が必要
OneDriveのパスをVBAで取得するときには、OneDriveのフォルダ階層によってパスの加工が必要な場合があります。
OneDriveのフォルダ階層とは、OneDriveのルートフォルダからファイルやフォルダまでの階層のことです。
例えば、「OneDrive\\フォルダA\\フォルダB\\ファイルC」という場合、OneDriveのフォルダ階層は「フォルダA\\フォルダB\\ファイルC」となります。
OneDriveのフォルダ階層によってパスの加工が必要な場合とは、次のような場合です。
- OneDriveのフォルダ階層が空の場合:OneDriveのルートフォルダに直接ファイルやフォルダがある場合、URLは「[12](https://d.docs.live.net/xxxxxxxxxxxxxxxx/ファイル名)」のようになります。この場合、ローカルパスに変換するときには、環境変数の値に「\\」を付け足す必要があります。例えば、「C:\\Users\\ユーザー名\\OneDrive\\ファイル名」となります。
- OneDriveのフォルダ階層が「Documents」の場合:OneDriveのルートフォルダに「Documents」というフォルダがあり、その中にファイルやフォルダがある場合、URLは「[13](https://d.docs.live.net/xxxxxxxxxxxxxxxx/Documents/ファイル名)」のようになります。この場合、ローカルパスに変換するときには、環境変数の値に「\\Documents」を付け足す必要があります。例えば、「C:\\Users\\ユーザー名\\OneDrive\\Documents\\ファイル名」となります。
- OneDriveのフォルダ階層が「Documents」以外の場合:OneDriveのルートフォルダに「Documents」以外のフォルダがあり、その中にファイルやフォルダがある場合、URLは「[14](https://d.docs.live.net/xxxxxxxxxxxxxxxx/フォルダ名/ファイル名)」のようになります。この場合、ローカルパスに変換するときには、環境変数の値に「\\フォルダ名」を付け足す必要があります。例えば、「C:\\Users\\ユーザー名\\OneDrive\\フォルダ名\\ファイル名」となります。
まとめ
この記事では、OneDriveのパスをVBAで取得する方法と注意点について解説しました。
OneDriveのパスには、ローカルパスとURLの2種類があり、VBAで取得するときには、環境変数を利用する方法があります。
しかし、OneDriveの種類やフォルダ階層によって、パスの取得方法や加工方法が異なりますので、注意が必要です。
OneDriveのパスをVBAで取得するときには、この記事を参考にしてみてください。
最後までご覧いただき、ありがとうございました。
「【ExcelVBA】ExcelシートデータをCSVファイルに出力する方法」
「【ExcelVBA】ExcelシートをPDF出力する方法(ExportAsFixedFormat)」
も紹介していますので、もしよろしければ御覧ください。
最近のコメント