[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『エクセルファイルの容量』(file)
初めまして。
パソコン内の全てのエクセルファイルの容量と名前の書き出しの
一覧が出せるマクロ式ってあるのでしょうか。
よろしくお願いします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
パソコン内全ての階層ですか?
FileSystemObject等を使って再帰処理処理で全階層を見ていくことになると思いますが、 全階層となると階層の深度にもよりますが、スタック領域不足の問題が出てきそうな気 がします。 (カリーニン) 2016/08/16(火) 23:51
検索してみました。
https://www.excel.studio-kazu.jp/cgi-bin/estindex/estseek2.cgi?phrase=VBA+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%80%80%E4%B8%80%E8%A6%A7%E3%80%80%E9%9A%8E%E5%B1%A4&perpage=10&attr=&order=&clip=-1&navi=0
(カリーニン) 2016/08/16(火) 23:54
・サイズ出力
・拡張子の判定
の二つを追加しました。
D:ドライブを対象にしていますので、
必要なら、これに加えて、C:に変更したものも実行してみてください。
ただし、全てを対象にすることが適当かどうかは、
よく検討して下さい。
時間の無駄になることが考えられます。
(参考)
Option Explicit
Public cnt As Long, pop As Long
Sub test()
Dim FolderSpec As String
FolderSpec = FolderPath
cnt = 1
pop = 1
If FolderSpec <> "" Then
ListUp FolderSpec
End If
End Sub
Sub ListUp(FolderSpec)
Dim File_Collection As Object
Dim File_List As Variant
Dim Folder_Collection As Object
Dim Folder_List As Variant
Dim s As String
Set File_Collection = CreateObject("Scripting.FileSystemObject") _
.GetFolder(FolderSpec).Files
'Foldor の名前をセルに入力
Cells(cnt, pop) = FolderSpec
cnt = cnt + 1
For Each File_List In File_Collection
s = File_List.Name
If s Like "*.xls*" Then
Cells(cnt, pop + 1) = s
Cells(cnt, pop + 2) = File_List.Size
cnt = cnt + 1
End If
Next
Set Folder_Collection = CreateObject("Scripting.FileSystemObject") _
.GetFolder(FolderSpec).SubFolders
For Each Folder_List In Folder_Collection
pop = pop + 1
ListUp FolderSpec & "\" & Folder_List.Name
Next
pop = pop - 1
End Sub
Function FolderPath() As String
Dim Shell As Object
Set Shell = CreateObject("Shell.Application") _
.BrowseForFolder(0, "フォルダを選択してください", 0, "D:\")
If Shell Is Nothing Then
FolderPath = ""
Else
FolderPath = Shell.Items.Item.Path
End If
End Function
# 十分な検証をしていないので、思わぬ誤りがある可能性があります。
# また、追加の要望には対応しません。そちらで対応してください。
(γ) 2016/08/17(水) 00:41
>パソコン内の全てのエクセルファイルの容量と名前の書き出しの >一覧が出せるマクロ式ってあるのでしょうか
普通は、マクロ(VBAプログラム)は「ある」ものではなく作るものです。 しかし、この様な一般的によくある要件のものであれば既存の完成品ソフト がごろごろしています。
今回はそれらを検索して、利用するのがベストと思われます。
(とおりすがり) 2016/08/17(水) 08:54
Sub test()
Dim i As Long
Dim cFiles As Variant
Application.ScreenUpdating = False
cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S ""c:\*.xls*""").StdOut().ReadAll(), vbNewLine)
For i = 0 To UBound(cFiles) - 1
Cells(i + 1, "A").Value = Mid(cFiles(i), InStrRev(cFiles(i), "\") + 1)
Cells(i + 1, "B").Value = FileLen(cFiles(i))
Cells(i + 1, "C").Value = cFiles(i)
Next i
Application.ScreenUpdating = True
End Sub
(???) 2016/08/17(水) 09:27
(γ) 2016/08/17(水) 11:33
>>???さんが提示下さったのが、最速ではないでしょうか。
DIRコマンドは早いですよね。
手元に、いくつか、抽出方法を変えたテストコードがあり、LANDISK上のサブフォルダを階層も含めてたくさんもつフォルダを指定して 実行してみました。(最終的に抽出されるエクセルブックは300程度)
これぐらいのデータ数であれば、いずれも微々たる差異というか誤差のようなものですが、参考までに報告します。
1.???さんの方式 DIRコマンド(Exec) 0.449秒 2.DIRコマンド(RUN) に標準IOを組み合わせたもの 0.438秒 3.Shell Application 0.398秒 4.API(W)にDictionaryを組み合わせたもの 0.199秒
(β) 2016/08/17(水) 11:50
(γ) 2016/08/17(水) 12:24
ま、所詮はインタプリンタなExcelマクロですから、速度は重視せず、簡単に作れる、というところでよろしいかと。 もし高速化を考えるなら、DIRコマンド案でも、結果出力を配列利用して1回で済ませば、けっこういけるかも?
また、Cドライブ全てを探す場合、WINDOWSフォルダ下等、制限がかかったフォルダの存在が気になるところです。DIRコマンドは勝手に無視してくれるので、そういう点でもお手軽です。
(???) 2016/08/17(水) 14:09
FileLenにしろ、別のものにしろ、情報取得は、どの方式でも、同じ負荷になりますね。 報告したテスト結果は、いずれも、ファイル名抽出だけの部分での比較です。
・コメントしましたように、いずれも処理効率は秀逸で、コードという面からいえば
cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S ""c:\*.xls*""").StdOut().ReadAll(), vbNewLine)
この1行で取得可能ですので、???さんご提示のものが好きですね。
・API は γさんレスの通り FindFirstFileW を使ったもので試しました。
(β) 2016/08/17(水) 21:00
(γ)さんの 2016/08/17(水) 00:41 で行い解決いたしました。 遅くなりましたがありがとうございました。
改めてありがとうございました。 一つ謝らなければならない事があります。 一回ごとの質問でニックネームを入れ替えるのかと思い ニックネームを変更してしまいました。 言い訳がましいですが大変申し訳ございませんでした。 今後ともよろしくお願い致します。
追伸:今後は(日にち)で参加させて下さい。 申し訳ございませんでした。
(日にち) 2016/08/28(日) 10:21
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.