VBA:从对象集合中删除对象

时间:2015-03-20 10:35:44

标签: vba

我希望Access应用程序能够从某个文件夹中自动导入正确的文件。我这样做的想法是获取文件夹中的所有文件,然后继续从集合中删除错误的文件。最后,我开始导入。

问题是删除部分,VBA在此上下文中不知道remove方法。

以下是示例代码:

Dim objFS As Object
Dim objFolder As Object
Dim objFiles As Object
Dim objF1 As Object

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFS.GetFolder(strPath)
Set objFiles = objFolder.Files

' remove files with wrong YearMonth from collection
For Each objF1 In objFiles
    If Left(Right(objF1.Name, 8), 6) <> YearMonth Then
        ' the following line causes the error
        objFiles.Remove (objF1.Name) 
    End If
Next

没有选项可以简单地从objFiles中删除一个对象吗?

如果没有,我想我会填充另一个数组,存储我要删除的所有objF1,并将数组作为实际文件导入的exclude-filter。

编辑: 好像我必须使用阵列解决方案。谢谢你的帮助。

edit2:我去了一个字符串数组,存储了我不想导入的所有文件名。最终导入方法检查此列表中的名称。

3 个答案:

答案 0 :(得分:0)

GetFolder方法返回FileCollection的实例。根据{{​​3}},无法从此集合中删除对象。您可能希望将GetFolder视为唯一的信息方法。

因此,如果您想坚持使用删除已处理文件的方法,则必须预先复制到可变VBA.Collection并使用它。

答案 1 :(得分:0)

如果您使用此集合,则无法修改集合。 您可以在新列表中添加好文件。 例如:

List<int> listOfNumbers = new List<int>();

        for (int i = 0; i < 11; i++)
        {
            listOfNumbers.Add(i);
        }

        //The above collection includes 0-10 number but You need only even numbers

        //Your current option - not work because You can't modify collection used in foreach
        foreach (var item in listOfNumbers)
        {
            if (item % 2 == 1)
                listOfNumbers.Remove(item);
        }

        //Correct solution
        List<int> evenNumbers = new List<int>();
        foreach (var item in listOfNumbers)
        {
            if (item % 2 == 0)
                evenNumbers.Add(item);
        }

答案 2 :(得分:0)

ArrayList怎么样?

Sub SO()

strPath$ = "C:\Users\olearysa\desktop\"
MonthYear$ = "DateFi"

With CreateObject("System.Collections.ArrayList")

    fileName = Dir(strPath & "*.*", vbNormal)

    While Not fileName = vbNullString
        If Len(fileName) > 12 Then
            If Mid(fileName, InStrRev(fileName, ".") - 8, 6) = MonthYear Then .Add strPath & fileName
        End If
    fileName = Dir()
Wend

Debug.Print .count

For i = 0 To .count - 1
    '// Example
    Workbooks.Open .Item(i)
    '// more code here...
Next i

.Clear

End With

End Sub