<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ファイル一覧 - プログラミングで遊ブログ</title>
	<atom:link href="https://lemon818.com/tag/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%B8%80%E8%A6%A7/feed/" rel="self" type="application/rss+xml" />
	<link>https://lemon818.com</link>
	<description>現役システムエンジニアが趣味でプログラミングする自由気ままなブログ</description>
	<lastBuildDate>Sat, 06 Jun 2020 10:17:00 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>	<item>
		<title>【Excel Vba】サブディレクトリを含むファイル一覧を取得するマクロ</title>
		<link>https://lemon818.com/excel-filelist/</link>
		
		<dc:creator><![CDATA[Take]]></dc:creator>
		<pubDate>Tue, 12 Mar 2019 11:33:00 +0000</pubDate>
				<category><![CDATA[Excel]]></category>
		<category><![CDATA[業務で役立つExcelマクロ]]></category>
		<category><![CDATA[vba]]></category>
		<category><![CDATA[サブディレクトリ]]></category>
		<category><![CDATA[サブフォルダ]]></category>
		<category><![CDATA[ファイル一覧]]></category>
		<guid isPermaLink="false">https://lemon818.com/?p=4097</guid>

					<description><![CDATA[はじめに Excel でカウントディレクトリのファイルに加えてサブディレクトリに含まれるファイルの一覧を出力するマクロの作成方法についてご紹介します。 ちょっと専門用語が多かったような気もするので、 要するにあるフォルダ…]]></description>
										<content:encoded><![CDATA[<h2>はじめに</h2>
<p>Excel でカウントディレクトリのファイルに加えて<strong>サブディレクトリに含まれるファイルの一覧を出力するマクロ</strong>の作成方法についてご紹介します。</p>
<p>ちょっと専門用語が多かったような気もするので、</p>
<p>要するに<span style="color: #ff6600;"><strong>あるフォルダ内にフォルダの中のファイルも全部含めてファイル一覧させる</strong></span>方法についてご紹介します。</p>
<p><img fetchpriority="high" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-00.png" alt="" width="732" height="383" class="aligncenter wp-image-4131" srcset="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-00.png 774w, https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-00-300x157.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-00-768x402.png 768w" sizes="(max-width: 732px) 100vw, 732px" /></p>
<p>&nbsp;</p>
<p>今回は <strong>Excel Vba</strong> を使います。</p>
<p>自分でつくってみてだいたい１～２時間くらいでできましたが、結構簡単なのでぜひ興味のある方は参考にしてみてください。</p>
<p>※実際に作成したマクロは下記からダウンロードできますので、興味のある方はぜひダウンロードしてみてください。</p>
<div class="button frame block green"><a href="https://lemon818.com/wp/wp-content/uploads/2020/06/filelist.xlsm" class="midium">サブディレクトリを含むファイル一覧マクロをダウンロード</a></div>
<p>&nbsp;</p>
<h2>作成方法</h2>
<p>ご紹介します Excel マクロは大きく二つの機能から構成されています。</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame_title">機能</div>
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square reg blue">
<ol>
<li>ファイル一覧を出力するパスを取得</li>
<li>取得したパスからファイル一覧を出力</li>
</ol>
</div>
</div>
</div>
</div>
<h3>ファイル一覧を出力するパスを取得</h3>
<p><img decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-3.png" alt="" width="694" height="197" class="aligncenter wp-image-4111" srcset="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-3.png 726w, https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-3-300x85.png 300w" sizes="(max-width: 694px) 100vw, 694px" /></p>
<p>ファイル一覧を表示させるためのファイルパスを取得するための機能をご紹介します。</p>
<p>下記画面のように「フォルダパス取得」ボタンを押下することで、ファイル一覧を表示させるためのファイルパス（下画面なら「C:\test」)を表示させます。</p>
<p>下記にソースコードを記載します。</p>
<pre class="crayon-plain-tag">Option Explicit

Const X As Integer = 1
Const Y As Integer = 8
Const CELL_FILE_PATH As String = "B3"

Const ERRORMESSAGE As String = "フォルダ一覧を出力するための正しいパスを入力ください。"
Const COMPLETEMSG As String = "処理が完了しました。"

' ファイルパス取得
Sub getFilePath()

     With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then
            Range(CELL_FILE_PATH).Value = .SelectedItems(1)
        End If
    End With
    
End Sub

' メイン
Sub getFileList()

    Dim start_x As Long: start_x = X
    Dim start_y As Long: start_y = Y
    Dim searchFolderPath As String
    Dim checkFolderPath
    
    Application.ScreenUpdating = False
    On Error Resume Next
    
    searchFolderPath = Range(CELL_FILE_PATH).Value
    
    ' ファイルの存在チェック
    checkFolderPath = Dir(searchFolderPath, vbDirectory)
    
    If searchFolderPath = "" Or checkFolderPath = "" Then
        MsgBox ERRORMESSAGE, vbCritical
        End
    End If

    ' シートの初期化
    Call settingSheet
    
    '　ファイル一覧作成
    Call printFileList(searchFolderPath, start_x, start_y)

    ' フォーマット整形
    Call formattingSheet

    MsgBox COMPLETEMSG, vbInformation

    Application.ScreenUpdating = True

End Sub

' ファイル一覧作成
Private Sub printFileList(searchFolderPath As String, ByRef start_x, ByRef start_y)
    
    Dim fso As New FileSystemObject
    Dim folderList As Folders
    Dim folderName As folder
    Dim fileName As File
    
    Dim str As String
    Dim slashNum As Long
    
    Set folderList = fso.GetFolder(searchFolderPath).SubFolders
    
    'フォルダ内のファイル名の取得し、セルにパスとファイル名を書き込む
    For Each fileName In fso.GetFolder(searchFolderPath).Files
        
        slashNum = InStrRev(fileName.Path, "\")
        Cells(start_y, start_x).Value = Mid(fileName.Path, slashNum + 1)
        Cells(start_y, start_x + 1).Value = Left(fileName.Path, slashNum - 1)
        Cells(start_y, start_x + 2).Value = Format(fileName.Size / 1024, "0.#0000") &amp; " バイト"
        Cells(start_y, start_x + 3).Value = fileName.DateCreated
        Cells(start_y, start_x + 4).Value = fileName.DateLastModified
        start_y = start_y + 1
    
    Next
    
    ' サブフォルダ一覧取得　再帰処理
    For Each folderName In folderList
        Call printFileList(folderName.Path, start_x, start_y)
    Next
    
End Sub

' シートの初期化
Private Sub settingSheet()

    Dim maxCol
    Dim maxRow

    maxRow = Cells(Rows.Count, X).End(xlUp).Row
    maxCol = Cells(Y, Columns.Count).End(xlToLeft).Column
    Range(Cells(Y, X), Cells(maxRow + Y, maxCol + X)).ClearContents

End Sub

' フォーマット整形
Private Sub formattingSheet()

    Columns("A:E").Select
    Columns("A:E").EntireColumn.AutoFit
    Range("A1").Select

End Sub</pre> </p>
<p>&nbsp;</p>
<p>要はダイアログ画面からファイルをファイルパスを選択して、選択した値をB3セルに書き込むというそれだけの処理です。</p>
<p><img decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-4.png" alt="" width="676" height="523" class="aligncenter wp-image-4116" srcset="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-4.png 793w, https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-4-300x232.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-4-768x595.png 768w" sizes="(max-width: 676px) 100vw, 676px" /></p>
<p>&nbsp;</p>
<h3>取得したパスからファイル一覧を出力</h3>
<p>これは「ファイル一覧出力」ボタンを押下することで、<strong>取得したパスのファイル一覧出力を出力させる処理</strong>です。</p>
<p><img loading="lazy" decoding="async" src="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-7.png" alt="" width="970" height="297" class="aligncenter wp-image-4125" srcset="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-7.png 1049w, https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-7-300x92.png 300w, https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-7-768x235.png 768w, https://lemon818.com/wp/wp-content/uploads/2019/03/filelist-7-1024x313.png 1024w" sizes="auto, (max-width: 970px) 100vw, 970px" /></p>
<p>&nbsp;</p>
<p>処理は下記の順番になります。順を追って説明していきます。</p>
<div class="sc_designlist ol square solid blue">
<ol>
<li>取得したパスが正しい値であるかを確認</li>
<li>シートの初期化</li>
<li><span>ファイル一覧作成</span></li>
<li><span>シートのフォーマット整形</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h4>取得したパスが正しい値であるかを確認</h4>
<div class="sc_designlist ol square solid blue">
<p>ここでは<strong>取得したパスが正しいパスか</strong>どうかを確認します。</p>
<p>前述しました「ファイルパス取得」ボタンを押していれば間違いなく正しいパスが取得できますが、</p>
<p>ボタンを押し忘れたり誤って値を入力することで<strong>わけわからんパスを参照することを防ぎます。</strong></p>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">Const ERRORMESSAGE As String = "フォルダ一覧を出力するための正しいパスを入力ください。"
    Dim searchFolderPath As String
    Dim checkFolderPath

    searchFolderPath = Worksheets(FOLDERPATH).Range("B3").Value
    
    ' ファイルの存在チェック
    checkFolderPath = Dir(searchFolderPath, vbDirectory)
    
    If searchFolderPath = "" Or checkFolderPath = "" Then
        MsgBox ERRORMESSAGE, vbCritical
        End
    End If</pre>
取得したパスを変数 searchFolderPath に格納し、Dir 関数を用いてファイルの存在チェックを行います。</p>
<p>その結果を<span>checkFolderPathに格納し、もし searchFolderPath か checkFolderPath の値が空の場合はエラーメッセージを表示させ処理を終了します。</span></p>
<p>&nbsp;</p>
</div>
<h4>シートの初期化</h4>
<p>これは処理を行う前にシートをきれいにする処理のことです。</p>
<p>具体的には、ファイル一覧を出力しているセル範囲（B6以降のセル）の値のみを削除しています（書式は削除していません）。</p>
<h5>ソースコード</h5>
<pre class="crayon-plain-tag">Const X As Integer = 2
    Const Y As Integer = 6

    Dim start_x As Long: start_x = X
    Dim start_y As Long: start_y = Y    

    ' シートの初期化
    maxRow = Worksheets(FOLDERPATH).Cells(Rows.Count, X).End(xlUp).Row
    maxCol = Worksheets(FOLDERPATH).Cells(Y, Columns.Count).End(xlToLeft).Column
    Worksheets(FOLDERPATH).Range(Cells(Y, X), Cells(maxRow + Y, maxCol + X)).ClearContents</pre>
&nbsp;</p>
<h4>ファイル一覧作成</h4>
<p>ここではファイル一覧を取得し、それをシートに出力する処理です。</p>
<p>引数は、取得したパス searchFolderPath、書き込むセルの位置 start_x、 start_y の３つです。</p>
<p>まずはフォルダ以外のファイル名を取得し、そのファイルの情報（下記に記載します）を取得します。</p>
<p>下記の 変数 fileNameは<strong>フォルダ内にあるファイルを変数に格納させた値</strong>と思ってください。</p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame ">
<div class="sc_frame_text">
<div class="sc_designlist ol square solid blue">
<ol>
<li>ファイル名  ※下記に記載</li>
<li>ファイルのパス（ファイル名を除く） → <span>Left(fileName.Path, slashNum - 1)</span></li>
<li>ファイルサイズ（バイト）→ <span class="crayon-s">Format(fileName.Size / 1024, "</span><span class="crayon-cn">0.</span><span class="crayon-o">#</span><span class="crayon-cn">0</span><span class="crayon-s">") &amp; "</span><span class="crayon-h"> </span><span>バイト"</span></li>
<li>作成日時  → <span class="crayon-v">fileName</span><span class="crayon-sy">.</span><span class="crayon-e">DateCreated</span></li>
<li>更新日時 → <span class="crayon-v">fileName</span><span class="crayon-sy">.</span><span class="crayon-e">DateLastModified</span></li>
</ol>
</div>
</div>
</div>
</div>
<h5>※ ファイル名の処理</h5>
<p><span class="crayon-v">まず、フォルダ内のファイルのフルパス </span><span class="crayon-v">fileName</span><span class="crayon-sy">.</span><span class="crayon-v">Path とし、その fileName<span class="crayon-sy">.</span>Pathの後方から最初に来る「\」よりも後ろの値を取得します。</span></p>
<p>何言っているかよくわからない方もいると思いますので、もう少し具体的に説明しますと</p>
<p>例えば<span class="crayon-v">フォルダ内のファイルのフルパス </span><span class="crayon-v">fileName</span><span class="crayon-sy">.</span><span class="crayon-v">Pathが以下のような値としますと、</span></p>
<div class="sc_frame_wrap inline blue">
<div class="sc_frame ">
<div class="sc_frame_text">C:\test\test1\aaa.txt</div>
</div>
</div>
<div>このうちファイル名は「<strong>aaa.txt</strong>」であるため、まずこの文字列を<strong>前から数えて「\」がある箇所が何番目にあるか</strong>を確認し、</div>
<div>その値を <span>slashNumとします。</span></div>
<div></div>
<div>そして <span class="crayon-v"> </span><span class="crayon-v">fileName</span><span class="crayon-sy">.</span><span class="crayon-v">Path から 「</span><span>slashNum - 1」番目以降（- 1は「\」を除くため）にある文字を抽出することでファイル名が取得できます。 </span></div>
<div></div>
<div>下記にソースコードを記載します。</div>
<pre class="crayon-plain-tag">slashNum = InStrRev(fileName.Path, "\")
        'セルにパスとファイル名を書き込む
        Worksheets(FOLDERPATH).Cells(start_y, start_x).Value = Mid(fileName.Path, slashNum + 1)</pre>
&nbsp;</p>
<p>次にフォルダ内にあるサブフォルダ（サブディレクトリ）については、GetFolder関数を用いて取得します。</p>
<p>そして再帰処理（つまり処理を繰り返す）を行い、<strong>サブフォルダが見つからなくなくなる</strong>まで処理をくり返します。</p>
<p>その処理を繰り返している間も、<span style="color: #ff6600;"><strong>そのフォルダに含まれるファイル名はすべて出力する</strong></span>ようにします。</p>
<p>下記にソースコードを記載します。</p><pre class="crayon-plain-tag">' ファイル一覧作成
Private Sub printFileList(searchFolderPath As String, ByRef start_x, ByRef start_y)
    
    Dim fso As New FileSystemObject
    Dim folderList As Folders
    Dim folderName As folder
    Dim fileName As File
    
    Dim str As String
    Dim slashNum As Long
    
    Set folderList = fso.GetFolder(searchFolderPath).SubFolders
    
    'フォルダ内のファイル名の取得
    For Each fileName In fso.GetFolder(searchFolderPath).Files
        slashNum = InStrRev(fileName.Path, "\")
        'セルにパスとファイル名を書き込む
        Worksheets(FOLDERPATH).Cells(start_y, start_x).Value = Mid(fileName.Path, slashNum + 1)
        Worksheets(FOLDERPATH).Cells(start_y, start_x + 1).Value = Left(fileName.Path, slashNum - 1)
        Worksheets(FOLDERPATH).Cells(start_y, start_x + 2).Value = Format(fileName.Size / 1024, "0.#0") &amp; " バイト"
        Worksheets(FOLDERPATH).Cells(start_y, start_x + 3).Value = fileName.DateCreated
        Worksheets(FOLDERPATH).Cells(start_y, start_x + 4).Value = fileName.DateLastModified
        start_y = start_y + 1
    Next
    
    ' サブフォルダ一覧取得　再帰処理
    For Each folderName In folderList
        Call printFileList(folderName.Path, start_x, start_y)
    Next
    
End Sub</pre><p>
&nbsp;</p>
<h2>最後に</h2>
<p>いかがでしょうか？</p>
<p>もしつくるのめんどくせえとか実際に作ったのがそんなのか見てみたい！という人がいましたら下記ボタンからダウンロードできますので、ぜひ試してみてください。</p>
<div class="button frame block green"><a href="https://lemon818.com/wp/wp-content/uploads/2019/03/filelist.xlsm" class="midium">サブディレクトリを含むファイル一覧マクロをダウンロード</a></div>
<div></div>
<div></div>
<div><span></span></div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
