[[20160816215127]] 『エクセルファイルの容量』(file) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エクセルファイルの容量』(file)

初めまして。
パソコン内の全てのエクセルファイルの容量と名前の書き出しの
一覧が出せるマクロ式ってあるのでしょうか。
よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 パソコン内全ての階層ですか?

 FileSystemObject等を使って再帰処理処理で全階層を見ていくことになると思いますが、
 全階層となると階層の深度にもよりますが、スタック領域不足の問題が出てきそうな気
 がします。
(カリーニン) 2016/08/16(火) 23:51

 検索してみました。

http://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


こんばんは。
 
試しに作ってみました。
http://www.k1simplify.com/vba/tipsleaf/leaf280.html
を参考にしました。

・サイズ出力
・拡張子の判定
の二つを追加しました。
 
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


ありがとうございます。
Cドライブに変更は"D:\"だけを"C:\"にすればよろしいのでしょうか。
(file) 2016/08/17(水) 07:24

 >パソコン内の全てのエクセルファイルの容量と名前の書き出しの 
 >一覧が出せるマクロ式ってあるのでしょうか

 普通は、マクロ(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

質問者さんのご質問への回答は、「そのとおり」です。
 
# 卓球の応援しながらコードを書いていました。
# 勝ってよかった・・・・。
 
皆さんのご意見、ご尤もです。
 
閲覧されるかたに向けて、いくつか参考になるところを挙げておきます。
 
(1)FSOの利用
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html
http://www.asahi-net.or.jp/~ef2o-inue/download/sub09_010.html
 
(2)DIRコマンドの利用
http://www.moug.net/tech/exvba/0060087.html
 
???さんが提示下さったのが、最速ではないでしょうか。
(γ) 2016/08/17(水) 11:19

ついでに言えば、
ドライブ全体にExcelブックが万遍なくあるなんていうことはないでしょうから、
特定のフォルダ(マイドキュメント)を対象にして、
Exploreの検索機能で、*.xls* などを検索するのが手頃ではないでしょうか。
検索結果をさらに、サイズ順や更新日順にソートしたりもできますしねえ。
当該ファイルをダブルクリックで開くこともできますし。
ご参考まで。

(γ) 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


最速は間違いでした。たしかに。
FSOよりはずっと早いです、と書くべきでした。
 
4. は FindFirstFileWなどを使うものですか。
参考にさせていただきます。

(γ) 2016/08/17(水) 12:24


私のコーディング中で、FileLenを使っている1行は遅いですよ。DIRコマンドではそこも管理情報から最速で拾ってくるのですが、フルパス表示指定してしまうと、他の情報は一切表示されなくなってしまうので、仕方なく…。

ま、所詮はインタプリンタな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.