Excel VBA遍历两个文件夹文件时循环报错:无法找到文件
Excel VBA循环中Dir函数导致“找不到文件”的问题解决
你遇到的这个循环报错问题,根源在于VBA的Dir函数是全局状态的——它会记住你上一次调用时的遍历上下文,一旦中途切换了遍历目录,之前的遍历状态就会被完全覆盖。
具体来说,你先执行dataFile = Dir(dataFolder & "*.xls*")开始遍历dataFolder里的文件,紧接着又调用previousFile = Dir(previousFolder & "*.xls*"),这一步直接把Dir的当前遍历目标改成了previousFolder。当第一次循环结束后,你执行dataFile = Dir时,它并不会去获取dataFolder的下一个文件,而是去拿previousFolder的下一个文件,再和dataFolder拼接后自然就找不到对应文件了,所以触发报错。
解决方案:先收集所有文件名到数组,再遍历数组
最稳妥的方法是先把两个文件夹里的目标文件名分别存入数组,这样就不会互相干扰Dir的遍历状态,代码逻辑也更清晰:
Sub ProcessFiles() Dim dataFolder As String, previousFolder As String Dim dataFiles() As String, previousFiles() As String Dim i As Integer ' 设置文件夹路径 dataFolder = "C:\Location\" previousFolder = "C:\Other Location\" ' 收集dataFolder下的所有Excel文件名到数组 ReDim dataFiles(0) dataFiles(0) = Dir(dataFolder & "*.xls*") Do While dataFiles(UBound(dataFiles)) <> "" ReDim Preserve dataFiles(UBound(dataFiles) + 1) dataFiles(UBound(dataFiles)) = Dir Loop ' 移除最后一个空元素 If UBound(dataFiles) > 0 Then ReDim Preserve dataFiles(UBound(dataFiles) - 1) ' 收集previousFolder下的所有Excel文件名到数组 ReDim previousFiles(0) previousFiles(0) = Dir(previousFolder & "*.xls*") Do While previousFiles(UBound(previousFiles)) <> "" ReDim Preserve previousFiles(UBound(previousFiles) + 1) previousFiles(UBound(previousFiles)) = Dir Loop If UBound(previousFiles) > 0 Then ReDim Preserve previousFiles(UBound(previousFiles) - 1) ' 遍历dataFiles数组处理每个文件 For i = LBound(dataFiles) To UBound(dataFiles) If dataFiles(i) <> "" Then Set dataWB = Workbooks.Open(dataFolder & dataFiles(i)) ' 这里放入你的数据处理逻辑,比如从previousFiles中匹配对应文件获取数据 ' 注意:如果两个文件夹的文件是一一对应(比如文件名相同),可以直接用dataFiles(i)去查找 ' Set previousWB = Workbooks.Open(previousFolder & dataFiles(i)) ' 保存文件时建议加上自定义文件名,避免覆盖 ActiveWorkbook.SaveAs "C:\Save Location\Processed_" & dataFiles(i) dataWB.Close SaveChanges:=True End If Next i End Sub
额外提醒
你的原代码里ActiveWorkbook.SaveAs ("C:\Save Location\")没有指定具体文件名,这会导致每次循环都覆盖同一个文件,一定要加上区分性的文件名(比如原文件名前缀),避免数据丢失。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

