<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FSO &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/fso/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Tue, 09 Jun 2026 01:45:43 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>FSO &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBA FileSystemObjectの使い方｜フォルダ作成・ファイル一覧取得・存在確認を自動化</title>
		<link>https://mashukabu.com/vba-filesystemobject/</link>
					<comments>https://mashukabu.com/vba-filesystemobject/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 01:45:43 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[FileSystemObject]]></category>
		<category><![CDATA[FSO]]></category>
		<category><![CDATA[Scripting.FileSystemObject]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[ファイル操作]]></category>
		<category><![CDATA[フォルダ操作]]></category>
		<category><![CDATA[マクロ]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7884</guid>

					<description><![CDATA[VBA FileSystemObject（FSO）の使い方を基本から解説。参照設定とCreateObjectの準備、FolderExists・FileExistsでの存在確認、CreateFolderでのフォルダ自動作成、GetFolderでのファイル一覧取得、コピー・移動・削除まで。月次フォルダ自動仕分けなど実務コード付き。Dir関数との使い分けも紹介。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">「毎月、報告書を年月フォルダに手で振り分けている」「フォルダがあるか目視で確認してからコピーしている」</p>



<p class="wp-block-paragraph">ファイル整理は地味ですが、毎月くり返すと意外と時間を取られますよね。フォルダを作り、ファイルを探し、コピーして、また確認して。この一連の作業こそ、VBAで自動化したいポイントです。</p>



<p class="wp-block-paragraph">そこで活躍するのが <strong>FileSystemObject（FSO）</strong> です。この記事では、FSOの準備から、フォルダの自動作成・ファイルの存在確認・一覧取得・コピーまでを解説します。月次フォルダの自動仕分けなど、コピペで使える実務コードも紹介していきますね。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBA FileSystemObject（FSO）とは？</a></li><li><a href="#toc2" tabindex="0">FileSystemObjectを使う準備（参照設定とCreateObject）</a><ol><li><a href="#toc3" tabindex="0">方法1: 参照設定する（事前バインディング）</a></li><li><a href="#toc4" tabindex="0">方法2: CreateObjectで生成する（実行時バインディング）</a></li></ol></li><li><a href="#toc5" tabindex="0">FileSystemObjectの基本メソッド一覧（フォルダ・ファイル操作）</a><ol><li><a href="#toc6" tabindex="0">フォルダ操作</a></li><li><a href="#toc7" tabindex="0">ファイル操作</a></li><li><a href="#toc8" tabindex="0">パス・名前の操作</a></li><li><a href="#toc9" tabindex="0">Fileオブジェクトの主なプロパティ</a></li></ol></li><li><a href="#toc10" tabindex="0">フォルダの存在確認と自動作成（FolderExists / CreateFolder）</a><ol><li><a href="#toc11" tabindex="0">FolderExists：フォルダがあるか調べる</a></li><li><a href="#toc12" tabindex="0">CreateFolder：フォルダを作る</a></li></ol></li><li><a href="#toc13" tabindex="0">ファイルの存在確認・一覧取得・コピー削除（FileExists / GetFolder / CopyFile）</a><ol><li><a href="#toc14" tabindex="0">FileExists：ファイルがあるか調べる</a></li><li><a href="#toc15" tabindex="0">GetFolderとFiles：フォルダ内のファイル一覧を取る</a></li><li><a href="#toc16" tabindex="0">拡張子で絞り込む</a></li><li><a href="#toc17" tabindex="0">CopyFile・MoveFile・DeleteFile：コピー・移動・削除</a></li></ol></li><li><a href="#toc18" tabindex="0">【実務】FileSystemObjectの活用コード3選</a><ol><li><a href="#toc19" tabindex="0">パターン1: 月次報告書を年月フォルダに自動仕分け</a></li><li><a href="#toc20" tabindex="0">パターン2: 指定フォルダ内のExcelファイルを一括処理</a></li><li><a href="#toc21" tabindex="0">パターン3: 存在確認してから安全にバックアップする</a></li></ol></li><li><a href="#toc22" tabindex="0">FileSystemObjectでよくあるエラーと対処法</a></li><li><a href="#toc23" tabindex="0">Dir関数との使い分け</a></li><li><a href="#toc24" tabindex="0">まとめ</a><ol><li><a href="#toc25" tabindex="0">関連記事</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBA FileSystemObject（FSO）とは？</span></h2>



<p class="wp-block-paragraph">FileSystemObjectは、<strong>Windowsのファイル操作をVBAから命令できるオブジェクト</strong>です。「FSO」と略されます。</p>



<p class="wp-block-paragraph">イメージは「ファイル係の司令塔」です。普段あなたがエクスプローラーで手動でやっている操作を、コードで指示できます。</p>



<p class="wp-block-paragraph">具体的には、次のような操作ができます。</p>



<ul class="wp-block-list"><li>フォルダを作る・あるか調べる</li><li>ファイルがあるか調べる</li><li>フォルダの中のファイル一覧を取り出す</li><li>ファイルをコピー・移動・削除する</li><li>ファイル名や拡張子、更新日時を取り出す</li></ul>



<p class="wp-block-paragraph">FSOは <strong>Microsoft Scripting Runtime</strong> という部品に含まれています。Windowsに標準で入っているので、特別なインストールは不要です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>VBE（Visual Basic Editor）は <code>Alt</code> + <code>F11</code> で起動します。リボンから開く場合は「開発」タブ →「Visual Basic」を選びます。「開発」タブが表示されていないときは、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。VBEが開いたら「挿入」→「標準モジュール」でコードを書く場所を作ります。画面構成がわからない方は、<a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方</a>の記事も参考にしてみてください。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc2">FileSystemObjectを使う準備（参照設定とCreateObject）</span></h2>



<p class="wp-block-paragraph">FSOを使うには、最初にオブジェクトを生成する必要があります。生成方法は2通りあります。</p>



<h3 class="wp-block-heading"><span id="toc3">方法1: 参照設定する（事前バインディング）</span></h3>



<p class="wp-block-paragraph">VBEのメニューから「ツール」→「参照設定」を開きます。一覧から <strong>Microsoft Scripting Runtime</strong> にチェックを入れます。これで準備完了です。</p>



<pre class="wp-block-code"><code>Sub UseEarlyBinding()
    Dim fso As Scripting.FileSystemObject 'ファイル操作オブジェクト
    Set fso = New Scripting.FileSystemObject

    MsgBox fso.FolderExists(&quot;C:Temp&quot;) 'C:Tempがあるか判定
End Sub</code></pre>



<p class="wp-block-paragraph">参照設定すると、入力中に候補が出る入力補完（IntelliSense）が効きます。コードが書きやすくなるので、自分のPCで使う場合はこちらがおすすめです。</p>



<h3 class="wp-block-heading"><span id="toc4">方法2: CreateObjectで生成する（実行時バインディング）</span></h3>



<p class="wp-block-paragraph">参照設定をせずに、コード内でオブジェクトを直接生成する方法です。</p>



<pre class="wp-block-code"><code>Sub UseLateBinding()
    Dim fso As Object 'ファイル操作オブジェクト
    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)

    MsgBox fso.FolderExists(&quot;C:Temp&quot;) 'C:Tempがあるか判定
End Sub</code></pre>



<p class="wp-block-paragraph">CreateObjectは参照設定が不要です。そのため、ファイルを他の人に配布する場合に向いています。環境による設定の違いを気にしなくて済むからです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>迷ったら <strong>CreateObject</strong> を選んでおくと安全です。参照設定はファイルごとに必要で、配布先で外れていると動かなくなります。本記事のコードはすべてCreateObjectで統一しています。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc5">FileSystemObjectの基本メソッド一覧（フォルダ・ファイル操作）</span></h2>



<p class="wp-block-paragraph">FSOでよく使うメソッドとプロパティを、まず一覧で見ておきましょう。後のセクションで1つずつコード付きで解説します。</p>



<h3 class="wp-block-heading"><span id="toc6">フォルダ操作</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>要素</th><th>役割</th></tr></thead><tbody><tr><td>CreateFolder(パス)</td><td>フォルダを新規作成（既存だとエラー・1階層のみ）</td></tr><tr><td>FolderExists(パス)</td><td>フォルダの有無を True / False で返す</td></tr><tr><td>GetFolder(パス)</td><td>Folderオブジェクトを取得（存在しないとエラー）</td></tr><tr><td>DeleteFolder(パス)</td><td>フォルダを削除</td></tr><tr><td>Folder.SubFolders</td><td>サブフォルダのコレクション</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc7">ファイル操作</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>要素</th><th>役割</th></tr></thead><tbody><tr><td>FileExists(パス)</td><td>ファイルの有無を True / False で返す</td></tr><tr><td>GetFile(パス)</td><td>Fileオブジェクトを取得（存在しないとエラー）</td></tr><tr><td>Folder.Files</td><td>フォルダ内ファイルのコレクション</td></tr><tr><td>CopyFile(元, 先)</td><td>ファイルをコピー（既定で上書き）</td></tr><tr><td>MoveFile(元, 先)</td><td>ファイルを移動</td></tr><tr><td>DeleteFile(パス)</td><td>ファイルを削除</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc8">パス・名前の操作</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>要素</th><th>役割</th></tr></thead><tbody><tr><td>GetFileName(パス)</td><td>パスからファイル名を取り出す</td></tr><tr><td>GetBaseName(パス)</td><td>拡張子を除いたファイル名</td></tr><tr><td>GetExtensionName(パス)</td><td>拡張子を取り出す（例: xlsx）</td></tr><tr><td>GetParentFolderName(パス)</td><td>親フォルダのパス</td></tr><tr><td>BuildPath(パス, 名前)</td><td>パスと名前を区切り文字込みで連結</td></tr></tbody></table></figure>



<h3 class="wp-block-heading"><span id="toc9">Fileオブジェクトの主なプロパティ</span></h3>



<figure class="wp-block-table"><table><thead><tr><th>プロパティ</th><th>取得できる情報</th></tr></thead><tbody><tr><td>Name</td><td>ファイル名</td></tr><tr><td>Path</td><td>フルパス</td></tr><tr><td>Size</td><td>サイズ（バイト）</td></tr><tr><td>DateLastModified</td><td>最終更新日時</td></tr><tr><td>Type</td><td>ファイルの種類</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc10">フォルダの存在確認と自動作成（FolderExists / CreateFolder）</span></h2>



<p class="wp-block-paragraph">まずはフォルダ操作からです。実務でいちばん多いのが「フォルダがなければ作る」という処理です。</p>



<h3 class="wp-block-heading"><span id="toc11">FolderExists：フォルダがあるか調べる</span></h3>



<p class="wp-block-paragraph"><code>FolderExists</code> は、指定したフォルダがあるかを True / False で返します。</p>



<pre class="wp-block-code"><code>Dim fso As Object 'ファイル操作オブジェクト
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)

If fso.FolderExists(&quot;C:Temp2026&quot;) Then
    MsgBox &quot;フォルダがあります&quot;
Else
    MsgBox &quot;フォルダがありません&quot;
End If</code></pre>



<h3 class="wp-block-heading"><span id="toc12">CreateFolder：フォルダを作る</span></h3>



<p class="wp-block-paragraph"><code>CreateFolder</code> は、新しいフォルダを作ります。</p>



<pre class="wp-block-code"><code>fso.CreateFolder &quot;C:Temp2026&quot; 'フォルダを新規作成</code></pre>



<p class="wp-block-paragraph">ここで注意点が2つあります。まず、<strong>既に同じフォルダがあるとエラー</strong>になります。次に、<strong>作れるのは1階層だけ</strong>です。たとえば <code>C:Temp</code> がないのに <code>C:Temp2026</code> を一度に作ろうとするとエラーになります。</p>



<p class="wp-block-paragraph">そこで実務では、<code>FolderExists</code> で確認してから <code>CreateFolder</code> する形が定番です。</p>



<pre class="wp-block-code"><code>Dim fso As Object 'ファイル操作オブジェクト
Dim targetPath As String '作りたいフォルダのパス
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
targetPath = &quot;C:Temp2026&quot;

'--- フォルダがなければ作る ---
If Not fso.FolderExists(targetPath) Then
    fso.CreateFolder targetPath
    MsgBox &quot;フォルダを作成しました&quot;
Else
    MsgBox &quot;フォルダは既にあります&quot;
End If</code></pre>



<p class="wp-block-paragraph"><code>If Not fso.FolderExists(...)</code> で「なければ」を判定しています。これでエラーを防ぎながら安全にフォルダを用意できます。条件分岐の書き方は<a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文の使い方</a>をご覧ください。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>多階層のフォルダ（例: <code>C:Temp2026 4</code>）を一度に作りたい場合は、親から順に作る必要があります。<code>C:Temp</code> → <code>C:Temp2026</code> → <code>C:Temp2026 4</code> の順です。後ほどの実務パターン1で、この処理を関数にまとめた例を紹介します。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc13">ファイルの存在確認・一覧取得・コピー削除（FileExists / GetFolder / CopyFile）</span></h2>



<p class="wp-block-paragraph">続いてファイル操作です。「ファイルがあるか確認する」「フォルダ内の一覧を取る」「コピーする」の3つを押さえれば、実務はほぼカバーできます。</p>



<h3 class="wp-block-heading"><span id="toc14">FileExists：ファイルがあるか調べる</span></h3>



<p class="wp-block-paragraph"><code>FileExists</code> は、指定したファイルがあるかを True / False で返します。</p>



<pre class="wp-block-code"><code>If fso.FileExists(&quot;C:Tempreport.xlsx&quot;) Then
    MsgBox &quot;ファイルがあります&quot;
Else
    MsgBox &quot;ファイルがありません&quot;
End If</code></pre>



<p class="wp-block-paragraph">上書き保存の前や、コピーの前に「すでにあるか」を確認するときに使います。</p>



<h3 class="wp-block-heading"><span id="toc15">GetFolderとFiles：フォルダ内のファイル一覧を取る</span></h3>



<p class="wp-block-paragraph">フォルダ内のファイルを1つずつ処理したいとします。このときは <code>GetFolder</code> でフォルダを取得し、<code>Files</code> コレクションを <code>For Each</code> で回します。</p>



<pre class="wp-block-code"><code>Sub ListFiles()
    Dim fso As Object 'ファイル操作オブジェクト
    Dim fol As Object '対象フォルダ
    Dim f As Object '取り出す1ファイル
    Dim msg As String '一覧の文字列

    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    Set fol = fso.GetFolder(&quot;C:Temp&quot;) '対象フォルダを取得

    '--- フォルダ内のファイル名を1つずつ集める ---
    For Each f In fol.Files
        msg = msg &amp; f.Name &amp; vbCrLf
    Next f

    MsgBox msg
End Sub</code></pre>



<p class="wp-block-paragraph"><code>For Each f In fol.Files</code> で、フォルダの中のファイルを1つずつ取り出しています。<code>f.Name</code> でファイル名が取れます。ループの基本は<a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Eachの使い方</a>も参考にしてください。</p>



<h3 class="wp-block-heading"><span id="toc16">拡張子で絞り込む</span></h3>



<p class="wp-block-paragraph">一覧の中から「Excelファイルだけ」を選びたいときは、<code>GetExtensionName</code> で拡張子を調べます。</p>



<pre class="wp-block-code"><code>For Each f In fol.Files
    If fso.GetExtensionName(f.Name) = &quot;xlsx&quot; Then
        msg = msg &amp; f.Name &amp; vbCrLf '拡張子がxlsxのものだけ集める
    End If
Next f</code></pre>



<p class="wp-block-paragraph"><code>GetExtensionName</code> は拡張子だけを返します。ドット（.）は含まないので、<code>"xlsx"</code> のように比較します。</p>



<h3 class="wp-block-heading"><span id="toc17">CopyFile・MoveFile・DeleteFile：コピー・移動・削除</span></h3>



<p class="wp-block-paragraph">ファイルのコピー・移動・削除は、それぞれ1行で書けます。</p>



<pre class="wp-block-code"><code>fso.CopyFile &quot;C:Tempreport.xlsx&quot;, &quot;C:Backupreport.xlsx&quot; 'コピー
fso.MoveFile &quot;C:Tempold.xlsx&quot;, &quot;C:Archiveold.xlsx&quot; '移動
fso.DeleteFile &quot;C:Tempunused.xlsx&quot; '削除</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p><code>CopyFile</code> は、コピー先に同じ名前のファイルがあると<strong>既定で上書き</strong>します。上書きしたくない場合は、第3引数に <code>False</code> を指定します（<code>fso.CopyFile 元, 先, False</code>）。この場合、同名ファイルがあるとエラーになります。コピー前に <code>FileExists</code> で確認すると、より安全です。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc18">【実務】FileSystemObjectの活用コード3選</span></h2>



<p class="wp-block-paragraph">ここからは、実務でそのまま使えるパターンを3つ紹介します。どれもコピペして動かせるコードです。</p>



<h3 class="wp-block-heading"><span id="toc19">パターン1: 月次報告書を年月フォルダに自動仕分け</span></h3>



<p class="wp-block-paragraph"><code>C:報告書</code> に <code>2026-04_営業報告.xlsx</code> のようなファイルがあるとします。ファイル名の先頭から年月フォルダ（<code>C:報告書2026-04</code>）を作り、そこへ移動するコードです。</p>



<pre class="wp-block-code"><code>Sub SortReportsByMonth()
    Dim fso As Object 'ファイル操作オブジェクト
    Dim fol As Object '元フォルダ
    Dim f As Object '処理するファイル
    Dim baseFol As String '振り分け元のパス
    Dim ym As String '年月（フォルダ名）
    Dim destFol As String '移動先フォルダのパス

    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    baseFol = &quot;C:報告書&quot;
    Set fol = fso.GetFolder(baseFol)

    '--- ファイルを1つずつ確認して年月フォルダに移動する ---
    For Each f In fol.Files
        ym = Left(f.Name, 7) 'ファイル名先頭の&quot;2026-04&quot;を取り出す
        destFol = baseFol &amp; &quot;&quot; &amp; ym

        '--- 年月フォルダがなければ作る ---
        If Not fso.FolderExists(destFol) Then
            fso.CreateFolder destFol
        End If

        fso.MoveFile f.Path, destFol &amp; &quot;&quot; &amp; f.Name '移動
    Next f

    MsgBox &quot;仕分けが完了しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph">ポイントは2つです。<code>Left(f.Name, 7)</code> でファイル名の先頭7文字（<code>2026-04</code>）を取り出してフォルダ名にしています。そして移動前に <code>FolderExists</code> で確認し、なければ <code>CreateFolder</code> で作っています。これで「フォルダがない」エラーを防げます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>ファイル名のルールに合わせて <code>Left(f.Name, 7)</code> の文字数を変えてください。<code>2026年04月</code> のような形式なら、文字数を調整するか、<code>Mid</code> 関数で必要な部分を切り出します。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc20">パターン2: 指定フォルダ内のExcelファイルを一括処理</span></h3>



<p class="wp-block-paragraph"><code>C:データ</code> フォルダのExcelファイルを順番に開くコードです。A1セルにファイル名を書き込み、保存して閉じます。複数ファイルへの定型処理の土台になります。</p>



<pre class="wp-block-code"><code>Sub ProcessAllExcelFiles()
    Dim fso As Object 'ファイル操作オブジェクト
    Dim fol As Object '対象フォルダ
    Dim f As Object '処理するファイル
    Dim wb As Workbook '開いたブック

    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    Set fol = fso.GetFolder(&quot;C:データ&quot;)

    Application.ScreenUpdating = False '画面更新を止めて高速化

    '--- フォルダ内のxlsxファイルを順に開いて処理する ---
    For Each f In fol.Files
        If fso.GetExtensionName(f.Name) = &quot;xlsx&quot; Then
            Set wb = Workbooks.Open(f.Path) 'ファイルを開く
            wb.Worksheets(1).Range(&quot;A1&quot;).Value = f.Name 'A1に処理を書き込む
            wb.Close SaveChanges:=True '保存して閉じる
        End If
    Next f

    Application.ScreenUpdating = True '画面更新を戻す
    MsgBox &quot;一括処理が完了しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>fso.GetExtensionName(f.Name) = "xlsx"</code> でExcelファイルだけに絞っています。<code>Workbooks.Open</code> で開いたブックは、処理後に必ず <code>Close</code> で閉じます。セルの操作は<a href="https://mashukabu.com/excel-vba-howto-use-range/">Rangeの使い方</a>も参考にしてください。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>一括処理では、自分自身（マクロを書いたブック）を開きにいかないよう注意してください。マクロブックを処理対象フォルダの外に置くのが安全です。同じフォルダに置く場合は、<code>If f.Name <> ThisWorkbook.Name Then</code> で自分を除外します。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc21">パターン3: 存在確認してから安全にバックアップする</span></h3>



<p class="wp-block-paragraph">ファイルをバックアップフォルダにコピーするコードです。元ファイルの有無とバックアップ先フォルダの有無を両方確認してから実行します。</p>



<pre class="wp-block-code"><code>Sub SafeBackup()
    Dim fso As Object 'ファイル操作オブジェクト
    Dim srcFile As String 'コピー元ファイル
    Dim destFol As String 'バックアップ先フォルダ

    Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
    srcFile = &quot;C:Tempreport.xlsx&quot;
    destFol = &quot;C:Backup&quot;

    '--- 元ファイルがなければ中止する ---
    If Not fso.FileExists(srcFile) Then
        MsgBox &quot;コピー元のファイルがありません&quot;
        Exit Sub
    End If

    '--- バックアップ先フォルダがなければ作る ---
    If Not fso.FolderExists(destFol) Then
        fso.CreateFolder destFol
    End If

    fso.CopyFile srcFile, destFol &amp; &quot;&quot; &amp; fso.GetFileName(srcFile) 'コピー実行
    MsgBox &quot;バックアップが完了しました&quot;
End Sub</code></pre>



<p class="wp-block-paragraph"><code>fso.GetFileName(srcFile)</code> で元ファイルの名前だけを取り出し、コピー先のパスを組み立てています。先に <code>FileExists</code> と <code>FolderExists</code> でチェックしているので、途中でエラーが出ません。<code>Exit Sub</code> で安全に中断する書き方も覚えておくと便利です。</p>



<h2 class="wp-block-heading"><span id="toc22">FileSystemObjectでよくあるエラーと対処法</span></h2>



<figure class="wp-block-table"><table><thead><tr><th>エラー</th><th>原因</th><th>対処法</th></tr></thead><tbody><tr><td>実行時エラー &#8217;58&#8217;：既に存在します</td><td>既存フォルダを <code>CreateFolder</code> した</td><td><code>FolderExists</code> で事前チェックしてから作る</td></tr><tr><td>実行時エラー &#8217;76&#8217;：パスが見つかりません</td><td>親フォルダがない、パスのタイプミス</td><td>親フォルダから順に作る。パスを見直す</td></tr><tr><td>実行時エラー &#8217;53&#8217;：ファイルが見つかりません</td><td><code>GetFile</code> / <code>CopyFile</code> で元ファイルがない</td><td><code>FileExists</code> で事前チェックする</td></tr><tr><td>実行時エラー &#8217;70&#8217;：書き込みできません</td><td>ファイルが他で開かれている、読み取り専用</td><td>ファイルを閉じる。<code>DeleteFile</code> は第2引数に <code>True</code></td></tr><tr><td>ユーザー定義型は定義されていません</td><td>参照設定なしで <code>As Scripting.FileSystemObject</code></td><td>参照設定する。または <code>CreateObject</code> と <code>As Object</code> に変える</td></tr><tr><td>パスがつながらない</td><td>末尾の <code></code> を付け忘れた（<code>C:datafile.xlsx</code>）</td><td>パスとファイル名を <code></code> でつなぐ。<code>BuildPath</code> を使う</td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>NOTE</strong></p><p>FSOを使うマクロは、必ず <strong>マクロ有効ブック（.xlsm）</strong> で保存してください。通常の .xlsx で保存すると、マクロが消えてしまいます。ファイル形式の違いは<a href="https://mashukabu.com/excel-vba-filetype-explanation/">.xlsxと.xlsmの違い</a>で解説しています。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc23">Dir関数との使い分け</span></h2>



<p class="wp-block-paragraph">ファイル操作には、FSO以外に <strong>Dir関数</strong> という方法もあります。VBA組み込みの関数で、参照設定なしで使えます。</p>



<p class="wp-block-paragraph">両者の違いを整理しておきましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>Dir関数</th><th>FileSystemObject</th></tr></thead><tbody><tr><td>準備</td><td>不要（組み込み）</td><td>参照設定 or CreateObject</td></tr><tr><td>速度</td><td>速い・軽い</td><td>やや重い</td></tr><tr><td>存在確認</td><td>できる（戻り値が空かで判定）</td><td>FileExists / FolderExists で明快</td></tr><tr><td>一覧取得</td><td>できる（書き方にクセあり）</td><td>Files / SubFolders で直感的</td></tr><tr><td>サブフォルダ再帰</td><td>書きにくい（状態が壊れやすい）</td><td>書きやすい</td></tr><tr><td>ファイル情報</td><td>取れない</td><td>サイズ・更新日時などが取れる</td></tr><tr><td>可読性</td><td>やや低い</td><td>高い</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>使い分けの目安</strong></p>



<ul class="wp-block-list"><li><strong>単純な存在確認・1フォルダの列挙だけ</strong> → Dir関数でも十分</li><li><strong>サブフォルダまで再帰的に探す・ファイル情報を取る・読みやすさ重視</strong> → FSO</li></ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>TIP</strong></p><p>Dir関数は、ループの途中で別のDir呼び出しを挟むと検索状態が壊れます。一方FSOは <code>Files</code> コレクションを <code>For Each</code> で回すだけなので、こうした落とし穴がありません。複雑な処理ほどFSOが安全です。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc24">まとめ</span></h2>



<p class="wp-block-paragraph">VBA FileSystemObjectは「<strong>Windowsのファイル操作をVBAから命令できる</strong>」オブジェクトです。</p>



<ul class="wp-block-list"><li>準備は <strong>CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</strong> が配布向きで安全</li><li>フォルダは <strong>FolderExists</strong> で確認してから <strong>CreateFolder</strong> で作る（既存だとエラー・1階層のみ）</li><li>ファイルは <strong>FileExists</strong> で確認、<strong>GetFolder + Files</strong> で一覧取得、<strong>CopyFile / MoveFile / DeleteFile</strong> で操作</li><li>拡張子の絞り込みは <strong>GetExtensionName</strong> が便利</li><li>単純な処理は <strong>Dir関数</strong>、複雑な処理や再帰探索は <strong>FSO</strong> と使い分ける</li></ul>



<p class="wp-block-paragraph">まずは「フォルダがなければ作る」のコードをVBEに貼り付けて、動きを確かめてみてください。月次の手作業がボタン1つに変わると、ファイル整理がぐっと楽になりますよ。</p>



<p class="wp-block-paragraph">ファイル操作を覚えたら、次は<a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習ロードマップ</a>で全体の学習ステップを確認してみましょう。</p>



<h3 class="wp-block-heading"><span id="toc25">関連記事</span></h3>



<ul class="wp-block-list"><li><a href="https://mashukabu.com/excel-vba-howto-use-dictionary/">Dictionary（連想配列）の使い方｜重複削除・高速集計を実務コードで解説</a></li><li><a href="https://mashukabu.com/vba-howto-use-for-each-next/">For Eachの使い方｜セル・シート・配列を一括処理</a></li><li><a href="https://mashukabu.com/how-to-use-do-loop/">Do Loopの使い方｜Do While・Do Untilを4パターンで解説</a></li><li><a href="https://mashukabu.com/excel-vba-howto-use-range/">Rangeの使い方｜セルの指定・範囲操作を基本から解説</a></li><li><a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">最終行を取得する方法｜End(xlUp)とCells.Countの使い方</a></li><li><a href="https://mashukabu.com/excel-vba-conditional-branch-explanation/">If文の使い方｜条件分岐を基本から実務まで解説</a></li><li><a href="https://mashukabu.com/excel-vba-variable-explanation/">VBA変数の使い方</a></li><li><a href="https://mashukabu.com/excel-vba-filetype-explanation/">.xlsxと.xlsmの違い｜マクロ有効ブックの保存形式</a></li><li><a href="https://mashukabu.com/excel-vba-vbe-menu-explanation/">VBE画面の見方｜ウィンドウの名前と役割を整理</a></li><li><a href="https://mashukabu.com/excel-vba-learning-roadmap/">VBA学習ロードマップ</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/vba-filesystemobject/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
