FileSystemObjectで自動連番付与設定

VBA
スポンサーリンク

FileSystemObject(ファイルシステムオブジェクト)を使って、フォルダとファイルに自動連番付与する方法を紹介します。
前回記事で作成したフォルダ名とファイル名を「●●●(連番)_(アンダーバー)ファイル名」として連番を付与します。

前回の記事はこちら↓

フォルダ自動作成とファイル保存(コピーを保存)
フォルダを自動作成する方法と指定フォルダの中にブックをコピーして保存する方法を紹介しています。
スポンサーリンク
スポンサーリンク

コード

Sub Numbering()
    Application.ScreenUpdating = False
    'FileSystemObjectの設定
    Dim fs As Scripting.FileSystemObject
    Set fs = New Scripting.FileSystemObject
    Dim basefolder As Scripting.Folder
    Dim n As Long
    With Application.FileDialog(msoFileDialogFolderPicker) 'FileDialogオブジェクトでフォルダを選択
    'フォルダを取得
        If .Show = True Then
            Set basefolder = fs.GetFolder(.SelectedItems(1))
        Else
            Exit Sub
        End If
    End With
    'フォルダ名の先頭に連番を追加
    Dim myfolder As Scripting.Folder
    Dim myfile As Scripting.File
        n = 1
            For Each myfolder In basefolder.SubFolders
                myfolder.Name = Format(n, "0000") & "_" & myfolder.Name 'フォルダにナンバリング
                    For Each myfile In myfolder.Files
                            myfile.Name = Format(n, "0000") & "_" & myfile.Name 'ファイルにナンバリング"
                    Next myfile
                n = n + 1
            Next myfolder
    'オブジェクト解放
    Set myfolder = Nothing
    Set myfile = Nothing
    Set basefolder = Nothing
    Set fs = Nothing
    Application.ScreenUpdating = True
End Sub
スポンサーリンク

FileSystemObjectとは

FileSystemObjectとは、ファイルシステムへのアクセスを提供するオブジェクトです。

それによりWindowsのエクスプローラーを操作することができます。

Windowsのエクスプローラーが操作可能ということは、ファイルやフォルダの作成、名前の変更、削除、移動、コピーが可能です。

FileSystemObjectができること

FileSystemObjectについて、主なものとして以下のことができます。

  • ドライブ内のフォルダ、ファイルの一括処理(名前の変更、削除、移動、コピー)
  • フォルダ内のサブフォルダの一括処理(名前の変更、削除、移動、コピー)
  • フォルダ内のファイルの一括処理(名前の変更、削除、移動、コピー)

つまり、簡単に言うとフォルダ、ファイルの一括処理が可能です。

スポンサーリンク

FileSystemObjectを使用する方法

FileSystemObject(FSO)はVBAの標準機能ではないので、オブジェクトを生成する必要があります。(インスタンスの生成)

オブジェクトを生成する方法は以下の2つの方法があります。

  1. 参照設定(事前バインディングでの生成)
  2. CreateObjectで生成(実行時バインディングでの生成)

※上記コードは1の参照設定(事前バインディング)を使用しています。

設定方法の詳細は後述しますが、定型コードとして下記の通りコードを記述します。

Dim fs As Scripting.FileSystemObject
Set fs = New Scripting.FileSystemObject
'fsは変数名なので、任意の変数名を設定します。

1、参照設定(事前バインディング)の設定方法

VBEの「ツール」「参照設定」を選択

「Microsoft Scripting Runtime」を選択→「OK」

設定したのちに、下記の通り記述します。

Dim fs As Scripting.FileSystemObject
Set fs = New Scripting.FileSystemObject

参照設定(事前バインディング)ブックごとに行う必要があります

つまり、ブックを変えてFSOを使う場合はブックを変える度に参照設定を行うということです。

2、CreateObjectで生成(実行時バインディング)の設定方法

以下のとおり記述します。

    Dim FSO As Object    
    Set FSO = CreateObject("Scripting.FileSystemObject")
スポンサーリンク

各設定方法の利点

参照設定(事前バインディング)、CreateObjectで生成実行時バインディング)の利点は以下の通りです。

  • 参照設定(事前バインディング)の利点:VBEのインテリセンス機能が使えて自動メンバー表示されること
  • CreateObjectで生成実行時バインディング)の利点:ブックごとに参照設定を行う必要がないので、どのブックにコードを記述しても動く

参照設定(事前バインディング)のインテリセンス機能↓

インテリセンス機能

参照設定での生成CreateObjectでの生成ともに定型操作、定型文なので機械的に行っていけばFileSystemObjectが使えます。

スポンサーリンク

FileSystemObject(FSO)でフォルダ、ファイルを一括処理する方法

ここまでFSOの基本的な使い方を紹介しましたが、ここからはFSOでフォルダ、ファイルを一括処理する具体的な方法を説明していきます。

方法としては、フォルダ、ファイルをオブジェクト変数に格納して、ForEachステートメントで処理していくというものです。

つまり、FSOを生成することで、フォルダ、ファイルをコレクション(WorkbooksやWorksheets)のように扱って各フォルダ、ファイルを処理することができます。

コレクションについてはこちらの記事で詳しく解説しています↓

VBAのCollectionオブジェクトの基本
Collectionオブジェクトの基本的な使い方が簡潔に理解できます。

オブジェクトの階層構造(イメージ)

階層構造(イメージ)

具体的な書き方(上記コードより抜粋)

Dim basefolder As Scripting.Folder
Set basefolder = fs.GetFolder(Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1))

Folderオブジェクト変数を宣言して、Folderオブジェクト変数に任意のフォルダパスを格納します。

Dim myfolder As Scripting.Folder
Dim myfile As Scripting.File
 n = 1
            For Each myfolder In basefolder.SubFolders
                myfolder.Name = Format(n, "0000") & "_" & myfolder.Name 'フォルダにナンバリング
                    For Each myfile In myfolder.Files
                            myfile.Name = Format(n, "0000") & "_" & myfile.Name 'ファイルにナンバリング"
                    Next myfile
                n = n + 1
            Next myfolder

もう1度言うと、FileSystemObjectを使うことで、フォルダオブジェクト、ファイルオブジェクトをCollectionのように扱うことができます。

上記コードの場合、
④basefolder変数に格納されたフォルダ直下のフォルダ(basefolder.SubFolders)がCollectionとなり、各フォルダを1つ1つ処理していきます。

上図の通り、basefolderと入力すると、SubFoldersコレクションのインテリセンスが出現します。

For Each myfolder In basefolder.SubFolders
'basefolder直下の複数フォルダを1つ1つ処理する

プロパティとメソッド

FSOによってフォルダオブジェクト、ファイルオブジェクトのプロパティ、メソッドを使えるようになります。

Set basefolder = fs.GetFolder(Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1))

GetFolderメソッド・・・・フォルダの取得

Nameプロパティ

Nameプロパティ・・・・名前の取得

myfolder.Name = Format(n, "0000") & "_" & myfolder.Name 'フォルダにナンバリング

Nameプロパティを使って、フォルダの名前を取得して、頭に番号とアンダーバーを付けています。

myfile.Name = Format(n, "0000") & "_" & myfile.Name 

同じく、Nameプロパティを使って、ファイルの名前を取得して、頭に番号とアンダーバーを付けています。

連番付与の方法は、変数:nを設定して、ForEachステートメント内にn=n+1を置いて連番付与しています。

スポンサーリンク

FileDialogオブジェクト

Application.FileDialog(msoFileDialogFolderPicker)

フォルダの選択には、FileDialogオブジェクトを使用しています。

こちらはFileSystemObjectではなく、Application内のFileDialogオブジェクトです。

FileDialogオブジェクトを使用することで、ファイルやフォルダを選択、開く、保存するダイアログボックスを表示できます。

VBAファイルを開く方法まとめ②
Application内のFileDialogオブジェクトについて、プロパティ、メソッドの活用方法をコードを使って紹介しています。
スポンサーリンク

まとめ

  • FileSystemObjectとは
    ファイルシステムへのアクセスを提供するオブジェクトです。それによりWindowsのエクスプローラーを操作することができます。
  • オブジェクトを生成する方法
    参照設定(事前バインディングでの生成)
    CreateObjectで生成(遅延バインディングでの生成)
  • FSOを生成することで、フォルダ、ファイルをコレクション(WorkbooksやWorksheets)のように扱って各フォルダ、ファイルを処理できる。
    以下のようなことができます。
    ・ドライブ内のフォルダ、ファイルの一括処理(名前の変更、削除、移動、コピー)
    ・フォルダ内のサブフォルダの一括処理(名前の変更、削除、移動、コピー)
    ・フォルダ内のファイルの一括処理(名前の変更、削除、移動、コピー)


コメント

タイトルとURLをコピーしました