業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、親フォルダのパスを取得するGetParentFolderName、Folderオブジェクトを取得するGetFolderメソッドの使い方やFolder.Files、SubFolderプロパティなどについて。
TIPS「FileSystemObjectを使うための準備――ファイル/フォルダをコピーするには」では、ファイルシステムへアクセスするメソッドなどを提供するFileSystemObjectやMicrosoft Scripting Runtimeの参照設定などを紹介したが、今回は、親フォルダのパスを取得する方法とFolderオブジェクトを使ったさまざまなTIPSについて解説する。
親フォルダのパスを取得するには、GetParentFolderNameメソッドを使用する。
指定されたパスの最後のファイル、またはフォルダの親フォルダの名前が入った文字列を返す。書式は下記のようになる。
{fso}.GetParentFolderName({path})
{fso}は必須だ。FileSystemObject オブジェクトの名前を指定する。
{path}も必須だ。親フォルダの名前を取得するファイルまたはフォルダのパスを指定する。
VBEを起動して、「挿入」メニューから「標準モジュール」を選択して、Module1を作成する。リスト1のコードを記述する。新規にModuleを作成した場合は「Microsoft Scripting Runtimeの参照設定」を行うことを忘れないでほしい。
Sub 親フォルダのパスを取得() Dim fso As New Scripting.FileSystemObject Dim myFolder As String myFolder="K:\ExcelVBA_TextFiles\backup\" Cells(1.1).Value= fso.GetParentFolderName(myFolder) Set fso=Nothing End Sub
Scripting.FileSystemObjectのインスタンスを作成し、変数fsoで参照する(2行目)。
文字列型の変数myFolderを宣言し、フォルダ名をフルパスで指定しておく(3〜4行目)。
セルの「1、1(A1)」に、GetParentFolderNameメソッドで、変数myFolderに格納されているサブフォルダの親フォルダのパスを取得して表示する(5行目)。
最後に、オブジェクトの変数をNothingでクリアしておく(6行目)。
実行すると図1のように表示される。
各自が試す場合は、各自のフィルダ内にあるファイルを指定してほしい。このコードのまま実行するとエラーになる可能性があるので注意が必要だ。
GetFolderメソッドは指定されたパス内のFolderオブジェクトを返す。書式は下記のようになる。
{fso}.GetFolder({folderspec})
{fso}は必須だ。FileSystemObjectオブジェクトの名前を指定する。
{folderspec}も必須だ。特定のフォルダへのパス(絶対または相対)を指定する。指定されたフォルダが存在しない場合は、エラーが発生する。
Folderオブジェクトの使い方としては、例えばFilesプロパティを使って、指定したフォルダ内の全てのファイル名を取得するなどがある。リスト2のコードを参考にしてほしい。
Sub 指定したフォルダのファイル一覧を取得() Dim fso As New Scripting.FileSystemObject Dim myFile As Object Dim myFolder As String Dim i As Long myFolder = Range("B1").Value For Each myFile In fso.GetFolder(myFolder).Files i = i + 1 Cells(i+1, 4).Value = myFile.Name Next Set myFile = Nothing Set fso = Nothing End Sub
新しいScripting.FileSyetemObjectのインスタンスを作成してfsoで参照する(2行目)。
Object型の変数myFileを宣言する(3行目)。
文字列型の変数myFolderを宣言する(4行目)。
Long型の変数iを宣言する(5行目)。
変数myFolderにセルB1に入力された値を格納する(7行目)。
For Each〜Next文を使って、GetFolderメソッドで指定したフォルダ内にあるファイルにアクセスし、セルのi+1行目の4列目に、Nameプロパティで取得したファイル名を表示する。ここで「Cells(i+1,4)」としているのは、4列目では2行目からファイル名を表示させる必要があるためだ(9〜12行目)。
変数iは行数を表すため1ずつ増加させる必要がある(10行目)。
最後にオブジェクト変数をNothingでクリアする(14〜15行目)。
Excelのシート上に図2のような項目を作り、「実行」ボタンにリスト2をひも付けてクリックすると、ファイル一覧が表示されるようにしてみよう。
フォルダにC:\Windowsを指定すると、図3のようにファイル名が取得された。サブフォルダは取得されない。
エラー処理は行っていないので、フォルダを指定するセルに存在するフォルダ以外のデータを入力すると、エラーになるので注意してほしい。
FolderオブジェクトのSubFolderメソッドを使えば、指定したフォルダにあるサブフォルダの個数を取得することもできる。例えばリスト3のコードを参考にしてほしい。
Sub 指定したフォルダ内のサブフォルダの個数を取得() Dim fso As New Scripting.FileSystemObject Dim myFolder As Object Set myFolder=fso.GetFolder("C:\Windows\") Cells(1.1).Value= myFolder.SubFolders.Count Set myFolder=Nothing Set fso=Nothing End Sub
新しいScripting.FileSyetemObjectのインスタンスを作成してfsoで参照する(2行目)。
Object型の変数myFolderを宣言する(3行目)。
GetFolderメソッドで指定したフォルダにアクセスする(4行目)。
セル「1、1(A1)」に、オブジェクト変数myFolderのSubFoldersメソッドで、「C:\Windows\」の中にあるサブフォルダを取得し、Countプロパティでその個数を取得して表示する(5行目)。
オブジェクト変数をNothingでクリアする(6〜7行目)。
実行すると、図4のように表示される。
上記2つを組み合わせると、指定ディレクトリ内のサブフォルダの一覧を表示することもできる。例えばリスト4のコードを参考にしてほしい。
Sub 指定ディレクトリのサブフォルダ名を表示() Dim fso As New Scripting.FileSystemObject Dim myFolders As Object Dim mainFolder As String Dim foldersCount As Long Dim fol As Variant Dim folderName As String Dim i As Long i = 2 Range("D2:D300").Clear mainFolder = Range("B1").Value Set myFolders = fso.GetFolder(mainFolder) foldersCount = myFolders.SubFolders.Count For Each fol In fso.GetFolder(mainFolder).SubFolders Cells(i, 4).Value = fol.Name i = i + 1 Next Set fso = Nothing End Sub
新しいScripting.FileSyetemObjectのインスタンスを作成してfsoで参照する(2行目)。3〜8行目で各変数を宣言し、変数iは2で初期化しておく(9行目)。
サブフォルダを表示させる領域であるD2〜D300までの間をクリアしておく。D300は大体の目安の範囲だ(11行目)。
mainFolder変数にセルB1に入力された値を格納する(13行目)。
GetFolderメソッドでmaiFolder変数に指定されたフォルダを変数myFoldersにセットする(14行目)。
SubFolders.Countで指定されたフォルダ内のサブフォルダの個数を取得する(15行目)。
反復変数folに、指定されたフォルダのサブフォルダ内の値を格納していき、セルのi行目の4列目にNameプロパティで取得したサブフォルダの名前を表示していく(17〜20行目)。
変数iは行数を表すので1ずつ増加させる必要がある(19行目)。
オブジェクト変数をNothingでクリアする(22行目)
図5のような表示項目と欄を作っておき、リスト4をひも付けた「実行」ボタンも配置しておこう。
フォルダに「C:\Windows\」を指定して、実行すると図6のように、C:\Windows\内のサブフォルダの一覧が表示される。
リスト4のコードでは、「フォルダを指定」欄には「C:\Windows\」のように指定する。「C:\Windows」のように最後の「\」を省略したのではエラーになるので注意してほしい。
今回は、これで終わりだ。次回は「ファイルとフォルダの移動」について紹介する。お楽しみに。
薬師寺国安事務所代表。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 © ITmedia, Inc. All Rights Reserved.