VBAで親フォルダのパスを取得する方法、Folderオブジェクトのいろいろな使い方VBA/マクロ便利Tips

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、親フォルダのパスを取得するGetParentFolderName、Folderオブジェクトを取得するGetFolderメソッドの使い方やFolder.Files、SubFolderプロパティなどについて。

» 2017年05月01日 05時00分 公開
[薬師寺国安PROJECT KySS]
「VBA/マクロ便利Tips」のインデックス

連載目次

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


 TIPS「FileSystemObjectを使うための準備――ファイル/フォルダをコピーするには」では、ファイルシステムへアクセスするメソッドなどを提供するFileSystemObjectやMicrosoft Scripting Runtimeの参照設定などを紹介したが、今回は、親フォルダのパスを取得する方法とFolderオブジェクトを使ったさまざまなTIPSについて解説する。

親フォルダのパスを取得するGetParentFolderNameメソッド

 親フォルダのパスを取得するには、GetParentFolderNameメソッドを使用する。

 指定されたパスの最後のファイル、またはフォルダの親フォルダの名前が入った文字列を返す。書式は下記のようになる。

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
リスト1 親フォルダのパスを取得するコード

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

 文字列型の変数myFolderを宣言し、フォルダ名をフルパスで指定しておく(3〜4行目)。

 セルの「1、1(A1)」に、GetParentFolderNameメソッドで、変数myFolderに格納されているサブフォルダの親フォルダのパスを取得して表示する(5行目)。

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

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

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

図1 「K:\ExcelVBA_TextFiles\backup」サブフォルダの親フォルダを取得した

Folderオブジェクトを取得するGetFolderメソッド

 GetFolderメソッドは指定されたパス内のFolderオブジェクトを返す。書式は下記のようになる。

GetFolderメソッドの書式

{fso}.GetFolder({folderspec})


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

 {folderspec}も必須だ。特定のフォルダへのパス(絶対または相対)を指定する。指定されたフォルダが存在しない場合は、エラーが発生する。

Folder.Filesプロパティで指定したフォルダ内の全てのファイル名を取得する

 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
リスト2 指定したフォルダのファイル一覧を取得するコード

 新しい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をひも付けてクリックすると、ファイル一覧が表示されるようにしてみよう。

図2 Excelのシート上に作成した、フォルダ指定欄とファイル表示覧

 フォルダにC:\Windowsを指定すると、図3のようにファイル名が取得された。サブフォルダは取得されない。

図3 C:\Windowsフォルダのファイル一覧が表示された

 エラー処理は行っていないので、フォルダを指定するセルに存在するフォルダ以外のデータを入力すると、エラーになるので注意してほしい。

Folder.SubFolderプロパティを使い、サブフォルダの個数を取得する

 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
リスト3 指定したフォルダにあるサブフォルダの個数を取得するコード

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

 Object型の変数myFolderを宣言する(3行目)。

 GetFolderメソッドで指定したフォルダにアクセスする(4行目)。

 セル「1、1(A1)」に、オブジェクト変数myFolderのSubFoldersメソッドで、「C:\Windows\」の中にあるサブフォルダを取得し、Countプロパティでその個数を取得して表示する(5行目)。

 オブジェクト変数をNothingでクリアする(6〜7行目)。

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

図4 「C:\Windows\」内にあるサブフォルダの個数が取得されてA1のセルに表示された

指定ディレクトリ内のサブフォルダを一覧表示するには

 上記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
リスト4 指定ディレクトリのサブフォルダ名を表示するコード

 新しい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をひも付けた「実行」ボタンも配置しておこう。

図5 表示項目と入力欄を作成したシート

 フォルダに「C:\Windows\」を指定して、実行すると図6のように、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.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

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

メールマガジン登録

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