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つの方法があります。
- 参照設定(事前バインディングでの生成)
- 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)のように扱って各フォルダ、ファイルを処理することができます。
コレクションについてはこちらの記事で詳しく解説しています↓
オブジェクトの階層構造(イメージ)
具体的な書き方(上記コードより抜粋)
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オブジェクトを使用することで、ファイルやフォルダを選択、開く、保存するダイアログボックスを表示できます。
まとめ
- FileSystemObjectとは
ファイルシステムへのアクセスを提供するオブジェクトです。それによりWindowsのエクスプローラーを操作することができます。 - オブジェクトを生成する方法
参照設定(事前バインディングでの生成)
CreateObjectで生成(遅延バインディングでの生成) - FSOを生成することで、フォルダ、ファイルをコレクション(WorkbooksやWorksheets)のように扱って各フォルダ、ファイルを処理できる。
以下のようなことができます。
・ドライブ内のフォルダ、ファイルの一括処理(名前の変更、削除、移動、コピー)
・フォルダ内のサブフォルダの一括処理(名前の変更、削除、移動、コピー)
・フォルダ内のファイルの一括処理(名前の変更、削除、移動、コピー)
- FileSystemObjectで自動連番付与設定
- フォルダ自動作成とファイル保存(コピーを保存)
- ユーザーフォームを使ったレコード抽出方法-基本-
- ユーザーフォームとコンボボックスの値の取得
- VBAユーザーフォームとコンボボックス
コメント