在 VBA 中分组对象
Grouping objects in VBA
我试图将两个对象分组到一个列表中,以便在一个 'for each' 循环中迭代。 VBA/VBscript 有可能吗?
例如,我想根据最后 mod 从特定位置删除所有文件 和 文件夹。日期,我不想创建两个循环。
Set oFolder = fso.GetFolder(FolderPath)
Set oFileList = oFolder.Files
Set oFolderList = oFolder.SubFolders
Set oFullList = oFileList + oFolderList (???)
For Each oFile In oFullList
lastModDate = oFile.DateLastModified
If (lastModDate < PurgeDate) Then
oFile.Delete True
End If
Next
单独使用 FileSystemObject
方法无法实现您的要求。即使您从 oFolder.Files
和 oFolder.SubFolders
的元素创建了一个数组或 ArrayList,您也需要两个单独的循环来完成。
您可以使用 Shell.Application
对象来枚举文件夹内容,但生成的对象没有删除方法,因此您仍然需要 FileSystemObject
对象和方法来删除 files/folders:
path = "C:\some\folder"
Set app = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each it In app.NameSpace(path).Items
If it.IsFolder Then
fso.GetFolder(it.Path).Delete
Else
fso.GetFile(it.Path).Delete
End If
Next
但是,与仅使用 FileSystemObject
方法和循环两次相比,我看不出这种方法有什么显着优势。如果您担心重复代码,只需将循环包装在一个过程中,然后为子文件夹和文件调用该过程。
path = "C:\some\folder"
Sub DeleteItems(list)
For Each it In list
it.Delete
Next
End Sub
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(path)
DeleteItems oFolder.Files
DeleteItems oFolder.SubFolders
我试图将两个对象分组到一个列表中,以便在一个 'for each' 循环中迭代。 VBA/VBscript 有可能吗?
例如,我想根据最后 mod 从特定位置删除所有文件 和 文件夹。日期,我不想创建两个循环。
Set oFolder = fso.GetFolder(FolderPath)
Set oFileList = oFolder.Files
Set oFolderList = oFolder.SubFolders
Set oFullList = oFileList + oFolderList (???)
For Each oFile In oFullList
lastModDate = oFile.DateLastModified
If (lastModDate < PurgeDate) Then
oFile.Delete True
End If
Next
单独使用 FileSystemObject
方法无法实现您的要求。即使您从 oFolder.Files
和 oFolder.SubFolders
的元素创建了一个数组或 ArrayList,您也需要两个单独的循环来完成。
您可以使用 Shell.Application
对象来枚举文件夹内容,但生成的对象没有删除方法,因此您仍然需要 FileSystemObject
对象和方法来删除 files/folders:
path = "C:\some\folder"
Set app = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each it In app.NameSpace(path).Items
If it.IsFolder Then
fso.GetFolder(it.Path).Delete
Else
fso.GetFile(it.Path).Delete
End If
Next
但是,与仅使用 FileSystemObject
方法和循环两次相比,我看不出这种方法有什么显着优势。如果您担心重复代码,只需将循环包装在一个过程中,然后为子文件夹和文件调用该过程。
path = "C:\some\folder"
Sub DeleteItems(list)
For Each it In list
it.Delete
Next
End Sub
Set fso = CreateObject("Scripting.FileSystemObject")
Set oFolder = fso.GetFolder(path)
DeleteItems oFolder.Files
DeleteItems oFolder.SubFolders