連載
» 2017年04月12日 05時00分 公開

VBA/マクロ便利Tips:VBAでドライブやファイル、フォルダの存在チェックを行うには

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、存在チェックを行うメソッド――ドライブのDriveExists、ファイルのFileExists、フォルダのFolderExistsについて使い方を解説する。

[薬師寺国安,PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 10 64bit+Anniversary Update、Excel 2016


 TIPS「FileSystemObjectを使うための準備――ファイル/フォルダをコピーするには」では、ファイルシステムへアクセスするメソッドなどを提供するFileSystemObjectなどを紹介したが、今回は、指定したドライブやファイル、フォルダが存在するかどうかをチェックする方法を解説する。

ドライブの存在チェックを行うDriveExistsメソッド

 任意のドライブが存在するかどうかをチェックするには、DriveExistsメソッドを使用する。書式は下記のようになる。

DriveExistsメソッドの書式

{fso}.DriveExists ({drivespec})


 {fso}は必須だ。FileSystemObjectオブジェクトの名前を指定する。

 {drivespec}も必須だ。ドライブ文字を指定する。

 指定したドライブが存在する場合はTrue、それ以外の場合はFalseを返す(※リムーバブルメディアを使用するドライブの場合、DriveExistsメソッドはメディアが存在しなくてもTrueを返す)。

 VBEを起動して、いつものように「挿入」メニューから「標準モジュール」を選択して、Module1を作成し、リスト1のコードを記述する。新規にModuleを作成した場合は、冒頭で紹介したTIPSで説明した「Microsoft Scripting Runtimeの参照設定」を行うことを忘れないでほしい。

 

Sub ドライブの有無の確認()
  Dim fso As New Scripting.FileSystemObject
  If fso.DriveExists("J:\") = True Then
    MsgBox "J:\ドライブは存在します。"
  Else
    MsgBox "J:\ドライブは存在しません。"
  End If
  Set fso=Nothing
End Sub
リスト1 「J:\」が存在するかをチェックするコード

 上記で「J:\」と指定している箇所は、単に「J」と記述しても問題はない。

 新しいScripting.FileSyetemObjectのインスタンスを作成してfsoで参照する(2行目)。

 DriveExistsメソッドで「J:\」が存在するかどうかをチェックして、戻り値によって条件分岐を行う(3〜7行目)。

 最後にNothingでオブジェクト変数をクリアする(8行目)。

 実行すると、図1のように表示される。

図1 筆者のPCにはJ:\が存在するので、「J:\は存在します。」と表示された

ファイルの存在チェックを行うFileExistsメソッド

 任意のファイルが存在するかどうかをチェックするには、FileExistsメソッドを使用する。書式は下記のようになる。

FileExistsメソッドの書式

{fso}.FileExists({filespec})


 {fso}は必須だ。FileSystemObjectオブジェクトの名前を指定する。

 {filespec}も必須だ。存在するかどうかを調べるファイルの名前を指定する。

 指定したファイルが存在する場合は、Trueを返し、存在しない場合は、Falseを返す。

 使い方としては、リスト2のコードを参考にしてほしい。

Sub 任意のファイルが存在するかをチェックする
  Dim fso As New Scripting.FileSystemObject
  Dim myFile As String
  myFile=”K:\ExcelVBA_TextFiles\FileSystemObject_SourceFile.txt”
  If (fso.FileExists(myFile)) Then
    MsgBox myFile & “は存在します。"
  Else
    MsgBox myFile & "は、存在しません。"
  End If
  Set fso=Nothing
End Sub
リスト2 任意のファイルが存在するかをチェックするコード

 Scripting.FileSystemObjectのインスタンスを作成し、変数fsoで参照する(2行目)。

 文字列型の変数myFileを宣言し、チェックするファイル名をフルパスで格納しておく(3〜4行目)。

 FileExistsメソッドで、変数myFileに格納したファイルが存在するかどうかをチェックして、戻り値で条件分岐を行う。存在しているか否かを表示する(5〜9行目)。

 最後に、オブジェクトの変数をNothingでクリアしておく(10行目)。

 実行すると図2のように表示される。各自が試す場合は、各自のフィルダ内にあるファイルを指定してほしい。このコードのまま実行するとエラーになる可能性があるので注意が必要だ。

図2 指定したファイルが存在すると表示された

フォルダの存在チェックを行うFolderExistsメソッド

 任意のフォルダの存在するかどうかをチェックするには、FolderExistsメソッドを使用する。書式は下記のようになる。

FolderExistsメソッドの書式

{fso}.FolderExists({folderspec})


 {fso}は必須だ。FileSystemObjectオブジェクトの名前を指定する。

 {filespec}も必須だ。存在するかどうかを調べるフォルダの名前を指定する。

 指定したフォルダが存在する場合は、Trueを返し、存在しない場合は、Falseを返す。

 使い方としては、リスト3のコードを参考にしてほしい。

Sub 任意のフォルダが存在するかをチェックする
  Dim fso As New Scripting.FileSystemObject
  Dim myFolder As String
  myFolder=”K:\ExcelVBA_TextFiles\”
  If (fso.FolderExists(myFolder)) Then
    MsgBox myFolder & “は存在します。"
  Else
    MsgBox myFolder & "は、存在しません。"
  End If
  Set fso=Nothing
End Sub
リスト3 任意のフォルダが存在するかをチェックするコード

 Scripting.FileSystemObjectのインスタンスを作成し、変数fsoで参照する(2行目)。

 文字列型の変数myFolderを宣言し、チェックするフォルダ名をフルパスで格納しておく(3〜4行目)。

 FolderExistsメソッドで、変数myFolderに格納したフォルダが存在するかどうかをチェックして、戻り値で条件分岐を行う。存在しているか否かを表示する(5〜9行目)。

 最後に、オブジェクトの変数をNothingでクリアしておく(10行目)。

 実行すると図3のように表示される。

 各自が試す場合は、各自のPC内にあるフォルダを指定してほしい。このコードのまま実行するとエラーになる可能性があるので注意してほしい。

図3 指定したフォルダが存在すると表示された

次回は、ファイルの拡張子とファイルとファイル名を取得について

 今回は、ドライブやファイル、フォルダが存在するかを確認する方法を紹介した。使用するメソッドが異なるだけで、記述方法は全く同じなので、理解はしやすいだろうと思う。見て分かるように、何かが存在するかどうかをチェックするには、必ず、最後にExists(存在する)というワードが付いているので、分かりやすいと思う。記憶するのも容易だし、TIPS「FileSystemObjectを使うための準備――ファイル/フォルダをコピーするには」で紹介した自動メンバーから探し当てるのも簡単だ。

 この中で特に、ファイルが存在するかどうかをチェックするは、日常の業務でも使えると思う。たくさんのファイルの存在するフォルダの中から、自分の探したいファイルを見つけたい場合は、シートにフォーム画面を作成しておいて、ファイル名を入力すると、存在しているかどうかのメッセージを表示させるようにしておくと便利だろう。

 次回は、ファイルの拡張子とファイルとファイル名を取得について解説する。お楽しみに。

著者紹介

薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所

薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。

1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。

1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。

2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。

Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。

Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。

Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。

Microsoft MVP for Development Platforms - Windows Platform Development (Oct 2014-Sep 2015)。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。