【エクセルVBA】指定のフォルダが存在するか判定して、存在してなければ作成する方法


cat

photo credit: Fygget Cat file escapes via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでファイルやフォルダを操作するFileSystemオブジェクトの使い方を連載でお伝えしています。

前回の記事はこちら!

【エクセルVBA】FileSystemオブジェクトでファイルやフォルダが存在するかを判定する
エクセルVBAのFileSystemオブジェクトでファイルやフォルダの操作をする方法をお伝えしています。今回はFileExists、FolderExistsメソッドでファイル・フォルダの存在を判定します。

FileSystemオブジェクトでファイルやフォルダが存在するかを判定する方法をお伝えしました。

さて、判定するのはいいですが、目的のフォルダが存在しなかったとき、どうしましょう?

フォルダの判定確認をするということは、VBAプログラムで使いたい可能性が高いですよね。

そんな時は、作ってしまえ!

ということで、エクセルVBAで指定のフォルダの存在確認をして、存在しなかった場合にフォルダを作成する方法についてお伝えします。

今回もFileSystemオブジェクトを使いますよ。

では、行ってみましょ!

スポンサーリンク

前回のおさらい:フォルダの存在チェック

前回作成したプログラムはこちらでした。

Sub フォルダの存在確認をする()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

Debug.Print objFso.FolderExists(ThisWorkbook.Path & "\pdf")
Debug.Print objFso.FolderExists(ThisWorkbook.Path & "\エクセル") 

Set objFso = Nothing

End Sub

FolderExistsメソッドを使って、Thisworkbookと同階層のフォルダ内に「pdf」または「エクセル」というフォルダが存在するかどうかを判定する内容です。

存在していればTrue、そうでなければFalseがイミディエイトウィンドウに出力されます。

今回は、ただ判定するだけでなく、フォルダがなかったら作成するように、変更をしていきたいと思います。

FolderExistsメソッドをIf文の条件式として使う

FolderExistsメソッドはTrueまたはFalseを返しますから、そのままIf文の条件文に使用することができます。

例えば、このようなプログラムですね。

Sub フォルダの存在確認をする()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

If objFso.FolderExists(ThisWorkbook.Path & "\pdf") Then
    MsgBox "フォルダpdfは存在しています"
Else
    MsgBox "フォルダpdfは存在していません"
End If

Set objFso = Nothing

End Sub

pdfフォルダが存在していれば「フォルダpdfは存在しています」、さもなくば「フォルダpdfは存在していません」と表示されます。

条件分岐の結果、Falseならフォルダを作成するようにすればよいのですね。

CreateFolderメソッドでフォルダを作成する

フォルダを作成するには、FileSystemオブジェクトのCreateFolderメソッドを使います。

書き方はこちらです。

FileSystemオブジェクト.CreateFolder(作成するフォルダのパス)

実際のプログラムとしては、このようなものが考えられるでしょう。

Sub フォルダの存在確認をしてなければ作成する()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

If objFso.FolderExists(ThisWorkbook.Path & "\pdf") Then
    MsgBox "フォルダpdfは存在しています"
Else
    objFso.CreateFolder (ThisWorkbook.Path & "\pdf")
    MsgBox "フォルダpdfは存在しなかったので作成しました"
End If

Set objFso = Nothing

End Sub

このプログラムでは判定してから存在しない場合のみ作成をするので問題ありませんが、既に存在するフォルダを指定するとエラーになるので注意ください。

CreateFolderメソッドはフォルダのパスを返す

また、CreateFolderは返り値として作成したフォルダのパスを返しますので

Sub フォルダの存在確認をしてなければ作成する()

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

Dim strFolderPath As String

If objFso.FolderExists(ThisWorkbook.Path & "\pdf") Then
    MsgBox "フォルダpdfは存在しています"
Else
    strFolderPath = objFso.CreateFolder(ThisWorkbook.Path & "\pdf")
    MsgBox "フォルダpdfは存在しなかったので作成しました" & vbNewLine & strFolderPath
End If

Set objFso = Nothing

End Sub

11行目のように変数にフォルダパスを取得できます。これは、けっこう使い場所が多いと思いますよ。

pdfフォルダが存在しない場合は、以下のようにフォルダも作成されつつ、メッセージが表示されます。

エクセルVBAでフォルダの存在を判定

まとめ

エクセルVBAでフォルダの有無を判定し、なければフォルダを作成する方法についてお伝えしました。

FolderExistsメソッドで存在を確認し、CreateFolderメソッドでフォルダを作成します。

使いどころの多いテクニックだと思いますので、ぜひマスター頂ければと思います。

次回は、FileSystemオブジェクトを使って特定のフォルダ内のファイル一覧を出力する方法についてお伝えします。

【エクセルVBA】FileSystemオブジェクトとFor Each文でファイル一覧を取得する方法
エクセルVBAでFileSystemオブジェクトを使ってファイルやフォルダの操作をする方法についてお伝えしています。今回は、FilesコレクションとそのFor Each文を使ってファイル一覧を出力する方法です。

どうぞお楽しみに!

連載目次:FileSystemオブジェクトでフォルダやファイルを操作する

ファイルやフォルダを操作するのはデリケートな気がしますが、エクセルVBAではFileSystemオブジェクトを使うことでファイル、フォルダ、ドライブをオブジェクトとして安全にそして細やかに操作をすることができます。 このシリーズでは、FileSystemオブジェクトの様々な活用法についてシリーズでお伝えしていきます。
  1. 【エクセルVBA】FileSystemオブジェクトの基本と簡単にフルパスを生成・分解する方法
  2. 【エクセルVBA】FileSystemオブジェクトでファイルやフォルダが存在するかを判定する
  3. 【エクセルVBA】指定のフォルダが存在するか判定して、存在してなければ作成する方法
  4. 【エクセルVBA】FileSystemオブジェクトとFor Each文でファイル一覧を取得する方法
  5. 【エクセルVBA】FileSystemオブジェクトでフォルダ内のサブフォルダ一覧を取得する

タイトルとURLをコピーしました