[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォルダ内のファイルの数をシートに表示する』(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 >
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
ファイルが無いフォルダは指定しなければ良いだけと思いますが、現状の方法だと配列の個数を返すので、要素が無いと-1になりますね。
一旦、値を変数に入れてから、-1ならば0にするIf文と代入文で対応してください。
(???) 2015/06/25(木) 12:51
>>それからファンクションプロシジャ?初めて聞くような言葉でわかりません。
アップした Test と GetCount を、そのまま標準モジュールにコピペし、Test を実行してみてください。 W(1) で得られる値が xlsブックの数、w(2)で得られる値が xlsxブックの数です。
(β) 2015/06/25(木) 12:56
(miho) 2015/06/25(木) 13:20
以下のように書くと、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
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.