[[20150625092757]] 『フォルダ内のファイルの数をシートに表示する』(miho) ページの最後に飛ぶ

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

 

『フォルダ内のファイルの数をシートに表示する』(miho)

昨日は『選択しているセルをファイル名として開く』について
教えていただきありがとうございました。

昨日の続きみたくなってしまうのですが、
a,b,cの三つのフォルダ内にあるファイルの数を
セルc1、c2、c3に表示する方法にアドバイスしていただけないでしょうか?
以前に作ったマクロ(下記)ではナゼかファイル数が1こ多くなってしまいます。

Sub フォルダ内ファイル数()

    Dim FSO As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")

    Worksheets("Sheet2").Range("c1").Value _
    = FSO.GetFolder("\\サーバ名\Test\a\").Files.Count

    Worksheets("Sheet2").Range("c2").Value _
    = FSO.GetFolder("\\サーバ名\Test\b\").Files.Count

    Worksheets("Sheet2").Range("c3").Value _
    = FSO.GetFolder("\\サーバ名\Test\c\").Files.Count

End Sub

ネットで調べてみると見えないファイルをカウントしている・・・のようなのです。
それなので
1.拡張子が ".xls" だけをカウントする方法
2.拡張子".xls" と ".xlsx" をカウントできるようにしたいのですが・・・

お力を貸していただきますようお願いします。

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


別案。(/Sを付加すると、サブフォルダも数えられますよ〜)
    Sheets("Sheet2").Range("C1").Value = UBound(Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B ""\\サーバ名\Test\a\*.xls*""").StdOut().ReadAll(), vbNewLine))
(???) 2015/06/25(木) 10:09

 (???)さんから効率の良いDIRコマンドの例があがっていますが、ベーシックなDIR関数での一例です。

 Sub TestCount()
    Dim fPAth As String
    Dim fName As String
    Dim cntXls As Long
    Dim cntXlsx As Long

    fPAth = "\\サーバー名\Test\a\"

    fName = Dir(fPAth & "*.xls*")

    Do While fName <> ""
        Select Case StrReverse(UCase(Split(StrReverse(fName), ".")(0)))
            Case "XLS"
                cntXls = cntXls + 1
            Case "XLSX"
                cntXlsx = cntXlsx + 1
        End Select
        fName = Dir()
    Loop

    MsgBox "xlsブック:" & cntXls & vbLf & "xlsxブック:" & cntXlsx

 End Sub

(β) 2015/06/25(木) 10:36


 複数フォルダでしたね。

 もし、Testの下の階層が a,b,c だけで、かつその下にフォルダ階層がなければDIRコマンドの結果を
 配列に入れて処理したほうが効率もいいのですが、これもベーシックなDIR関数でやるなら。

 Function GetCount(fPath As String) As Variant
    Dim fName As String
    Dim w(1 To 2)

    fName = Dir(fPath & "*.xls*")

    Do While fName <> ""
        Select Case StrReverse(UCase(Split(StrReverse(fName), ".")(0)))
            Case "XLS"
                w(1) = w(1) + 1
            Case "XLSX"
                w(2) = w(2) + 1
        End Select
        fName = Dir()
    Loop

    GetCount = w

 End Function

 こんなファンクションプロシジャをつくっておいて、以下のようにして使います。
 戻り値が2つの要素を持った1次元配列で、xlsブックとxlsxブックの数を格納しています。

 Sub Test()
    Dim w As Variant

    w = GetCount("\\サーバ名\Test\a\")
    MsgBox w(1) & vbLf & w(2)
    w = GetCount("\\サーバ名\Test\b\")
    MsgBox w(1) & vbLf & w(2)
    w = GetCount("\\サーバ名\Test\c\")
    MsgBox w(1) & vbLf & w(2)

 End Sub

(β) 2015/06/25(木) 10:53


(???)さん 回答をいただきありがとうございます。

黒い画面が出てきて戸惑いましたが、セルにファイル数が表示されました。
だけど、ファイルが入っていないフォルダの検索結果が『-1』っと出てしまいます。
""\\サーバ名\Test\a\*.xls*"""の置き換えが悪かったのでしょうか?
(miho) 2015/06/25(木) 12:32


(β)さん 昨日はありがとうございました。
すごく助かりました。

昨日の続きなんですが、a,b,cの三つのフォルダ内にあるファイルの数を
sheet1のセルc1、c2、c3に表示したいんです。
(シートの一覧とファイルの数を合わせるため)

Testの下の階層は a,b,c だけではなく 他にもフォルダやファイルがあります。
a,b,cの下の階層にはファイルしかありません。
それからファンクションプロシジャ?初めて聞くような言葉でわかりません。
説明が下手で申し訳ありませんがよろしくおねがいします。
(miho) 2015/06/25(木) 12:39


黒い画面は、DOSプロンプト(コマンドプロンプト)です。これのDIR命令(VBAのDir関数とはちょっと違います)を利用しているのです。
隠すこともできるのですが、1行ですっきり実現する場合は見えちゃいますね。

ファイルが無いフォルダは指定しなければ良いだけと思いますが、現状の方法だと配列の個数を返すので、要素が無いと-1になりますね。
一旦、値を変数に入れてから、-1ならば0にするIf文と代入文で対応してください。
(???) 2015/06/25(木) 12:51


 >>それからファンクションプロシジャ?初めて聞くような言葉でわかりません。 

 アップした Test と GetCount を、そのまま標準モジュールにコピペし、Test を実行してみてください。
 W(1) で得られる値が xlsブックの数、w(2)で得られる値が xlsxブックの数です。

(β) 2015/06/25(木) 12:56


(???)さん ありがとうございました。
>値を変数に入れてから、-1ならば0にするIf文と代入文で対応してください。
頑張って調べてやってみます。
(miho) 2015/06/25(木) 13:10

(miho) 2015/06/25(木) 13:20


(β) なんども面倒を見ていただきありがとうございます。
上手くいったのですが、検索した結果がメッセージとして表示されて
ワークシートの指定したセルに残りません。
ワークシートに結果を残すにはWorksheets("Sheet2").Range("c1").Value
みたいなのをどこかに書くのでしょうか?
(miho) 2015/06/25(木) 13:24

 以下のように書くと、C列に xls、D列に xlsx の件数が転記されます。

 Sub Test()
    Dim w As Variant

    w = GetCount("\\サーバ名\Test\a\")
    Worksheets("Sheet2").Range("C1:D1").Value = w
    w = GetCount("\\サーバ名\Test\b\")
    Worksheets("Sheet2").Range("C2:D2").Value = w
    w = GetCount("\\サーバ名\Test\c\")
    Worksheets("Sheet2").Range("C3:D3").Value = w

 End Sub

(β) 2015/06/25(木) 15:41


(β)さん ありがとうございました。
思っていたことができました。
今回は xlsだけのファイル数がほしかったので
 Case "XLSX"
                w(2) = w(2) + 1
を消してRange("C1:D1")をRange("C1")してやってみました。
複数の拡張子の時もこれならバッチリできそうです♪

今回お答えをいただいてマクロの数式が少しだけわかってきたような・・・^^
ほんとにありがとうございました。
また機会があるようでしたらご指導いただきますよう
よろしくお願い申し上げます。

(miho) 2015/06/25(木) 17:05


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.