VBA直接从文件夹读取文件(不使用对话框)时出现‘Object Variable or With Block not Set’错误的原因排查求助
问题拆解与修复方案
嘿,我帮你理清楚为啥直接读文件夹会报错,而用文件对话框就正常——核心是两个关键错误:
1. Dir返回的是文件名,不是完整路径
你用Dir(MyFolder & "\FinalPrice*.xlsm")拿到的只是纯文件名(比如FinalPrice_Sep.xlsm),但Workbooks.Open()需要完整的文件路径才能精准找到文件。如果Excel当前的默认保存路径不是你指定的MyFolder,它就会在错误的地方找文件:要么找不到直接弹出错误,要么找到其他地方的同名文件,而那个文件里根本没有Adekwatnosc工作表,最终触发你看到的调试报错。
反观文件对话框的selectFilePK函数,它返回的是完整的文件路径(比如C:\Users\V1410191\Documents\FinalSeptember\FinalPrice_Sep.xlsm),所以Workbooks.Open()能准确找到目标文件,自然不会出问题。
2. 循环逻辑搞反了,跳过第一个文件还可能处理空值
你的循环顺序有bug:
- 第一步
MyFile = Dir(...)已经拿到了第一个文件的名字 - 但进入循环后第一行就执行
MyFile = Dir,直接跳到下一个文件(如果没有下一个,MyFile就变成空字符串) - 然后你尝试打开这个
MyFile——这会导致第一个文件完全被跳过,如果文件夹里只有一个文件,MyFile会变成空,Workbooks.Open("")直接报错。
修正后的完整代码
ThisMonth = Format(Date, "mmmm") MyFolder = "C:\Users\V1410191\Documents\Final" & ThisMonth MyFile = Dir(MyFolder & "\FinalPrice*.xlsm") Do Until MyFile = "" ' 关键:拼接完整文件路径 Dim fullFilePath As String fullFilePath = MyFolder & "\" & MyFile ' 打开文件,关闭链接更新提示 Set data_wb = Workbooks.Open(fullFilePath, UpdateLinks:=0) ' 尽量别用Select,直接操作对象更稳定(替换成你的实际操作) data_wb.Sheets("Adekwatnosc").Rows("1:1").Copy ' 关闭文件,不保存修改(避免误改源文件) data_wb.Close SaveChanges:=False ' 最后再获取下一个文件 MyFile = Dir Loop
额外优化小技巧
- 别用
Select/Activate:VBA里直接操作单元格/工作表对象比先选中再操作更稳定,也不会打乱用户的操作界面。 - 加个错误判断:防止遇到没有
Adekwatnosc工作表的文件,比如:On Error Resume Next Dim targetSheet As Worksheet Set targetSheet = data_wb.Sheets("Adekwatnosc") On Error GoTo 0 If Not targetSheet Is Nothing Then targetSheet.Rows("1:1").Copy ' 你的操作 Else MsgBox "文件 " & fullFilePath & " 里找不到Adekwatnosc工作表哦!" End If - 关闭屏幕更新:如果文件多,加上
Application.ScreenUpdating = False开头,Application.ScreenUpdating = True结尾,能让代码跑更快。
内容的提问来源于stack exchange,提问作者Przemek Dabek
相关产品推荐
相关产品推荐

