【簡単エクセル/Excel VBA マクロ】OneDrive環境で FileSystemObject やDir関数を正常に動作させる方法|パスがURL型(https://...)になる問題を解決|ワンポイントテクニック #011


いつもありがとうございます!
皆さん、こんにちは。ご覧いただきありがとうございます。
“日々の業務にちょうどいい自動化を”──
業務改善アプリケーションの作成を行っている「ソフトデザイン工房」です。
この記事では「OneDrive環境で FileSystemObject やDir関数を正常に動作させる方法」を解説します。
近年、クラウド環境の普及により、データをPCのローカルではなくクラウドに保存するのが一般的になってきました。
そのようなクラウドストレージサービスのひとつにMicrosoftが提供する「OneDrive」があります。
OneDriveでは、ファイルをオンラインに保存でき、PCやスマートフォンから簡単にアクセスできるため、データのバックアップや共有がスムーズに行えます。
しかし、クラウドのOneDriveに保存したファイルは、ローカルに保存している場合と異なり、ファイルパスがURL型(https://...)に変わってしまいます。
その影響で、コード内にファイルやフォルダを操作するための「FileSystemObject」や「Dir関数」を使用している場合、正常にコードが動作しなくなってしまいます。
なお、FileSystemObjectは、ファイルやフォルダを操作する際、必ずしも必要になるわけではありませんが、結果として多くのマクロでよく使われています。
なぜならば、ある程度の操作はFileSystemObjectを使わずにローレベルコードで実装することも可能ですが、FileSystemObject は多機能であり、コードを簡潔に記述できるなどの利便性もある上、FileSystemObjectでないと難しい操作もあるためです。
そこで本稿では、FileSystemObjectやDir関数を使用していても、OneDrive環境でマクロを正常に動作させる方法を解説いたします。
この方法は、VBAを本格的に扱っている中~上級者向けの技術と言ってよいと思います。
この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。
VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。
【基本的な挙動】ローカルとクラウドのOneDriveの同期の仕組み
ローカル環境にもOneDriveのフォルダは存在します。
C:\Users\あなたのユーザー名\OneDriveこのローカルのOneDriveフォルダは、クラウド上のOneDriveと同期されます。

クラウドのOneDriveだけにファイルを保存することも可能ですが、通常はクラウドのOneDriveにファイルを保存すると自動的にローカルのOneDriveフォルダにも同じファイルが生成され、同期されます。
下図のように、緑のチェックマークがついていればOneDriveとローカルとで同期されている状態です。

もし同期されていなければ、次のような「雲マーク」が表示されているはずです。

その場合は、ファイルの右クリックメニューの「このデバイス上に常に保持する」をクリックすると同期されます。

今回紹介する方法で正常にコードを動作させるためには、このようにローカル環境とクラウド環境のファイルの同期が正常に行われている必要があります。
【根本原因】ローカルとクラウドのOneDriveではファイルパスが違う
ここが根本原因です。
ローカルとクラウドのOneDrive上の「ドキュメント」フォルダのパスの違いを見てみましょう。次のようになります。
' ローカルのOneDrive
C:\Users\あなたのユーザー名\OneDrive\ドキュメント
' クラウドのOneDrive
https://d.docs.live.net/あなたのOneDriveの識別番号/ドキュメント"あなたのOneDriveの識別番号" には、OneDriveごとに異なる英数字の一意の識別番号が割り当てられます。
このファイルパスの違いが、マクロが正常に動作しない原因となります。
【問題点】FileSystemObjectやDir関数はクラウドのOneDriveのパス(https://...)に対応していない
たとえば、クラウド上に次のVBAコードを記述したファイルを置いてコードを実行し、ファイルパスを取得してみましょう。
' フォルダ構成
your_onedrive(cloud)/
└── ドキュメント/
└── 自身のファイルパスを取得する.xlsmSub ShowThisWorkbookPath()
Debug.Print ThisWorkbook.Path
End Subこのコードを実行すると次のように、https://から始まるクラウド上のパスが返ってきます。
' コード実行結果
https://d.docs.live.net/あなたのOneDriveの識別番号/ドキュメントこのパスでも、たとえば、次のように単純にファイルを開いたりするような操作は正常に実行できます。
Sub OpenFile()
' 変数宣言
Dim wb As Workbook
' ファイルを開く
Set wb = Workbooks.Open(ThisWorkbook.Path & "\Book1.xlsx") ' 正常に開ける
End Subしかし、FileSystemObjectやDir関数を使うとエラーが発生します。
次の例を見てみましょう。これは、FileSystemObjectを使用してフォルダを取得するコードですが、エラーが発生ます。
Sub GetFolderWithFSO()
' 変数宣言
Dim fso As FileSystemObject ' ファイルシステムオブジェクト
Dim folder As folder ' フォルダーオブジェクト
' ファイルシステムオブジェクトをインスタンス化
Set fso = New FileSystemObject
' フォルダーをオブジェクト変数に代入
Set folder = fso.GetFolder(ThisWorkbook.Path) ' ここでエラーが発生
Debug.Print folder.Path
End Sub
このエラーが発生する原因は、FileSystemObject が、https://から始まるクラウドのOneDriveのパスに対応していないことです。FileSystemObject やDir関数は、ローカルファイルシステム専用なんですね。
【解決方法】Environ関数を使いローカルのファイルパスを渡す
OneDrive環境で、FileSystemObjectやDir関数を使用したマクロを動作させるには、Environ関数でローカルのファイルパスを生成し、それをFileSystemObjectやDir関数に渡す必要があります。
具体例を示します。
Sub GetFolderWithFSO2()
' 変数宣言
Dim fso As FileSystemObject ' ファイルシステムオブジェクト
Dim folder As folder ' フォルダーオブジェクト
Dim local_this_wb_path As String ' ローカル基準のファイルパス
' ファイルシステムオブジェクトをインスタンス化
Set fso = New FileSystemObject
' URL型のファイルパスをローカルのファイルパスに変換
'' ThisWorkbook.Path から URL の部分を削除
local_this_wb_path = Replace( _
ThisWorkbook.Path, "https://d.docs.live.net/", "" _
)
'' パスからフォルダ名の部分を取り出す
local_this_wb_path = Mid(local_this_wb_path, InStr(local_this_wb_path, "/") + 1)
'' パスの区切り文字をWindows形式に変換
local_this_wb_path = Replace(local_this_wb_path, "/", "\")
'' ローカルのファイルパスを生成
local_this_wb_path = Environ("OneDrive") & "\" & local_this_wb_path
' フォルダーをオブジェクト変数に代入
Set folder = fso.GetFolder(local_this_wb_path)
Debug.Print "変換前のパス: " & ThisWorkbook.Path
Debug.Print "変換後のパス: " & folder.Path
End Subこのコードでは、ThisWorkbook.Path で得られるクラウド環境のファイルパスを、Environ関数を使用してローカル環境のファイルパスに変換しています。
そのローカル環境のファイルパスをFileSystemObjectに渡しているためエラーが発生しません。
次の結果が返ってきます。
変換前のパス: https://d.docs.live.net/あなたのOneDriveの識別番号/ドキュメント
変換後のパス: C:\Users\あなたのユーザー名\OneDrive\ドキュメントなお、Environ関数の構文は次の通りです。
Environ("環境変数名")
以上で、OneDrive環境でマクロを動かす方法の解説は終了です。
ありがとうございました!
補足
ユーザーによっては、OneDriveと同期させずに、純粋なローカル環境でマクロを動作させるケースもあると思います。
そのようなケースが想定される場合は、まずIF構文で現在の環境がOneDriveと同期している環境かローカルのみの環境かを判定し、その結果に応じて後続の処理を実行するようにコードを実装するとよいでしょう。
' 例
' ThisWorkbook.Pathの種類を判定(OneDrive対応)
If Left(ThisWorkbook.Path, 8) = "https://" Then
' ローカルのOneDriveのパスに変換する
Else
' 通常のローカルのファイルパスを使う
End IfVBAスキルアップの参考情報
近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。
分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。
とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。
全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。
そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。
「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。
VBAのスキルアップ
VBAを学び始めるなら
入門書は、どれを選んでも大きな差はないように感じます。
どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。
もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
基礎を超えて力をつけたいなら
私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。
今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。
このレベルの本を一冊持っておくことに、損はないでしょう。
資格で能力を証明したいなら
VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。
特に「スタンダード」の方は上級者向けです。
あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。
以下の公式テキストが販売されています。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。
これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
今はAIにコードを尋ねれば、答えが返ってくる時代です。
しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。
こちらの記事でも紹介しています。もしよろしければご覧ください。
【初心者歓迎】無料相談受付中

いつもありがとうございます!
限られた時間をより良く使い、日本の生産性を高めたい──
みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。
お気軽にご相談ください。
こちらの記事でも紹介しております。
おわりに


ご覧いただきありがとうございました!
今回の記事では、「OneDrive環境で FileSystemObject やDir関数を正常に動作させる方法」を解説しました。
お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。
この記事が皆様のお役に立てれば幸いです。
なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。
この記事を書いた人
- ソフトデザイン工房|日々の業務にちょうどいい自動化を
- ■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成にチャレンジ。





