VBA函数ASFolder触发Run-Time '91'错误:文件换文件夹后异常求助
解决VBA运行时错误'91':Object variable or With block variable not set
这个问题我碰到过好多次,核心原因其实是你误用了ActiveWorkbook,它在文件首次打开的特定场景下可能还没被Excel正确初始化,导致访问它的属性时触发错误。
为什么换文件夹后才出现?这和你提到的“文件打开时触发的代码”直接相关——当把文件移到新位置首次打开时,Workbook_Open事件的触发时机可能早于Excel完成ActiveWorkbook对象的绑定,这时候ActiveWorkbook其实是Nothing(未设置的对象),自然就会抛出错误91。之前没报错大概率是巧合,比如旧文件夹下打开时ActiveWorkbook刚好已经完成初始化了。
最简单的修复方案
你已经定义了ASwb = ThisWorkbook(这是当前VBA代码所在的工作簿,绝对安全有效),完全没必要再依赖ActiveWorkbook。直接把出错的那一行替换成ASwb.Path即可:
Public Function ASFolder() As String Dim ASwb As Workbook: Set ASwb = ThisWorkbook If ASwb.Sheets(1).Range("B8").Value = "A" Then ' 替换ActiveWorkbook为已定义的ASwb,彻底避免对象未初始化问题 ASFolder = ASwb.Path & "\" Else ASFolder = ASwb.Sheets(1).Range("B8").Value & "\" End If End Function
额外的健壮性优化
为了避免其他潜在问题(比如工作簿从未保存过,Path会是空字符串;或者B8单元格的自定义路径不存在),可以给函数加一些有效性检查:
Public Function ASFolder() As String Dim ASwb As Workbook: Set ASwb = ThisWorkbook Dim targetPath As String If ASwb.Sheets(1).Range("B8").Value = "A" Then ' 检查工作簿是否已保存(未保存的话Path为空) If ASwb.Path <> "" Then targetPath = ASwb.Path & "\" Else MsgBox "请先保存工作簿以确定默认路径!", vbExclamation targetPath = "" End If Else targetPath = ASwb.Sheets(1).Range("B8").Value ' 检查自定义路径是否存在 If Dir(targetPath, vbDirectory) <> "" Then targetPath = targetPath & "\" Else MsgBox "B8单元格指定的路径不存在,请检查!", vbExclamation targetPath = "" End If End If ASFolder = targetPath End Function
关于文件打开触发代码的注意事项
你的Workbook_Open事件代码如果直接调用了ASFolder,现在用ThisWorkbook就完全没问题了——因为ThisWorkbook在代码运行时必然指向当前工作簿,不受工作簿激活状态的影响,再也不用怕换文件夹后首次打开的初始化顺序问题。
内容的提问来源于stack exchange,提问作者Bloodrazor
相关产品推荐
相关产品推荐

