スポンサーリンク
前回は、Excel VBAのFileSystemObjectでファイルのコピー・移動などする処理を扱った。今回はそれに続き、フォルダを操作する処理を取り扱う。
フォルダを操作する処理についても
- FileSystemObjectを全く使わない方法(お手軽)
- FileSystemObjectを使う方法(ワイルドカードなど、特別な処理を組み込める)
- FileSystemObject―Folderオブジェクトを使う方法(ワイルドカードなど使えないので、使わなくても良い)
とあるので、それぞれ記述方法を示していく。
フォルダを新規作成する
MkDir
- MkとはMakeのこと。
- 既に存在するフォルダと同じパスのフォルダを作成しようとすると、エラーになる。
1 |
MkDir ("C:\tmp\FSOフォルダ") |
FileSystemObject.CreateFolder
- 既に存在するフォルダと同じパスのフォルダを作成しようとすると、エラーになる。
- このFileSystemObject.CreateFolderを単体で使ってフォルダ作成するだけでも良いが、結果(返り値)として、作成したフォルダのフルパスが文字列として返ってくる。
下記ソースコードではそれを、文字列変数resultに代入している。
1 2 3 4 5 6 7 8 9 10 11 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject FSO.CreateFolder ("C:\tmp\FSOフォルダ") Dim result As String 'FSO.CreateFolderの結果は文字列で返る。 '下記の処理は、文字列変数resultに「C:\tmp\FSOフォルダその2」を返す result = FSO.CreateFolder("C:\tmp\FSOフォルダその2") Debug.Print result |
フォルダ名を変更する
Name
1 |
Name "C:\tmp\新しいフォルダー" As "C:\tmp\名前を変更したフォルダー" |
フォルダを移動する
さて、以下に、フォルダを移動する操作について書いていくが、どうもVBAでフォルダを移動するに当たっては不便な点がある模様。
CドライブからDドライブなどと、異なるドライブへフォルダを移動しようとすると、「書き込みできません。」といったエラーが出てしまう。
調べてもみたが、今ひとつ解決方法が見付からなかった。
ひとまずVBAでのフォルダ移動は、同じドライブの間だけでやるものと覚えておこう。
FileSystemObject.MoveFolder
- ワイルドカードを使って、「○という文字を含む」条件を指定して、それに合致するフォルダを全て移動するという処理もできる。
1 2 3 4 5 6 7 8 9 10 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'フォルダを移動する。 '移動先フォルダ名の後に必ず「\」を付ける。 FSO.MoveFolder "C:\tmp\移動するフォルダ001", "C:\受け入れ先\" 'ワイルドカードを使って、「移動」語句を含むフォルダを全て別フォルダに移動する例 FSO.MoveFolder "C:\tmp\*移動*", "C:\受け入れ先\" |
Folder.Move
- ワイルドカードとか使えないし、特にこちらの記述を使う必要はないだろう。
1 2 3 4 5 6 7 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'フォルダを移動する。 'フォルダ名の後に必ず「\」を付ける。 FSO.GetFolder("C:\tmp\*移動*").Move "C:\受け入れ先\" |
フォルダをコピーする
- 何故かフォルダのコピーは、フォルダの移動と違って、別のドライブへコピーすることもできる。移動処理は、PCの中で使う領域をモロ変更するから駄目ということなのだろう。
FileSystemObject.CopyFolder
- ワイルドカードを使って、「○という文字を含む」条件を指定して、それに合致するフォルダを全てコピーするという処理もできる。
- フォルダ内のファイルもコピーされる。
- 最後の引数にoverwritefilesというのを指定して、同名ファイルがあったら上書きするかどうかも指定できる。
これは通常は省略してよいだろう。省略した場合はTrue扱いで、上書きされることになる。
1 2 3 4 5 6 7 8 9 10 11 12 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'フォルダをコピーする。フォルダ内のファイルもコピーされる。 '最後の引数overwritefilesは省略可能。 'デフォルトはTrueで、同名ファイルがあったら上書きする。 'Falseにすると、同パスフォルダがあったらエラー。 FSO.CopyFolder "C:\tmp\FSOフォルダ", "D:\一時保存\", overwritefiles:=True 'ワイルドカードを使って、「コピー用」語句を含むフォルダを全て別フォルダにコピーする例。 FSO.CopyFolder "C:\tmp\*コピー用*", "D:\一時保存\", overwritefiles:=True |
Folder.Copy
- ワイルドカードとか使えないし、特にこちらの記述を使う必要はないだろう。
- 最後の引数にoverwritefilesというのを指定して、同名ファイルがあったら上書きするかどうかも指定できる。
これは通常は省略してよいだろう。省略した場合はTrue扱いで、上書きされることになる。
1 2 3 4 5 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject FSO.GetFolder("C:\tmp\コピー用001").Copy "D:\一時保存\", overwritefiles:=True |
フォルダを削除する
RmDir
- RmはRemove(削除)のこと。
- RmDirは、ファイル・フォルダが入っていない空のフォルダを削除するコマンド。ファイルがなくとも、フォルダが中に入っているだけでもエラーになる。
1 |
RmDir ("C:\tmp\空のフォルダ01") |
FileSystemObject.DeleteFolder
- 最後の引数Forceを、省略せずTrueを明示指定した方が良いかもしれない。そうすれば読み取り専用ファイルも削除されるようになる。
- 処理の順序として、まずフォルダ内の全てのファイルを削除してから、次にフォルダを削除しようとする。
1 2 3 4 5 6 7 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'まずフォルダ内の全てのファイルを削除してからフォルダを削除しようとする。 '最後の引数Forceは、Trueを指定すると読み取り専用ファイルも削除される。省略時はFalse。 FSO.DeleteFolder ("C:\tmp\ファイルがあるフォルダ"), Force:=True |
Folder.Delete
- 上記のFileSystemObject.DeleteFolderとだいたい同じ。
1 2 3 4 5 6 7 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'まずフォルダ内の全てのファイルを削除してからフォルダを削除しようとする。 '最後の引数Forceは、Trueを指定すると読み取り専用ファイルも削除される。省略時はFalse。 FSO.GetFolder("C:\tmp\ファイルがあるフォルダ").Delete , Force:=True |
スポンサーリンク