[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フォルダのサイズを取得する』(田吾作)
下記のコードのようなマクロでフォルダの名前等の情報を取得し配列に格納しています。
フォルダのサイズが大きい場合はエラーになってしまうようです。 "C:\Windows\System32"は3.15GB程度ですが、マクロを実行したら ary(3, 0) = objfol.Size の箇所で
実行時エラー '70': 書き込みできません。
というエラーになってしまいます。
ary(3, 0) = (objfol.Size / 1024) / 1024 と変えても同じエラーになります。 フォルダサイズが大きくてもフォルダサイズを取得するにはそのように書き換えたらいいでしょうか? ご指導お願いいたします。
Sub test() Dim ary() As Variant Dim fol As String Dim FSO As Object Dim objfol As Object Set FSO = CreateObject("Scripting.FileSystemObject") fol = "C:\Windows\System32" Set objfol = FSO.getfolder(fol) ReDim ary(3, 0) ary(0, 0) = objfol.Name ary(1, 0) = objfol.datecreated ary(2, 0) = objfol.datelastmodified ary(3, 0) = objfol.Size ActiveCell.Resize(4, 1).Value = ary Erase ary Set objfol = Nothing Set FSO = Nothing End Sub
< 使用 Excel:Excel2007、使用 OS:Windows Vista >
これは EXCEL の問題ではなく、FSO の問題です。 フォルダに限らず 2GB を超えるサイズは取得できないようです。 (Mook) 2014/04/26(土) 21:47
Mookさん、ご回答ありがとうございます。 承知いたしました。 ありがとうございました。 (田吾作) 2014/04/26(土) 22:53
以下は私の独り言です。
フォルダサイズを直接取得するのではなく、再帰処理でファイルサイズを取得していって合計する、という 方法でやってみました。
"C:\Windows\System32"は中にアクセスできないフォルダがあり、そのフォルダのところでエラーになりました。 そこで、他のフォルダに変えて実行したところ、今度はファイルパスの文字数が多いとやはりエラーになりました。
今のところ、"C:\Windows\System32"は処理対象から外したので当初のFileSystemObjectでフォルダのサイズを直接 取得する方法で問題ありません。今後問題が出てきたときには再考することにします。
Dim FSO As Object Dim mysize As Long
Sub test() Dim ary() As Variant Dim fol As String Dim objfol As Object Set FSO = CreateObject("Scripting.FileSystemObject") fol = "G:\test" Set objfol = FSO.getfolder(fol) ReDim ary(3, 0) ary(0, 0) = objfol.Name ary(1, 0) = objfol.datecreated ary(2, 0) = objfol.datelastmodified mysize = 0 Call folsizeget(objfol) 'Call folsizegetB(objfol) ary(3, 0) = mysize ActiveCell.Resize(4, 1).Value = ary Erase ary Set objfol = Nothing Set FSO = Nothing End Sub
Function folsizeget(ByVal objfol As Object) Dim objfile As Object Dim objsubfol As Object If objfol.Files.Count <> 0 Then For Each objfile In objfol.Files mysize = mysize + FileLen(objfile.Path) Next objfile End If If objfol.subfolders.Count <> 0 Then For Each objsubfol In objfol.subfolders Call folsizeget(objsubfol) Next objsubfol End If End Function
Function folsizegetB(ByVal objfol As Object) Dim myfile As Variant Dim filepath As Variant Dim objsubfol As Object If objfol.Files.Count <> 0 Then myfile = Dir(objfol.Path & "\*.*") Do While myfile <> "" filepath = objfol.Path & "\" & myfile mysize = mysize + FileLen(filepath) myfile = Dir() Loop End If If objfol.subfolders.Count <> 0 Then For Each objsubfol In objfol.subfolders Call folsizegetB(objsubfol) Next objsubfol End If End Function (田吾作) 2014/04/28(月) 00:54
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.