VBA

FileSystemObjectを使ってフォルダを操作する方法

記事内に商品プロモーションを含む場合があります

このページでわかること

FileSystemObjectを使ってフォルダの作成、存在チェック、名前の変更、コピー・移動、削除ができるようになります。

覚えること
  1. フォルダの作成
      FileSystemObject.CreateFolder (フォルダのパス名)
  2. フォルダが存在するかどうか
      FileSystemObject.FolderExists(フォルダのパス名)= True or False (ブール型)
  3. フォルダ名の変更
      FileSystemObject.GetFolder( パス名 ).Name = 値
  4. フォルダのコピー
      FileSystemObject.CopyFolder 元のフォルダパス , コピー先パス , [上書き可否ブール型]
  5. フォルダの移動
      FileSystemObject.MoveFolder 元のフォルダパス , 移動先パス , [上書き可否ブール型]
  6. フォルダの削除
      FileSystemObject.DeleteFolder フォルダパス名

こんにちは、hokkyokunです。
フォルダの操作をすることができると、出来る実務の幅が増えると思います。

例えば、売上を月毎に集計して、専用のフォルダに保存するとか。
さらにフォルダを自動生成させ、ほぼメンテナンスなしで運用できるようにしたりとか。

活躍の場は広いので、使っていけたらと思います。
やっていきましょう。

事前準備

FileSystemObjectオブジェクトを使うためには事前準備が必要な場合があります。

VBEの上部のツールタブから参照設定を選び、
「Microsoft Scripting Runtime」を選択して、ライブラリを使えるようにしておきましょう。

参照設定をしない場合はCreatObject

参照設定を使えない(使いたくない)事情や自分以外が使うことも想定する場合は
参照設定を使わないで処理することも検討していいとおもいます。

構文:CreateObject("Scripting.FileSystemObject")

これでインスタンスが作成されます。

Sub FileSystemObjectインスタンス()

'参照設定使う
Dim fso As FileSystemObject
Set fso = New FileSystemObject

'参照設定使わない
Dim fso2 As Object
Set fso2 = CreateObject("Scripting.FileSystemObject")

End Sub

参照設定はインテリセンスが使える

基本的には参照設定はしたほうがいいです。
インテリセンス(自動で使えるプロパティやメソッドのリストが現れる機能)が使えるので
コードを書くのがとても楽になります。

ただし、時々、参照設定がなぜかはずれちゃうこととかありますし、
他の人が使うとうまくプロシージャが動かない場合がありますので、
エラーを回避するためには参照設定なしも選択肢としてアリです。

フォルダの作成

こんな感じでフォルダ(”2021年度”となっているやつ)を作っています。
プロシージャは「親子フォルダ取得.xlsm」に書いており、これを動かします。

構文:FileSystemObject.CreateFolder (フォルダのパス名)

やりたいことは

2022年度というフォルダを新規で作ってみます

Sub FileSystemObjectフォルダ作成()

Dim fso As New FileSystemObject
fso.CreateFolder (ThisWorkbook.Path & "\2022年度")

Set fso = Nothing

End Sub

フォルダを新規作成できました。

既に同名のフォルダがあるとエラーになる。

注意が必要です。
同名のフォルダがあるとエラーになります。

例えば上記で「2022年度」のフォルダを作成した後に
もう一度プロシージャを動かして見ます

エラーが発生してしまいました。
エラーを回避するためにはフォルダが存在しているかどうかをチェックするといいです。
次でご紹介します。

フォルダが存在するかどうか

フォルダがあるかどうか、その存在をチェックするプロシージャです。

構文:FileSystemObject.FolderExists(フォルダのパス名)= True or False (ブール型)

やりたいことは

「2022年度」フォルダがあるかどうかを確認します。

Sub FileSystemObjectフォルダがあるかどうか()

Dim fso As New FileSystemObject
If fso.FolderExists(ThisWorkbook.Path & "\2022年度") = True Then
    MsgBox ("2022年度フォルダがあります")
Else
    MsgBox ("2022年度フォルダがありません")
End If

Set fso = Nothing

End Sub

フォルダが存在する場合はこんな感じでメッセージでます。

組み合わせて安全にフォルダを作成する方法

フォルダの存在を確認してからフォルダを作成すれば、
エラーを出すこともなくプログラムを実行できます。

Sub FileSystemObjectフォルダ作成2()

Dim fso As New FileSystemObject 'FileSystemObjectのインスタンス
Dim folderPath As String '作成するフォルダのパス名と名前

folderPath = ThisWorkbook.Path & "\2022年度"

'フォルダが存在するかどうかチェック
'存在しない場合は新規作成
If fso.FolderExists(folderPath) = False Then
    fso.CreateFolder (folderPath)
End If

Set fso = Nothing

End Sub

フォルダ名の変更

次は既存のフォルダ名を変更してみましょう。

やりたいことは「2021年度」というフォルダを「2022年度」に変えることです。

構文:FileSystemObject.GetFolder( パス名 ).Name = 値
Sub FileSystemObject名前変更()

Dim fso As New FileSystemObject
fso.GetFolder(ThisWorkbook.Path & "\2021年度").Name = "2022年度"

Set fso = Nothing

End Sub

こんな感じにフォルダ名を変更できました。

フォルダのコピー・移動

フォルダをコピー・移動させることもできます。

コピー
構文:FileSystemObject.CopyFolder 元のフォルダパス , コピー先パス , [上書き可否ブール型]
移動
構文: FileSystemObject.MoveFolder 元のフォルダパス , 移動先パス , [上書き可否ブール型]

やりたいこと

「サンプルフォルダ」をマクロファイルと同じ階層に作りました。
これを「2022年度」フォルダの中に移動させたいと思います。

Sub FileSystemObject移動()

Dim fso As New FileSystemObject
fso.MoveFolder ThisWorkbook.Path & "\サンプルフォルダ", ThisWorkbook.Path & "\2022年度\サンプルフォルダ"

Set fso = Nothing

End Sub

フォルダの削除

最後にフォルダを削除してみます。

構文:FileSystemObject.DeleteFolder フォルダパス名

やりたいこと

「2022年度」フォルダを削除します。

Sub FileSystemObject削除()

Dim fso As New FileSystemObject
fso.DeleteFolder ThisWorkbook.Path & "\2022年度"

Set fso = Nothing

End Sub

まとめ

事前準備
  • VBEの上部のツールタブから参照設定を選ぶ
  • 「Microsoft Scripting Runtime」を選択して、ライブラリを使えるようにする
  • まとめ
  • フォルダの作成
      FileSystemObject.CreateFolder (フォルダのパス名)

  • フォルダが存在するかどうか
      FileSystemObject.FolderExists(フォルダのパス名)= True or False (ブール型)

  • フォルダ名の変更
      FileSystemObject.GetFolder( パス名 ).Name = 値

  • フォルダのコピー
      FileSystemObject.CopyFolder 元のフォルダパス , コピー先パス , [上書き可否ブール型]

  • フォルダの移動
      FileSystemObject.MoveFolder 元のフォルダパス , 移動先パス , [上書き可否ブール型]

  • フォルダの削除
      FileSystemObject.DeleteFolder フォルダパス名

  • フォルダ存在チェックはできるだけ入れるようにしよう

    フォルダが存在する場合に同じ名前で新規作成したり、
    フォルダがないのに削除したりするとエラーを起こします。

    なので、極力フォルダ存在チェックをいれてプログラムが止まらない工夫が必要だと思います。

    If fso.FolderExists(フォルダパス) = True Then
        フォルダが存在する場合の処理(削除、移動、コピーなど)
    else
        フォルダが存在しない場合の処理(作成など)
    End If
    
    

    こんな感じでプログラムを組むと良いと思います。

    ではでは。