概要
ExcelやAccessでサブフォルダのサブフォルダまで1発で作りたいってなったときに、皆さんはどうされていますか?
MkDirやFilesystemObjectのCreateFolderで1行で書こうとしても、「サブフォルダが存在しません」等のエラーが出て、もやもやすると思います。
例)FSO.CreateFolder(“C:\Users\UserName\Desktop\test\test2\test3”)
玄人の方であれば、APIを使って書く方もいますが、モジュールの一番上にAPI設定を書かないといけないので実質1行ではありません。(SHCreateDirectoryEx等)
意外とできそうでできないですよね。
そんな方に簡単な解決方法を教えます。
VBAからコマンドプロンプトを使おう!
結果から伝えると、VBAからコマンドプロンプトのmkdirコマンドを使って作成します。
作成方法は以下のとおりです。
1 2 3 |
Sub MultiLevelMkDir() Call CreateObject("WScript.Shell").Exec("%ComSpec% /c mkdir C:\Users\UserName\Desktop\test\test2\test3") End Sub |
たった1行でできました!
もし、参照設定も変数設定もしっかりやりたいという方であれば、次のコードを使用しましょう。
参照設定で、「Windows Script Host Object Model」にチェックを入れてください。
1 2 3 4 5 6 |
Option Explicit Sub MultiLevelMkDir() Dim WSH As New IWshRuntimeLibrary.WshShell Call WSH.Exec("%ComSpec% /c mkdir C:\Users\UserName\Desktop\test\test2\test3") End Sub |
もし、フォルダ作成が完了する前に次の処理に進んでエラーが出るときは、コマンド処理が完了するまで待機する処理を追加しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Option Explicit Sub MultiLevelMkDir() Dim WSH As New IWshRuntimeLibrary.WshShell Dim WSHResult As IWshRuntimeLibrary.WshExec Set WSHResult = WSH.Exec("%ComSpec% /c mkdir C:\Users\UserName\Desktop\test\test2\test3") 'コマンド処理が完了するまで待機 Do While WSHResult.Status = WshRunning DoEvents Loop End Sub |
どうだったでしょうか?コマンドプロンプトを使うと意外と楽になる処理が意外とあります。
最終階層までのファイル一覧の取得もFileSystemObjectでやるよりもコマンドプロンプトでやるほうが早かったりするのでおすすめです。今度記事にします。
---コメント---