スポンサーリンク
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とは、ファイルシステムへのアクセスを提供するオブジェクトです。
それによりWindowsのエクスプローラーを操作することができます。
Windowsのエクスプローラーが操作可能ということは、ファイルやフォルダの作成、名前の変更、削除、移動、コピーが可能です。
FileSystemObjectについて、主なものとして以下のことができます。
つまり、簡単に言うとフォルダ、ファイルの一括処理が可能です。
FileSystemObject(FSO)はVBAの標準機能ではないので、オブジェクトを生成する必要があります。(インスタンスの生成)
オブジェクトを生成する方法は以下の2つの方法があります。
※上記コードは1の参照設定(事前バインディング)を使用しています。
設定方法の詳細は後述しますが、定型コードとして下記の通りコードを記述します。
Dim fs As Scripting.FileSystemObject
Set fs = New Scripting.FileSystemObject
'fsは変数名なので、任意の変数名を設定します。
VBEの「ツール」→「参照設定」を選択
「Microsoft Scripting Runtime」を選択→「OK」
設定したのちに、下記の通り記述します。
Dim fs As Scripting.FileSystemObject
Set fs = New Scripting.FileSystemObject
参照設定(事前バインディング)はブックごとに行う必要があります。
つまり、ブックを変えてFSOを使う場合はブックを変える度に参照設定を行うということです。
以下のとおり記述します。
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
参照設定(事前バインディング)、CreateObjectで生成(実行時バインディング)の利点は以下の通りです。
参照設定(事前バインディング)のインテリセンス機能↓
参照設定での生成、CreateObjectでの生成ともに定型操作、定型文なので機械的に行っていけばFileSystemObjectが使えます。
ここまで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プロパティ・・・・名前の取得
myfolder.Name = Format(n, "0000") & "_" & myfolder.Name 'フォルダにナンバリング
Nameプロパティを使って、フォルダの名前を取得して、頭に番号とアンダーバーを付けています。
myfile.Name = Format(n, "0000") & "_" & myfile.Name
同じく、Nameプロパティを使って、ファイルの名前を取得して、頭に番号とアンダーバーを付けています。
連番付与の方法は、変数:nを設定して、ForEachステートメント内にn=n+1を置いて連番付与しています。
Application.FileDialog(msoFileDialogFolderPicker)
フォルダの選択には、FileDialogオブジェクトを使用しています。
こちらはFileSystemObjectではなく、Application内のFileDialogオブジェクトです。
FileDialogオブジェクトを使用することで、ファイルやフォルダを選択、開く、保存するダイアログボックスを表示できます。