我希望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:我去了一个字符串数组,存储了我不想导入的所有文件名。最终导入方法检查此列表中的名称。
答案 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