フォルダを作成するクラス
フォルダ作成クラス
任意のディレクトリに任意の名前のフォルダを作る
新規フォルダを作るときは、MkDir関数を使う。
まあ、それはそれでいいのだが、何かこう、作りっぱなし感があって気持ち悪い。
せっかくなので、FileSystemObjectの練習も兼ねて、
フォルダを作るついでにFolderオブジェクトを返り値とするようなメソッドを持たせるクラスを作ってみよう
と思い立った。
相変わらず、何の役に立つのかは分からんがw
フォルダを作るクラス
例によってクラスモジュールを挿入し、オブジェクト名を「FolderCreator」とした。
あ、参照設定で「Microsoft Scripting Runtime」にチェックを入れていますよ。
リスト1 クラスモジュールのコード
Option Explicit 'Fields' Private folderPath_ As String '……(1)' Private fsObject_ As FileSystemObject Private createdFolder_ As Folder 'Accessor' Public Property Get createdFolder() As Folder '……(2)' Set createdFolder = createdFolder_ End Property 'Constructor' 'Methods' Public Function init(ByVal rootPath As String, _ ByVal folderName As String) As Folder '……(3)' folderPath_ = rootPath & "\" & folderName '……(4)''" If Dir(folderPath_, vbDirectory) = "" Then '……(5)'"" MkDir (folderPath_) End If Set fsObject_ = CreateObject("Scripting.FileSystemObject") '……(6)'"" Set createdFolder_ = fsObject_.GetFolder(folderPath_) '……(7)' Set init = createdFolder_ '……(8)' End Function
(1)からの3行
Private folderPath_ As String Private fsObject_ As FileSystemObject Private createdFolder_ As Folder
で3つの変数を準備。
「folderPath_」は別にいらないと思うが、一応。後述するinitメソッドの引数を受け取って、新たに作成するフォルダのフルパスを入れるのに使う。
「fsObject」は、FileSystemObjectオブジェクト用の変数。
「createdFolder」に新たに作成したフォルダのFolderオブジェクトを入れる。
(2)の
Public Property Get createdFolder() As Folder Set createdFolder = createdFolder_ End Property
はアクセサメソッド。基本的に新しくできたFolderオブジェクトにだけアクセスできたら、フォルダ名とかフォルダパスなんかはFolderオブジェクトから取得できるので、これで十分だと思う。
(3)から始まるFunctionプロシージャ
Public Function init(ByVal rootPath As String, _ ByVal folderName As String) As Folder
は擬似的なコンストラクタ。
VBAのコンストラクタが引数を持たせられたらいいんだけど、それができないので、
クラスをNewしたら必ず直後にinitメソッドを呼ぶ
ということを決めて、擬似的なコンストラクタとして使う。
第1引数に新しくフォルダを作りたいディレクトリのフルパス、第2引数に新しいフォルダの名前を指定する。
ここからはinitメソッドの中身。
まず、(4)の
folderPath_ = rootPath & "\" & folderName
で新しく作りたいフォルダのフルパス文字列を合成する。
(5)からの3行、
If Dir(folderPath_, vbDirectory) = "" Then MkDir (folderPath_) End If
で同名のフォルダがなければ、MkDir関数でフォルダを作る。
で、(6)の
Set fsObject_ = CreateObject("Scripting.FileSystemObject")
でFileSystemObjectのインスタンスを生成して変数「fsObject」に格納。
(7)の
Set createdFolder_ = fsObject_.GetFolder(folderPath_)
では、さっそくFileSystemObjectオブジェクトのGetFolderメソッドを用いて(5)で作った(もしくはもともとあった)フォルダをFolderオブジェクトとして取得して変数「createdFolder」に格納。
んで、(8)の
Set init = createdFolder
によってFolderPickerオブジェクトをinitメソッドの返り値にしている。
FolderCreatorクラスの使用
下記のコードで使ってみる。
リスト2 標準モジュールのコード
Public Sub test01() Dim myFolderCreator As FolderCreator '……(1)' Set myFolderCreator = New FolderCreator '……(2)' Dim myFolder As Folder '……(3)' Set myFolder = myFolderCreator.init(ThisWorkbook.Path, "ち~んw") '……(4)'"" With myFolder '……(5)' Debug.Print .Drive Debug.Print .ParentFolder Debug.Print .Name Debug.Print .Path End With End Sub
(1)の
Dim myFolderCreator As FolderCreator
でFolderCreatorクラスのインスタンス用変数「myFolderCreator」を用意。
(2)の
Set myFolderCreator = New FolderCreator
で「myFolderCreator」にFolderCreatorクラスのインスタンスを格納。
(3)の
Dim myFolder As Folder
でinitメソッドの返り値(=新しく作られるFolderオブジェクト)を受ける変数を用意して、
(4)の
Set myFolder = myFolderCreator.init(ThisWorkbook.Path, "ち~んw")
で、マクロを書いたブックのあるフォルダに「ち~んw」という名前のフォルダを作成すると同時に、できたFolderオブジェクトを変数「myFolder」に格納している。
あとは、(5)からの6行、
With myFolder Debug.Print .Drive Debug.Print .ParentFolder Debug.Print .Name Debug.Print .Path End With
では、変数「myFolder」に格納されたフォルダ(=新しく作られたフォルダ)について、
- フォルダの存在するドライブ名(Driveプロパティ)
- フォルダの親フォルダ名(ParentFolderプロパティ)
- フォルダ名(Nameプロパティ)
- フォルダのフルパス(Pathプロパティ)
をイミディエイト・ウインドウに表示させる。
実行結果
ほれ、この通り、新しいフォルダが作られ、
フォルダの属性がちゃーんと取得できる。
おわりに
ただ、このクラスが何に便利なのかはよく分からないwww
FileSystemObjectの使いどころについて、もっと勉強しないといけないっぽい。