触发Worksheet_Change时出现无效过程调用或参数错误求助
问题分析与解决步骤
你的问题根源在于两个环节:Worksheet_Change事件的递归触发干扰,以及getProdsWb函数中工作簿引用失败。
1. 先修复Worksheet_Change的递归问题
你在事件过程里修改Cells(1,23)的内容,会再次触发Worksheet_Change事件,形成递归调用,这会打乱代码执行逻辑,甚至间接引发getProdsWb的调用异常。修改事件代码,加上事件禁用和错误处理:
Private Sub worksheet_change(ByVal Target As Range) Application.EnableEvents = False On Error GoTo Cleanup ' 确保无论是否出错,事件都能恢复 If Target.Address <> "$W$1" Then Cells(1, 23).Value2 = True End If Cleanup: Application.EnableEvents = True End Sub
2. 排查并修复getProdsWb函数的问题
编译报错指向这个函数,说明Workbooks(prodsWBName)这行找不到对应工作簿,触发“无效过程调用或参数”错误。大概率是openWBInCurrentDirectoryOrInFoldersInsideIt没成功打开文件,或者文件本身不存在、被锁定。
修改函数,增加工作簿存在性检查和错误捕获:
Public Function getProdsWb() As Workbook Dim prodsWBName As String Dim targetWB As Workbook prodsWBName = "Produtos e suas data de adição.xlsx" ' 先检查工作簿是否已经打开 On Error Resume Next Set targetWB = Workbooks(prodsWBName) On Error GoTo 0 If targetWB Is Nothing Then ' 尝试打开文件,捕获打开失败的错误 On Error GoTo OpenError openWBInCurrentDirectoryOrInFoldersInsideIt prodsWBName Set targetWB = Workbooks(prodsWBName) End If Set getProdsWb = targetWB Exit Function OpenError: ' 可选:弹出提示告知用户打开失败 ' MsgBox "无法打开目标文件:" & prodsWBName & vbCrLf & Err.Description Set getProdsWb = Nothing End Function
3. 额外排查点
- 确认
Produtos e suas data de adição.xlsx文件名完全匹配,包括特殊字符(比如“ç”)和后缀名,检查文件是否被移动、删除,或者被其他程序锁定。 - 检查
openWBInCurrentDirectoryOrInFoldersInsideIt过程的逻辑,看是否在搜索子文件夹时遗漏了正确路径,或者打开文件的代码未处理文件不存在的情况。 - 检查Excel信任中心设置,是否阻止了打开外部文件,或者文件所在文件夹没有读写权限。
内容的提问来源于stack exchange,提问作者Vinicius Leite
相关产品推荐
相关产品推荐

