VBA100本ノック 26本目:ファイル一覧作成
指定フォルダ内のファイル一覧を作成する問題です。
Excelファイルにはハイパーリンクを設定します。
ツイートでの見やすさを考慮して、ブック・シート指定等を適宜省略しています。
出題
フォルダ選択のダイアログでフォルダを指定し、フォルダ内にあるファイルの一覧を「ファイル一覧」シートのA列に出力してください。
・ファイル名,更新日時,サイズ※画像参照
・Excelファイル(xls,xlsx,xlsm)にはハイパーリンクを設定
※サブフォルダは不要です。
VBA作成タイム
この下に頂いた回答へのリンクと解説を掲載しています。
途中まででも良いので、できるだけ自分でVBAを書いてみましょう。
他の人の回答および解説を見て、書いたVBAを見直してみましょう。
頂いた回答
解説
ファイルの一覧は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する場合とFileSystemObjectのVBAは記事補足に掲載しました。
補足
ClearContents
または、
=""
これらでは、ハイパーリンクの書式が残ってしまいます。
ClearFormatsと組み合わせて使う方法も考えられます。
Hyperlinks.Delete
または、
Clear
を使うと簡単です。
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ファイルが開いている場合("~$*")はリンク設定しないようにしてみました。
一覧に出力しなくても良いかもしれませんが、"~$"ではじまるファイルが無い(と思うけど)とも限らないので一応出力だけはしておきました。
ワークシート内のハイパーリンク:65,530
サブフォルダまで含めて作成するような場合は、この制限にかかってしまう事もあり得ると思います。
ただし、処理速度はDir関数に比べてFileSystemObjectはかなり遅くなります。
とはいえ、1,000ファイルくらいまでなら気になるような遅さではありません。
サイト内関連ページ
同じテーマ「VBA100本ノック」の記事
23本目:シート構成の一致確認
24本目:全角英数のみ半角
25本目:マトリックス表をDB形式に変換
26本目:ファイル一覧作成
27本目:ハイパーリンクのURL
28本目:シートをブックに分割
29本目:画像の挿入
30本目:名札作成(段組み)
31本目:入力規則
32本目:Excel終了とテキストファイル出力
33本目:マクロ記録の改修
新着記事NEW ・・・新着記事一覧を見る
TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.メッセージボックス(MsgBox関数)|VBA入門
9.条件分岐(Select Case)|VBA入門
10.ブック・シートの選択(Select,Activate)|VBA入門
- ホーム
- マクロVBA入門編
- VBA100本ノック
- 26本目:ファイル一覧作成
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。