1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'FileSystemObjectの設定 Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject 'フォルダパスを取得 Dim path As String path = ThisWorkbook.path & "\Folder" '「fs.FolderExists(path)」で選択したフォルダが存在するかどうかチェック可能 If fs.FolderExists(path) = True Then 'フォルダが存在する場合の処理 ElseIf fs.FolderExists(path) = False Then 'フォルダが存在しない場合の処理 End If |
VBAでフォルダの存在をチェックする場合、FSO(FileSystemObject)を使って「FolderExists(フォルダパス)」を使います。
このページでは、VBAでフォルダの存在チェックをした上で、フォルダを作成する方法を紹介します。
・VBAでフォルダ存在していなければフォルダを作成する
上記について、コード解説をしていきます。
目次
VBA作成前の2つの事前準備
2. フォルダを扱うための事前準備
ExcelでVBAを使うためには上記の事前準備が必要です。
以下で説明します。
1. ExcelでVBAを使うための事前準備
エクセルVBAを使うためには、保存ファイルの拡張子変更、Excelの基本設定変更の2つをしておきます。
2つともで難しい作業はなく、それぞれ1分もあれば設定変更可能です。
上記に関しては、以下の記事で解説をしています。
もしVBAを使うための準備段階に不安がある人は上記をご覧ください。
この内容は以下の動画で紹介しています。
入門エクセルマクロの使い方|マクロ作成から実行までを徹底解説
文字や画像だけで分かりづらい人は上記の動画をご覧ください。
2. フォルダを扱うための事前準備
この事例ではフォルダを操作するために、FileSystemObjectを活用します。
FileSystemObjectを使用するために以下の参照設定を変更します。
これでフォルダやファイルの情報を取得することができるようになります。
設定方法の詳細は以下のページで紹介しています。
VBAでFSOを使ってフォルダ存在チェックしてフォルダ作成
今回紹介するプログラムの概要は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
'プログラム0|変数宣言の指定 Option Explicit 'プログラム1|プログラム開始 Sub CreateFolderCheckingFolderExist() 'プログラム2|FileSystemObjectの設定 Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject 'プログラム3|フォルダパスを取得 Dim path As String path = ThisWorkbook.path & "\Folder" 'プログラム4|選択したフォルダが存在するかどうかチェック If fs.FolderExists(path) = True Then MsgBox "既に存在しています" Exit Sub End If 'プログラム5|フォルダ作成 fs.CreateFolder (path) 'プログラム6|プログラム終了 End Sub |
それでは、以下でプログラムを詳しく説明していきます。
プログラム0|変数宣言の指定
1 |
Option Explicit |
「Option Explicit」とは、変数宣言を強制するためのものです。
予期しないエラーを防止できるため「Option Explicit」を入力することを習慣化することを推奨しています。
詳しい説明は以下のページで紹介しています。
プログラム1|プログラム開始
1 |
Sub CreateFolderCheckingFolderExist() |
「Sub CreateFolderCheckingFolderExist()」のプログラムを開始することを意味します。
VBAではプロシージャという単位でプログラムを呼び出します。
プロシージャの構文は下記となっています。
1 2 3 |
Sub プロシージャ名() '実行プログラム End Sub |
「Sub」で始まり「End Sub」で終わります。
「Sub XXXX」の「XXXX」の部分がプロシージャ名です。
このプロシージャ名はあらゆる文字(アルファベット、ひらがな、漢字、数字など)が使用可能です。
ただし、プロシージャ名の先頭は数字を入れるとエラーとなります。
あとで見たときに、「何のプログラムだったのか?」とならないようにするためです。
なお、「()」の中には何も記入されていません。これは引数なしという意味です。
初心者の内は、引数ということが分からなくてもVBAプログラムを書くことは可能です。
興味があれば、「VBA 引数」で検索して調べてみてください。
プログラム2|FileSystemObjectの設定
1 2 |
Dim fs As Scripting.FileSystemObject Set fs = New Scripting.FileSystemObject |
FileSystemObjectは、ファイルやフォルダを操作するときに使うオブジェクトです。
本事例ではFileSystemObjectをfsという変数として扱います。
変数fsは定義するだけではなく、「Set fs = New Scripting.FileSystemObject」と記入して使えるようになります。
これを忘れてしまうことが多いので、注意が必要です。
FileSystemObjectに関する注意点
参照設定にて、Microsoft Scripting Runtimeを設定に入れておく必要があります。
設定を忘れると動作しませんので、事前に設定を変更しておく必要があります。
なお、FileSystemObject以外にもフォルダを操作する方法はあります。しかしFileSystemObjectを使えば、ファイルとフォルダを両方操作できるので、覚えることが少なくて済みます。
細かいことを覚えるのが面倒な人は、ファイルやフォルダを操作するときはFileSystemObjectを使うと覚えておくといいです。
FileSystemObjectについては以下で詳しく説明していますので、ご覧ください。
プログラム3|フォルダパスを取得
1 2 |
Dim path As String path = ThisWorkbook.path & "\Folder" |
pathを文字列型で変数定義します。
エクセルと同じフォルダに保管されている「Folder」のパスを設定します。
pathの検証結果を出力してみます。
Debug.Printでの検証結果
1 2 3 4 5 6 |
Dim path As String path = ThisWorkbook.path & "\Folder" Debug.Print path >>>D:\Website_パソコンスキルの教科書\305_VBA_フォルダ\17_フォルダチェック\VBA\Folder |
上記の値でパスを取得しました。
このパスが存在するかどうかチェックします。
プログラム4|選択したフォルダが存在するかどうかチェック
1 2 3 4 |
If fs.FolderExists(path) = True Then MsgBox "既に存在しています" Exit Sub End If |
プログラム3で取得したpathのフォルダが存在するかどうかチェックします。
以下のFolderExistsでフォルダの存在をチェックすることができます。
「FolderSpec」は文字列であるパスを入力します。この事例では変数pathを入れています。
「FolderSpec」で指定したパスでフォルダが存在する:True
pathで指定したフォルダが既に存在する場合、Trueを返します。
その場合、新しいフォルダを作成することはできないので、以下のメッセージを表示してプログラムを強制終了させます。
メッセージ表示に関して以下の事例を交えて説明しています。
「FolderSpec」で指定したパスでフォルダが存在しない:False
pathで指定したフォルダが既に存在しない場合、Falseを返します。
その場合、新しいフォルダを作成することができるので、メッセージ表示やプログラム強制終了は不要です。
したがってFalseの場合、プログラム4はスキップされます。
プログラム5|フォルダ作成
1 |
fs.CreateFolder (path) |
プログラム4でFalseの場合、fs.CreateFolder(フォルダパス)でフォルダを作成します。
プログラム4でTrueだった場合、プログラム5は実行されない
もしプログラム4でTrue(既にフォルダが存在する)場合は、プログラムを強制終了させるため、プログラム5が実行されません。
プログラム6|プログラム終了
1 |
End Sub |
プログラム1と対になるプログラムです。プログラム終了させる記載です。
「End Sub」を読み込むと、プログラムが終了します。
Excel VBAについて詳しく理解したいなら
VBAを活用すると、仕事を効率化できる幅を広げることができます。
たとえば私が実際にVBAを活用して効率化してきた作業は以下の記事で紹介しています。
興味がある人は以下の記事もご覧ください。
動画でも解説しています。
エクセルマクロVBAで出来ることを15の事例で紹介|日常業務をラクにするヒントを見つけよう!
(音声が小さいので、ボリュームを上げてご覧いただければと思います)