VBA練習問題
VBA100本ノック 26本目:ファイル一覧作成

VBAを100本の練習問題で鍛えます
最終更新日:2020-11-21

VBA100本ノック 26本目:ファイル一覧作成


指定フォルダ内のファイル一覧を作成する問題です。
Excelファイルにはハイパーリンクを設定します。


ツイッター連動企画です。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。


出題

出題ツイートへのリンク

#VBA100本ノック 26本目
フォルダ選択のダイアログでフォルダを指定し、フォルダ内にあるファイルの一覧を「ファイル一覧」シートのA列に出力してください。
・ファイル名,更新日時,サイズ※画像参照
・Excelファイル(xls,xlsx,xlsm)にはハイパーリンクを設定
※サブフォルダは不要です。

マクロ VBA 100本ノック


頂いた回答

解説

フォルダ選択はApplication.FileDialogのmsoFileDialogFolderPickerを使います。
ファイルの一覧はDir関数またはFileSystemObjectで取得します。
ハイパーリンクはセルではなく、Worksheetに対して設定します。
まずは、Dir関数のサンプルから。

Sub VBA100_26_01()
  Dim ws As Worksheet
  Set ws = ThisWorkbook.Worksheets("ファイル一覧")
  
  Dim sPath As String
  With Application.FileDialog(msoFileDialogFolderPicker)
    .InitialFileName = ws.Parent.Path & "\"
    If Not .Show Then Exit Sub
    sPath = .SelectedItems(1) & "\"
  End With
  
  Application.ScreenUpdating = False
  ws.Cells.Hyperlinks.Delete
  ws.UsedRange.Offset(1).ClearContents
  
  Dim sFile As String, i As Long
  i = 2
  sFile = Dir(sPath)
  Do Until sFile = ""
    ws.Cells(i, 1).Value = sFile
    ws.Cells(i, 2).Value = FileDateTime(sPath & sFile)
    ws.Cells(i, 3).Value = FileLen(sPath & sFile)
    If InStrRev(sFile, ".") > 0 Then
      If Mid(sFile, InStrRev(sFile, ".")) Like ".xls*" Then
        ws.Hyperlinks.Add Anchor:=ws.Cells(i, 1), Address:=sPath & sFile
      End If
    End If
    i = i + 1
    sFile = Dir()
  Loop
  
  ws.UsedRange.EntireColumn.AutoFit
  Application.ScreenUpdating = True
End Sub


ハイパーリンクを削除するくらいなら、シート全体をClearしてしまったほうが簡単な場合もあると思います。
シート全体をClearする場合とFileSystemObjectのVBAは記事補足に掲載しました。


補足

ハイパーリンクの設定されたセルに対して、
ClearContents
または、
=""
これらでは、ハイパーリンクの書式が残ってしまいます。
ClearFormatsと組み合わせて使う方法も考えられます。

ハイパーリンクを消すには、
Hyperlinks.Delete
または、
Clear
を使うと簡単です。

以下は、FileSystemObjectの参考VBAになります。

Sub VBA100_26_02()
  Dim ws As Worksheet
  Set ws = Worksheets("ファイル一覧")
  
  Dim sPath As String
  With Application.FileDialog(msoFileDialogFolderPicker)
    .InitialFileName = ws.Parent.Path & "\"
    If Not .Show Then Exit Sub
    sPath = .SelectedItems(1)
  End With
  
  Application.ScreenUpdating = False
  With ws
    .Cells.Clear
    .Range("A1:C1") = Array("ファイル一覧", "更新日時", "サイズ")
    .Columns(2).NumberFormatLocal = "yyyy/mm/dd hh:mm"
    .Columns(3).NumberFormatLocal = "#,##0"
  End With
  
  Dim fso As New Scripting.FileSystemObject
  Dim objFile As File, sExt As String
  Dim i As Long
  i = 2
  For Each objFile In fso.GetFolder(sPath).Files
    ws.Cells(i, 1).Resize(, 3) = Array(objFile.Name, _
                      objFile.DateLastModified, _
                      objFile.Size)
    sExt = fso.GetExtensionName(objFile.Name)
    If sExt Like "xls*" And _
      Not objFile.Name Like "~$*" Then
      ws.Hyperlinks.Add Anchor:=ws.Cells(i, 1), Address:=objFile.Path
    End If
    i = i + 1
  Next
  Set fso = Nothing
  
  ws.Range("A1").CurrentRegion.EntireColumn.AutoFit
  Application.ScreenUpdating = True
End Sub

上記VBAでは、Excelファイルが開いている場合("~$*")はリンク設定しないようにしてみました。
一覧に出力しなくても良いかもしれませんが、"~$"ではじまるファイルが無い(と思うけど)とも限らないので一応出力だけはしておきました。

ハイパーリンクは、シートに設定できる数に上限があります。
Excel の仕様と制限
ワークシート内のハイパーリンク:65,530

今回のように1フォルダの場合は、さすがにこの制限にかかることは無いと思いますが、
サブフォルダまで含めて作成するような場合は、この制限にかかってしまう事もあり得ると思います。


Dir関数とFileSystemObjectについて
Dir関数には多くの制限があります。
Dir関数の制限について|VBA技術解説
Dir関数は、VBAでフォルダ・ファイルの存在確認や一覧取得において使われる関数ですが、いくつかの使用上の注意点、制限事項があります。3桁拡張子の指定時の問題 このように指定した場合、xlsxやxlsmも対象となります。3桁の拡張子を指定した場合は、4桁の拡張子も対象となります。
この制限を回避する必要がある場合はFileSystemObjectを使ってください。
ただし、処理速度はDir関数に比べてFileSystemObjectはかなり遅くなります。
とはいえ、1,000ファイルくらいまでなら気になるような遅さではありません。

#を含むファイルパスについて

サイト内関連ページ

第79回.ファイル操作Ⅰ(Dir)|VBA入門
VBAでは、フォルダのファイル一覧を取得したりファイルの存在確認をする事が出来ます、Dir関数は、指定したパターン(ワイルドカード)やファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。引数に指定したファイルが存在すると、そのファイル名を返し存在しないと空欄を返します。
第95回.ハイパーリンク(Hyperlink)|VBA入門
VBAでハイパーリンク(Hyperlink)を追加したり削除したりする場合を解説します。ハイパーリンクは、Hyperlinkオブジェクトです、そして、Hyperlinkオブジェクトの集まりであるコレクションが、Hyperlinksコレクションになります。
第119回.ファイルシステムオブジェクト(FileSystemObject)|VBA入門
FileSystemObjectオブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし機能が大変多いため、これらを全て覚えるという事は困難です。
第21回.ファイル一覧を取得する(Do~LoopとDir関数)|VBA再入門
マクロVBAで他のブック(ファイル)を扱う時、まず問題となるのがファイル名です。ファイル数が常に同じでファイル名も変化しなければ良いのですが… ファイル数もファイル名も決まっていない場合は、まずはファイルの一覧を取得する必要があります。ファイル名を取得するには、Dir関数を使います。
エクセルでファイル一覧を作成|VBAサンプル集
VBAでサブフォルダ以下も含めて全てのファイル一覧を取得します。最初はサブフォルダは無視して、VBAにある関数とステートメントだけで作成します、その後に、FileSystemObjectで再帰処理をすることで、全てのサブフォルダも取得するようにしていきます。
DIR関数で全サブフォルダの全ファイルを取得|VBAサンプル集
指定フォルダ以下の全サブフォルダ内の全ファイルを取得する場合、通常はFileSystemObjectの再帰モジュールで実現しますが、これをDir関数だけで、かつ、再帰ではなく二重ループで実現しています。FileSystemObjectの再帰プロシージャーについては、エクセルでファイル一覧を作成 こちらをご覧ください。




同じテーマ「Python入門」の記事

VBA100本ノック 23本目:シート構成の一致確認
VBA100本ノック 24本目:全角英数のみ半角
VBA100本ノック 25本目:マトリック表をDB形式に変換
VBA100本ノック 26本目:ファイル一覧作成
VBA100本ノック 27本目:ハイパーリンクのURL
VBA100本ノック 28本目:シートをブックに分割
VBA100本ノック 29本目:画像の挿入
VBA100本ノック 30本目:名札作成(段組み)
VBA100本ノック 31本目:入力規則
VBA100本ノック 32本目:Excel終了とテキストファイル出力
VBA100本ノック 33本目:マクロ記録の改修


新着記事NEW ・・・新着記事一覧を見る

VBA100本ノック 34本目:配列の左右回転|VBA練習問題(11月28日)
VBA100本ノック 33本目:マクロ記録の改修|VBA練習問題(11月26日)
VBA100本ノック 32本目:Excel終了とテキストファイル出力|VBA練習問題(11月25日)
VBA100本ノック 31本目:入力規則|VBA練習問題(11月24日)
将棋とプログラミングについて~そこには型がある~|エクセル雑感(11月22日)
VBA100本ノック 30本目:名札作成(段組み)|VBA練習問題(11月22日)
VBA100本ノック 29本目:画像の挿入|VBA練習問題(11月21日)
VBA100本ノック 28本目:シートをブックに分割|VBA練習問題(11月19日)
VBA100本ノック 27本目:ハイパーリンクのURL|VBA練習問題(11月18日)
VBA100本ノック 26本目:ファイル一覧作成|VBA練習問題(11月17日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.マクロって何?VBAって何?|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ