<?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>ファイル操作 &#8211; biz-tactics</title>
	<atom:link href="https://mashukabu.com/tag/%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e6%93%8d%e4%bd%9c/feed/" rel="self" type="application/rss+xml" />
	<link>https://mashukabu.com</link>
	<description></description>
	<lastBuildDate>Tue, 11 Aug 2026 09:04:10 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://mashukabu.com/wp-content/uploads/2022/04/cropped-site-icon-32x32.png</url>
	<title>ファイル操作 &#8211; biz-tactics</title>
	<link>https://mashukabu.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VBAでCSVを自動で読み込む・書き出す方法｜Open文とFSOの使い分け</title>
		<link>https://mashukabu.com/excel-vba-csv-import-export/</link>
					<comments>https://mashukabu.com/excel-vba-csv-import-export/#respond</comments>
		
		<dc:creator><![CDATA[まっしゅ]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 01:46:00 +0000</pubDate>
				<category><![CDATA[VBA・マクロ]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[ファイル操作]]></category>
		<category><![CDATA[マクロ]]></category>
		<guid isPermaLink="false">https://mashukabu.com/?p=7890</guid>

					<description><![CDATA[VBAでCSVファイルを自動で読み込む・書き出す方法を解説します。Open文とFileSystemObjectの使い分け、フォルダ内CSVの一括処理、Shift-JIS/UTF-8の文字コード対処、よくあるエラーの対処法までコピペで動くコード付きで紹介します。]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">毎日や毎月届くCSVファイルを、手作業でExcelに貼り付けていませんか。「ファイルを開いて、全選択してコピーして、シートに貼り付けて……」という作業は、地味なわりに時間がかかりますよね。</p>



<p class="wp-block-paragraph">1ファイルなら数分でも、10ファイル・20ファイルと増えると一気に負担になります。しかもコピペの貼り付け位置を間違えると、データがずれて気づかないこともあります。</p>



<p class="wp-block-paragraph">そんな繰り返し作業こそ、VBA（マクロ）の出番です。一度コードを書いておけば、ボタン1つでCSVの取り込みが一瞬で終わります。この記事では、CSVを読み込むコードと書き出すコードを、コピペで動く形で順番に見ていきましょう。</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でCSVを読み込む・書き出すとは？</a><ol><li><a href="#toc2" tabindex="0">CSVファイルの中身はただのテキスト</a></li></ol></li><li><a href="#toc3" tabindex="0">VBEの起動とコードの準備</a><ol><li><a href="#toc4" tabindex="0">VBE（Visual Basic Editor）の開き方</a></li><li><a href="#toc5" tabindex="0">標準モジュールの挿入</a></li></ol></li><li><a href="#toc6" tabindex="0">基本コード｜Open文でCSVを読み込む</a><ol><li><a href="#toc7" tabindex="0">コードの仕組みを理解する</a></li></ol></li><li><a href="#toc8" tabindex="0">基本コード｜CSVを書き出す</a></li><li><a href="#toc9" tabindex="0">FileSystemObjectでCSVを扱う方法</a><ol><li><a href="#toc10" tabindex="0">Open文とFileSystemObjectの使い分け</a></li></ol></li><li><a href="#toc11" tabindex="0">実践コード｜フォルダ内のCSVを全件一括処理する</a><ol><li><a href="#toc12" tabindex="0">1行目のヘッダーをスキップしたいとき</a></li></ol></li><li><a href="#toc13" tabindex="0">文字コードのトラブル対処（Shift-JIS/UTF-8）</a></li><li><a href="#toc14" tabindex="0">よくあるエラーと対処法</a><ol><li><a href="#toc15" tabindex="0">マクロが無効になっていないか確認する</a></li></ol></li><li><a href="#toc16" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">VBAでCSVを読み込む・書き出すとは？</span></h2>



<p class="wp-block-paragraph">VBAでCSVを扱うとは、マクロを使ってCSVファイルの取り込みと出力を自動化することです。読み込みは「CSVの中身をExcelシートに展開する処理」を指します。書き出しは「シートのデータをCSVファイルとして保存する処理」のことです。</p>



<p class="wp-block-paragraph">手作業とVBAで、どれくらい差が出るのか比べてみましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>作業内容</th><th>手作業</th><th>VBA</th></tr></thead><tbody><tr><td>1ファイルの取り込み</td><td>約2〜3分</td><td>1秒以下</td></tr><tr><td>10ファイルの取り込み</td><td>約30分</td><td>数秒</td></tr><tr><td>貼り付け位置のミス</td><td>起きやすい</td><td>起きない</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ポイントは、ファイル数が増えるほど効果が大きくなることです。フォルダの中のCSVを全部まとめて処理する、といった芸当もマクロなら簡単にできます。</p>



<p class="wp-block-paragraph">CSVを扱う方法は大きく2つあります。1つは昔からある「Open文」、もう1つは「FileSystemObject（エフエスオー）」です。まずは両方の基本を押さえて、後半で使い分けを解説していきましょう。</p>



<h3 class="wp-block-heading"><span id="toc2">CSVファイルの中身はただのテキスト</span></h3>



<p class="wp-block-paragraph">CSVは「Comma Separated Values」の略で、カンマで区切られたテキストファイルです。Excelで開くと表のように見えますが、中身はメモ帳で開けるただの文字列です。</p>



<pre class="wp-block-code"><code>氏名,部署,売上
田中,営業1課,150000
佐藤,営業2課,98000</code></pre>



<p class="wp-block-paragraph">このように、1行が1レコード、カンマが列の区切りになっています。VBAでは、この「1行ずつ読む」「カンマで分ける」という流れでデータを扱うと覚えておきましょう。</p>



<h2 class="wp-block-heading"><span id="toc3">VBEの起動とコードの準備</span></h2>



<p class="wp-block-paragraph">CSV処理のコードを書く前に、VBA専用のエディタ「VBE（Visual Basic Editor）」を開きます。ここがマクロを書く作業場所です。</p>



<h3 class="wp-block-heading"><span id="toc4">VBE（Visual Basic Editor）の開き方</span></h3>



<p class="wp-block-paragraph">VBEを開く方法は2つあります。</p>



<ol class="wp-block-list"><li>キーボードで <code>Alt + F11</code> を押す（一番手軽です）</li><li>リボンの「開発」タブ →「Visual Basic」をクリックする</li></ol>



<p class="wp-block-paragraph">「開発」タブが見当たらない場合は、次の手順で表示できます。</p>



<ol class="wp-block-list"><li>「ファイル」→「オプション」を開く</li><li>「リボンのユーザー設定」を選ぶ</li><li>右側の一覧で「開発」にチェックを入れる</li><li>「OK」を押す</li></ol>



<p class="wp-block-paragraph">これでリボンに「開発」タブが追加されているはず。</p>



<h3 class="wp-block-heading"><span id="toc5">標準モジュールの挿入</span></h3>



<p class="wp-block-paragraph">VBEが開いたら、コードを書く場所「標準モジュール」を追加します。</p>



<ol class="wp-block-list"><li>メニューの「挿入」→「標準モジュール」をクリックする</li><li>画面に白いコード入力エリアが表示される</li></ol>



<p class="wp-block-paragraph">この白い画面に、これから紹介するコードを貼り付けて使います。準備はこれだけです。</p>



<h2 class="wp-block-heading"><span id="toc6">基本コード｜Open文でCSVを読み込む</span></h2>



<p class="wp-block-paragraph">まずは一番シンプルな方法、Open文でCSVを読み込むコードです。下のコードをそのままコピペすれば動きます。</p>



<pre class="wp-block-code"><code>Sub CSV読み込み_Open()
    Dim sFilePath As String '読み込むCSVのパス
    Dim sLine As String '1行分の文字列
    Dim vData As Variant 'カンマで分割した配列
    Dim iRow As Long '書き込む行番号

    sFilePath = &quot;C:datasample.csv&quot; 'CSVのパスを指定
    iRow = 1 '1行目から書き込む

    Open sFilePath For Input As #1 'ファイルを読み込みモードで開く
    Do Until EOF(1) 'ファイルの末尾まで繰り返す
        Line Input #1, sLine '1行を読み込む
        vData = Split(sLine, &quot;,&quot;) 'カンマで分割する
        '--- 分割した値をセルに書き込む ---
        Dim iCol As Long '列番号
        For iCol = 0 To UBound(vData)
            Cells(iRow, iCol + 1).Value = vData(iCol)
        Next iCol
        iRow = iRow + 1 '次の行へ
    Loop
    Close #1 'ファイルを閉じる

    MsgBox &quot;読み込みが完了しました&quot; '完了メッセージ
End Sub</code></pre>



<p class="wp-block-paragraph"><code>sFilePath</code> の部分を、自分のCSVファイルのパスに書き換えてください。実行すると、アクティブなシートの1行目からデータが展開されます。</p>



<p class="wp-block-paragraph">実行方法は2通りです。VBE上で <code>F5</code> キーを押すか、Excelに戻って「開発」タブ →「マクロ」から <code>CSV読み込み_Open</code> を選んで実行します。</p>



<h3 class="wp-block-heading"><span id="toc7">コードの仕組みを理解する</span></h3>



<p class="wp-block-paragraph">このコードがやっていることを、順番に見ていきましょう。難しく見えますが、流れはとてもシンプルです。</p>



<ol class="wp-block-list"><li><code>Open sFilePath For Input As #1</code> でCSVを読み込み用に開く</li><li><code>Do Until EOF(1)</code> でファイルの最後まで1行ずつ処理する</li><li><code>Line Input #1, sLine</code> で1行を文字列として読み込む</li><li><code>Split(sLine, ",")</code> でカンマごとに分けて配列にする</li><li><code>Cells(iRow, iCol + 1)</code> で各セルに書き込む</li><li><code>Close #1</code> でファイルを閉じる</li></ol>



<p class="wp-block-paragraph"><code>#1</code> は「ファイル番号」と呼ばれる目印です。複数ファイルを同時に開くときは <code>#2</code>、<code>#3</code> と番号を変えます。<code>EOF</code> は「End Of File」の略で、ファイルの終わりを意味します。</p>



<h2 class="wp-block-heading"><span id="toc8">基本コード｜CSVを書き出す</span></h2>



<p class="wp-block-paragraph">次は逆方向、シートのデータをCSVファイルとして書き出すコードです。集計結果を他システムに渡したいときに重宝するでしょう。</p>



<pre class="wp-block-code"><code>Sub CSV書き出し_Open()
    Dim sFilePath As String '書き出すCSVのパス
    Dim iLastRow As Long '最終行
    Dim iLastCol As Long '最終列
    Dim iRow As Long '行カウンター
    Dim iCol As Long '列カウンター
    Dim sLine As String '1行分の文字列

    sFilePath = &quot;C:dataoutput.csv&quot; '保存先のパスを指定
    iLastRow = Cells(Rows.Count, 1).End(xlUp).Row '最終行を取得
    iLastCol = Cells(1, Columns.Count).End(xlToLeft).Column '最終列を取得

    Open sFilePath For Output As #1 'ファイルを書き込みモードで開く
    For iRow = 1 To iLastRow '1行目から最終行まで
        sLine = &quot;&quot; '行の文字列を初期化
        For iCol = 1 To iLastCol '1列目から最終列まで
            sLine = sLine &amp; Cells(iRow, iCol).Value 'セルの値を連結
            If iCol &lt; iLastCol Then sLine = sLine &amp; &quot;,&quot; '区切りのカンマを追加
        Next iCol
        Print #1, sLine '1行をファイルに書き出す
    Next iRow
    Close #1 'ファイルを閉じる

    MsgBox &quot;書き出しが完了しました&quot; '完了メッセージ
End Sub</code></pre>



<p class="wp-block-paragraph">このコードは、シートの使われている範囲を自動で判定してCSVに出力します。<code>iLastRow</code> と <code>iLastCol</code> で、データがどこまで入っているかを取得しているのがポイントです。</p>



<p class="wp-block-paragraph">最終行の取得については、<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">Excel VBAで最終行を取得する方法</a>でくわしく解説しています。データ範囲を正しく取れないと書き出しが途中で切れるので、あわせて確認しておきましょう。</p>



<p class="wp-block-paragraph"><code>Print #1, sLine</code> で1行ずつファイルに書き込みます。最後のカンマが余計に付かないよう、<code>If iCol < iLastCol Then</code> で制御しているところも実務では大事です。</p>



<h2 class="wp-block-heading"><span id="toc9">FileSystemObjectでCSVを扱う方法</span></h2>



<p class="wp-block-paragraph">Open文と並んでよく使われるのが、FileSystemObject（FSO）。FSOは、ファイルやフォルダを扱うための専用オブジェクトで、コードが読みやすくなるのが特長です。</p>



<p class="wp-block-paragraph">FSOを使うには2つの書き方があります。1つは事前バインディング（参照設定が必要）、もう1つは遅延バインディング（参照設定が不要）です。配布しやすいのは、参照設定がいらない遅延バインディングです。</p>



<pre class="wp-block-code"><code>Sub CSV読み込み_FSO()
    Dim oFSO As Object 'FileSystemObject
    Dim oStream As Object 'テキストストリーム
    Dim sLine As String '1行分の文字列
    Dim vData As Variant 'カンマで分割した配列
    Dim iRow As Long '書き込む行番号
    Dim iCol As Long '列番号

    Set oFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;) 'FSOを生成
    Set oStream = oFSO.OpenTextFile(&quot;C:datasample.csv&quot;, 1) '読み込みモードで開く
    iRow = 1 '1行目から書き込む

    Do Until oStream.AtEndOfStream 'ファイルの末尾まで繰り返す
        sLine = oStream.ReadLine '1行を読み込む
        vData = Split(sLine, &quot;,&quot;) 'カンマで分割する
        '--- 分割した値をセルに書き込む ---
        For iCol = 0 To UBound(vData)
            Cells(iRow, iCol + 1).Value = vData(iCol)
        Next iCol
        iRow = iRow + 1 '次の行へ
    Loop

    oStream.Close 'ストリームを閉じる
    Set oStream = Nothing 'オブジェクトを解放
    Set oFSO = Nothing 'オブジェクトを解放

    MsgBox &quot;読み込みが完了しました&quot; '完了メッセージ
End Sub</code></pre>



<p class="wp-block-paragraph"><code>OpenTextFile</code> の第2引数 <code>1</code> が「読み込みモード」を表します。書き出すときは <code>2</code>（上書き）または <code>8</code>（追記）を使いましょう。処理の流れはOpen文とほぼ同じで、1行ずつ読んでカンマで分割しています。</p>



<h3 class="wp-block-heading"><span id="toc10">Open文とFileSystemObjectの使い分け</span></h3>



<p class="wp-block-paragraph">ここがこの記事の核心です。どちらを使うべきか、判断基準を表にまとめました。</p>



<figure class="wp-block-table"><table><thead><tr><th>比較項目</th><th>Open文</th><th>FileSystemObject</th></tr></thead><tbody><tr><td>書き方</td><td>VBA標準（追加設定不要）</td><td>オブジェクト経由</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><tr><td>文字コード</td><td>Shift-JIS中心</td><td>UTF-8も扱いやすい</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ざっくりした使い分けはこうです。1ファイルだけ素早く処理するならOpen文が向いています。フォルダ内の一覧を扱ったり複数ファイルをまとめて処理するならFSOが便利です。</p>



<p class="wp-block-paragraph">迷ったらFSOを選んでおけば、後からフォルダ処理に発展させるときに楽です。次の応用編でその威力がわかるでしょう。</p>



<h2 class="wp-block-heading"><span id="toc11">実践コード｜フォルダ内のCSVを全件一括処理する</span></h2>



<p class="wp-block-paragraph">ここからが本番です。「毎日届くCSVが溜まっているフォルダを、まとめて1枚のシートに統合したい」という実務ニーズに応えるコードを紹介します。FSOのフォルダ操作が活躍する場面。</p>



<pre class="wp-block-code"><code>Sub CSV一括取り込み()
    Dim oFSO As Object 'FileSystemObject
    Dim oFolder As Object '対象フォルダ
    Dim oFile As Object '個々のファイル
    Dim oStream As Object 'テキストストリーム
    Dim sFolderPath As String '対象フォルダのパス
    Dim sLine As String '1行分の文字列
    Dim vData As Variant 'カンマで分割した配列
    Dim iRow As Long '書き込む行番号
    Dim iCol As Long '列番号

    sFolderPath = &quot;C:datacsv&quot; '対象フォルダを指定
    iRow = 1 '1行目から書き込む

    Set oFSO = CreateObject(&quot;Scripting.FileSystemObject&quot;) 'FSOを生成
    Set oFolder = oFSO.GetFolder(sFolderPath) 'フォルダを取得

    '--- フォルダ内のファイルを1つずつ処理 ---
    For Each oFile In oFolder.Files
        '--- 拡張子がcsvのファイルだけ対象にする ---
        If LCase(oFSO.GetExtensionName(oFile.Name)) = &quot;csv&quot; Then
            Set oStream = oFSO.OpenTextFile(oFile.Path, 1) '読み込みモードで開く
            Do Until oStream.AtEndOfStream '末尾まで繰り返す
                sLine = oStream.ReadLine '1行を読み込む
                vData = Split(sLine, &quot;,&quot;) 'カンマで分割する
                For iCol = 0 To UBound(vData)
                    Cells(iRow, iCol + 1).Value = vData(iCol)
                Next iCol
                iRow = iRow + 1 '次の行へ
            Loop
            oStream.Close 'ストリームを閉じる
        End If
    Next oFile

    Set oStream = Nothing 'オブジェクトを解放
    Set oFolder = Nothing 'オブジェクトを解放
    Set oFSO = Nothing 'オブジェクトを解放

    MsgBox &quot;フォルダ内のCSVをすべて取り込みました&quot; '完了メッセージ
End Sub</code></pre>



<p class="wp-block-paragraph">このコードのキモは <code>For Each oFile In oFolder.Files</code> の部分です。フォルダの中のファイルを1つずつ取り出して、CSVだけを順番に取り込んでいます。</p>



<p class="wp-block-paragraph"><code>For Each</code> の使い方は<a href="https://mashukabu.com/vba-howto-use-for-each-next/">Excel VBAでFor Each Nextを使う方法</a>でくわしく解説していますので、ご覧ください。</p>



<p class="wp-block-paragraph"><code>GetExtensionName</code> で拡張子を調べ、<code>csv</code> のファイルだけ処理するようにしています。これでフォルダにExcelファイルやテキストファイルが混ざっていても安全です。</p>



<p class="wp-block-paragraph">変更すべき箇所は <code>sFolderPath</code> の1行のみ。自分のCSVが入っているフォルダのパスに書き換えてください。末尾の「」を忘れないのがポイントです。</p>



<h3 class="wp-block-heading"><span id="toc12">1行目のヘッダーをスキップしたいとき</span></h3>



<p class="wp-block-paragraph">複数ファイルを統合すると、各CSVの見出し行（ヘッダー）が何度も繰り返されてしまいます。これを防ぐには、各ファイルの1行目を読み飛ばす処理を追加しましょう。</p>



<pre class="wp-block-code"><code>Dim isFirstLine As Boolean '1行目かどうかの判定
isFirstLine = True 'ファイルごとにTrueにリセット

Do Until oStream.AtEndOfStream
    sLine = oStream.ReadLine '1行を読み込む
    '--- 1行目（ヘッダー）はスキップする ---
    If isFirstLine Then
        isFirstLine = False
    Else
        vData = Split(sLine, &quot;,&quot;)
        For iCol = 0 To UBound(vData)
            Cells(iRow, iCol + 1).Value = vData(iCol)
        Next iCol
        iRow = iRow + 1
    End If
Loop</code></pre>



<p class="wp-block-paragraph"><code>isFirstLine</code> というフラグを使って、ファイルの最初の1行だけ書き込みをスキップしています。ファイルごとに <code>True</code> へ戻すのを忘れないようにしてください。</p>



<h2 class="wp-block-heading"><span id="toc13">文字コードのトラブル対処（Shift-JIS/UTF-8）</span></h2>



<p class="wp-block-paragraph">CSV処理でつまずきやすいのが、文字化けです。CSVには主に「Shift-JIS」と「UTF-8」という2つの文字コードがあります。これが合っていないと、日本語が「譁・喧縺・」のように崩れてしまうので気をつけましょう。</p>



<p class="wp-block-paragraph">Open文や <code>OpenTextFile</code> は、基本的にShift-JISとして読み込みます。最近の業務システムはUTF-8で出力することが多いので、ここで文字化けが起きやすいのです。</p>



<p class="wp-block-paragraph">UTF-8のCSVを正しく読むには、ADODB.Streamというオブジェクトを使いましょう。文字コードを指定して読み込めるのが利点です。</p>



<pre class="wp-block-code"><code>Sub UTF8のCSV読み込み()
    Dim oStream As Object 'ADODB.Stream
    Dim sText As String '読み込んだ全文
    Dim vLines As Variant '行ごとの配列
    Dim vData As Variant 'カンマで分割した配列
    Dim iRow As Long '書き込む行番号
    Dim iCol As Long '列番号
    Dim i As Long '行ループ用

    Set oStream = CreateObject(&quot;ADODB.Stream&quot;) 'ストリームを生成
    oStream.Charset = &quot;UTF-8&quot; '文字コードをUTF-8に指定
    oStream.Open 'ストリームを開く
    oStream.LoadFromFile &quot;C:datautf8.csv&quot; 'ファイルを読み込む
    sText = oStream.ReadText '全文をテキストとして取得
    oStream.Close 'ストリームを閉じる
    Set oStream = Nothing 'オブジェクトを解放

    vLines = Split(sText, vbCrLf) '改行で行に分割
    iRow = 1 '1行目から書き込む
    For i = 0 To UBound(vLines)
        If vLines(i) &lt;&gt; &quot;&quot; Then '空行はスキップ
            vData = Split(vLines(i), &quot;,&quot;) 'カンマで分割
            For iCol = 0 To UBound(vData)
                Cells(iRow, iCol + 1).Value = vData(iCol)
            Next iCol
            iRow = iRow + 1 '次の行へ
        End If
    Next i

    MsgBox &quot;UTF-8のCSVを読み込みました&quot; '完了メッセージ
End Sub</code></pre>



<p class="wp-block-paragraph"><code>oStream.Charset = "UTF-8"</code> の1行で文字コードを指定するのがポイントです。Shift-JISのファイルなら <code>"Shift_JIS"</code> に変えれば対応できます。</p>



<p class="wp-block-paragraph">文字化けの原因と対処を体系的に知りたい方は、<a href="https://mashukabu.com/excel-csv-mojibake/">ExcelでCSVが文字化けする原因と直し方</a>もどうぞ。手作業での開き方も含めて整理しています。</p>



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



<p class="wp-block-paragraph">CSV処理でよく出るエラーと、その対処法をまとめました。エラーメッセージが出ても、原因がわかれば落ち着いて対応できます。</p>



<figure class="wp-block-table"><table><thead><tr><th>エラー・症状</th><th>主な原因</th><th>対処法</th></tr></thead><tbody><tr><td>実行時エラー'53' ファイルが見つかりません</td><td>パスやファイル名の間違い</td><td>パスを正確に指定し直す</td></tr><tr><td>実行時エラー'76' パスが見つかりません</td><td>フォルダが存在しない</td><td>フォルダのパスを確認する</td></tr><tr><td>実行時エラー'70' 書き込みできません</td><td>ファイルを別ソフトで開いている</td><td>Excelやメモ帳を閉じる</td></tr><tr><td>日本語が文字化けする</td><td>文字コードの不一致</td><td>ADODB.Streamで文字コード指定</td></tr><tr><td>データが1列に詰まる</td><td>区切り文字がカンマでない</td><td>Splitの第2引数を見直す</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">特に多いのが、ファイルを開いたまま書き出そうとして起きる「実行時エラー'70'」です。出力先のCSVをExcelやメモ帳で開いていないか、まず確認してください。</p>



<p class="wp-block-paragraph">実務で使うなら、エラーが出ても処理が止まらないようにエラーハンドリングを入れておくと安心です。<code>On Error GoTo</code> の使い方は<a href="https://mashukabu.com/vba-error-handling-complete-guide/">VBAのエラーハンドリング完全ガイド</a>でくわしく解説しています。</p>



<h3 class="wp-block-heading"><span id="toc15">マクロが無効になっていないか確認する</span></h3>



<p class="wp-block-paragraph">書いたマクロが動かないときは、ファイルの保存形式やセキュリティ設定が原因かもしれません。次の2点を確認してください。</p>



<ol class="wp-block-list"><li>ファイルを「Excelマクロ有効ブック（.xlsm）」で保存しているか</li><li>マクロのセキュリティ設定でマクロが許可されているか</li></ol>



<p class="wp-block-paragraph">通常の <code>.xlsx</code> 形式で保存すると、マクロが消えてしまいます。マクロを含むファイルは必ず <code>.xlsm</code> で保存しましょう。これはCSV処理に限らず、すべてのVBA作業で共通の注意点です。</p>



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



<p class="wp-block-paragraph">VBAを使えば、手作業で繰り返していたCSVの取り込みと書き出しを、ボタン1つで自動化できます。最後にポイントを整理しておきます。</p>



<ul class="wp-block-list"><li><strong>読み込みの基本</strong>: <code>Open ～ For Input</code> または FSOの <code>OpenTextFile</code> で1行ずつ読む</li><li><strong>書き出しの基本</strong>: <code>Open ～ For Output</code> で <code>Print #1</code> を使って1行ずつ書く</li><li><strong>使い分け</strong>: 1ファイルならOpen文、フォルダ一括処理ならFileSystemObject</li><li><strong>一括処理</strong>: <code>For Each oFile In oFolder.Files</code> でフォルダ内のCSVを全件処理</li><li><strong>文字化け対処</strong>: UTF-8のCSVはADODB.Streamで文字コードを指定して読む</li><li><strong>保存形式</strong>: マクロを含むファイルは必ず <code>.xlsm</code> で保存する</li></ul>



<p class="wp-block-paragraph">毎月のCSV取り込みに30分かかっていた作業も、自動化すれば数秒で終わるでしょう。初回のコード作成だけがんばれば、あとはずっと時短の恩恵を受けられます。まずはこの記事の基本コードをコピペして、<code>sFilePath</code> を自分のファイルに書き換えるところから試してみてください。</p>



<p class="wp-block-paragraph">VBAの基本構文をテーマ別に学び直したい方は、こちらの記事もあわせてどうぞ。</p>



<ul class="wp-block-list"><li>繰り返し処理の基本は<a href="https://mashukabu.com/excel-vba-howto-use-for/">Excel VBAでFor文を使う方法</a></li><li>コレクション処理は<a href="https://mashukabu.com/vba-howto-use-for-each-next/">Excel VBAでFor Each Nextを使う方法</a></li><li>セル操作の基本は<a href="https://mashukabu.com/excel-vba-howto-use-range/">Excel VBAでRangeを使う方法</a></li><li>最終行取得は<a href="https://mashukabu.com/excel-vba-howto-get-lastrow/">Excel VBAで最終行を取得する方法</a></li></ul>



<p class="wp-block-paragraph">VBA全体を体系的に学びたい方もいるでしょう。入門ハブ記事の<a href="https://mashukabu.com/excel-vba-automation-guide/">Excel VBAでマクロ自動化を始めるための完全ガイド</a>も参考にしてください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://mashukabu.com/excel-vba-csv-import-export/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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-2" checked><label class="toc-title" for="toc-checkbox-2">目次</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」を選びます。</p><p>「開発」タブが表示されていないときは、「ファイル」→「オプション」→「リボンのユーザー設定」で「開発」にチェックを入れてください。</p><p>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>です。</p>



<p class="wp-block-paragraph">たとえば <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>



<ul class="wp-block-list"><li>ファイルがあるか確認する</li><li>フォルダ内の一覧を取る</li><li>コピーする</li></ul>



<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>）。</p><p>この場合、同名ファイルがあるとエラーになります。コピー前に <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つ。</p>



<ul class="wp-block-list"><li><code>Left(f.Name, 7)</code> でファイル名の先頭7文字（<code>2026-04</code>）を取り出し、フォルダ名にしていること</li><li>移動前に <code>FolderExists</code> で確認し、なければ <code>CreateFolder</code> で作っていること</li></ul>



<p class="wp-block-paragraph">これで「フォルダがない」エラーを防げます。</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>
