フォルダを作成するクラス

フォルダ作成クラス

任意のディレクトリに任意の名前のフォルダを作る

新規フォルダを作るときは、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プロパティ)


をイミディエイト・ウインドウに表示させる。

実行結果

f:id:akashi_keirin:20170618084334j:plain

ほれ、この通り、新しいフォルダが作られ、

f:id:akashi_keirin:20170618084342j:plain

フォルダの属性がちゃーんと取得できる。

おわりに

ただ、このクラスが何に便利なのかはよく分からないwww

FileSystemObjectの使いどころについて、もっと勉強しないといけないっぽい。

@akashi_keirin on Twitter