VBA技術解説
OneDrive使用時のThisWorkbook.Pathの扱い方

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2023-07-26 最終更新日:2023-07-26

OneDrive使用時のThisWorkbook.Pathの扱い方


マクロVBAでは、現在動いているマクロVBAが書かれているブックのバス(Path)を取得し、そのフォルダを使って処理を組み立てる方法が良く用いられます。
ところがOneDriveと同期しているフォルダでは、このような処理が従来のVBAコードでは行えなくなっています。
従来のVBAではファイルの一覧が取得できないのです。


この問題に対処するためのVBAサンプルや方法については、ネット上に沢山出ています。
なので、本サイトで特に記事にする必要はないと思っていたのですが、、、
しかし、本サイトを訪れる方からお問い合わせをもらうことも度々ありますので、最低限の事は書いておいた方が良いだろうと思い、ここに記載しておくことにしました。
ここでは簡単な解説と、ごく単純なVBAコードの提示だけにとどめます。
よりよいVBAコードや特種な場合(SharePointファイル等々の問題)の対応については個別にお調べください。
以下では、あくまでOneDrive同期しているフォルダの場合に、簡易的にローカルフォルダ文字列に変換する方法についての解説になります。


ThisWorkbook.Pathで取得できる値

動かしているマクロVBAが書かれているブックが格納されているバスは、
ThisWorkbook.Path
これで取得できます。
VBAが書かれている自分自身(ThisWorkbookオブジェクト)のPathプロバティです。
C:\Users\ユーザー\...
D:\User\...
\\サーバー名\...
このようなパスになります。

ところが「OneDrive」のフォルダの場合はURLとなってしまいます。
VBA マクロ OneDrive使用時のThisWorkbook.Pathの扱い方

このようなURL文字列のパスでは、VBAが不都合(エラーになったり、正しく動作しなかったり)な結果になる場合が多くあります。
特定ファイル名での読み書き(Open、SaveAs)するだけなら大抵の場合はそのままでも出来るはずですが、、、
Dir関数やFileSystemObjectでフォルダ内のファイル一覧を取得しようとすると、
エラーになるか、正しく動作しないといった状態になります。

これを解決する方法として、OneDriveのURLlをローカルのフォルダに変換することで乗り越えようということです。
この下で実際のVBAコード(あくまでサンプル程度)の提示と簡単な解説をしておきます。


ローカルのThisWorkbook.Pathを取得するVBAサンプル

ブックのモジュールにプロパティを作成します。

VBA マクロ OneDrive使用時のThisWorkbook.Pathの扱い方

「ThisWorkbook.Path」と同様の使い勝手を実現するために、ブックモモジュールにプロパティを作成します。
もちろんプロパティ名は何でも構いません。

Functionで実装しても構いませんし、使い勝手はどちらでもあまり変わらないと思います。
もちろん、標準モジョールにFunctionを作成する方法でも構いません。

VBAサンプル

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「https://d.docs.live.net/xxxxxxxxxxxxxxxx/○○○」
  '4番目の"/"以降(上記なら○○○の部分)を取り出す。
  '最初の3つの"/"を別文字にReplaceしてから、InStrで"/"の位置を求めています。
  Dim sTemp As String
  sTemp = Replace(sPath, "/", "_", , 3)
  Path2 = OneD & "\" & Mid(sTemp, InStr(sTemp, "/") + 1)
End Property

VBAコード自体は単純なものなので、コード内のコメントを参考にしてください。
以下は、関数等の参考ページです。
Like演算子とワイルドカード|VBA入門
・Like演算子 ・パターン文字列式(ワイルドカード、文字リスト、文字範囲) ・Like演算子の使用例 ・正規表現について
VBA関数(文字列操作,Replace,InStr,StrConv)|VBA入門
・文字列操作に関するVBA関数の一覧 ・Replace関数 ・InStr関数 ・StrConv関数 ・最後に
ENVIRON関数|VBA関数
オペレーティングシステム(Windows)の環境変数に関連付けられた文字列を返します。Macintoshでは使用できません。デスクトップのパスやログインしているユーザーの名前を取得できます。Environ関数の構文 Environ({envstring|number}) envstringまたはnumberのどちら…

使い方

ThisWorkbook.Path
これの代わりに、
ThisWorkbook.Path2
として使う事が出来ます。

環境変数の確認

上記VBAでは環境変数からOneDriveのフォルダを取得しています。
環境変数なので環境に依存します。
一般的な環境なら、、、というVBAコードにすることは出来るとは思いますが、いろいろな環境で確認するのがかなり大変です。
先のVBAではOneDriveとして3つの環境変数がありますよ、というだけのコードにとどめています。
OneDriveに関する環境変数としては以下の3つがあるようです。
OneDrive
OneDriveConsumer
OneDriveCommercial
PCにより、どの環境変数が使われているかが変わってきます。
ネットにある汎用的なコードを使うにしても、自身の環境がどうなっているか確認しておいた方が良いでしょう。
以下のVBAでは、"OneDrive"という文字を含む環境変数だけを出力しています。

 Sub PrintEnviron()
  Dim i As Long
  i = 1
  Do Until Environ(i) = ""
    If Environ(i) Like "*OneDrive*" Then
      Debug.Print i & ":" & Environ(i)
    End If
    i = i + 1
  Loop
End Sub


参考になる外部サイトの記事

[VBA]OneDriveで同期しているファイルまたはフォルダのURLをローカルパスに変換する関数
VBAコードは結構しっかり書かれていますので参考になると良いと思います。
ただし、内容的には単純な文字列変換だけ(環境に応じた分岐のみ)なのにライセンスがどうのと書かれているのが・・・

VBAのThisWorkbook.PathでOneDriveビジネス版のリンクフォルダからもローカルパスを取得できる関数ライブラリ VBA-FileToolsの解析記録と最近使ったファイルの読み込み
文字列変換ではない方法になります。
多少の制限はあるものの実用的には問題いと思います。
以下の改良版もあるようです。
GitHub - Excel-VBA-Diary/ThisWorkbookLocalPath: OneDriveでThisWorkbook.PathがURLを返す問題を解決する (Resolve the problem of ThisWorkbook.Path returning a URL in OneDrive)




同じテーマ「マクロVBA技術解説」の記事

Select Caseでの短絡評価(ショートサーキット)の使い方
RangeオブジェクトのFor EachとAreasについて
画像が行列削除についてこない場合の対処
新関数SORTBYをVBAで利用するラップ関数を作成
LAMBDA以降の新関数はVBAで使えるか
数字(1~50)を丸付き数字に変換するVBA
文字列のプロパティ名でオブジェクトを操作する方法
OneDrive使用時のThisWorkbook.Pathの扱い方
セル個数を返すRange.CountLargeプロパティとは
画像「セルに配置」のVBAについて(365の新機能)
VBAでクリップボードへ文字列を送信・取得する3つの方法


新着記事NEW ・・・新着記事一覧を見る

カンマ区切りデータの行展開|エクセル練習問題(2026-01-28)
開いている「Excel/Word/PowerPoint」ファイルのパスを調べる方法|エクセル雑感(2026-01-27)
IMPORTCSV関数(CSVファイルのインポート)|エクセル入門(2026-01-19)
IMPORTTEXT関数(テキストファイルのインポート)|エクセル入門(2026-01-19)
料金表(マトリックス)から金額で商品を特定する|エクセル練習問題(2026-01-14)
「緩衝材」としてのVBAとRPA|その終焉とAIの台頭|エクセル雑感(2026-01-13)
シンギュラリティ前夜:AIは機械語へ回帰するのか|生成AI活用研究(2026-01-08)
電卓とプログラムと私|エクセル雑感(2025-12-30)
VLOOKUP/XLOOKUPが異常なほど遅くなる危険なアンチパターン|エクセル関数応用(2025-12-25)
2段階の入力規則リスト作成:最新関数対応|エクセル関数応用(2025-12-24)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.日本の祝日一覧|Excelリファレンス
3.変数宣言のDimとデータ型|VBA入門
4.FILTER関数(範囲をフィルター処理)|エクセル入門
5.RangeとCellsの使い方|VBA入門
6.繰り返し処理(For Next)|VBA入門
7.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
8.マクロとは?VBAとは?VBAでできること|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.メッセージボックス(MsgBox関数)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。
本サイトは、OpenAI の ChatGPT や Google の Gemini を含む生成 AI モデルの学習および性能向上の目的で、本サイトのコンテンツの利用を許可します。
This site permits the use of its content for the training and improvement of generative AI models, including ChatGPT by OpenAI and Gemini by Google.



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ