如何解决Excel VBA运行时错误‘1004’:_Worksheet对象的Range方法执行失败
错误原因
- 变量未初始化:代码中的
firstTickerRow既没有声明也没有赋值,当该变量为空值、0或小于1的数值时,拼接出的单元格地址会出现A0这类不存在的非法行号(Excel行号从1开始计数),非法的Range地址会直接触发1004报错,尤其代码中还有firstTickerRow - 1的逻辑,如果firstTickerRow为1,减1后还是会得到0值,同样会生成非法地址。 - 事件递归调用:当前代码写在
Worksheet_Change事件中,修改单元格填充、边框的操作会再次触发当前工作表的Change事件,无限递归调用也会引发1004报错甚至程序卡死。 - 未显式指定工作表:虽然代码写在对应工作表的模块下,隐式调用Range在上下文切换时可能指向活动工作表而非当前代码所属工作表,也有概率触发该报错。
修复方案
首先给firstTickerRow赋予你实际需要的起始行号,其次在事件开头关闭事件触发避免递归,所有Range调用前加Me显式指代当前代码所属工作表,同时增加错误捕获保证异常场景下也能恢复事件触发。
修复后的代码如下:
Private Sub Worksheet_Change(ByVal Target As Range) ' 关闭事件触发,避免修改单元格时递归调用本事件 Application.EnableEvents = False ' 错误捕获,保证出错时也能重新打开事件触发 On Error GoTo ErrHandler ' 此处修改为你实际需要的起始行号,不能小于1 Const firstTickerRow As Long = 2 Dim lastRowColA As Long With Me.Range("A" & firstTickerRow & ":A" & Me.Rows.Count).Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With With Me.Range("A" & firstTickerRow - 1 & ":A" & Me.Rows.Count) .Borders(xlEdgeRight).LineStyle = xlNone .Borders(xlInsideHorizontal).LineStyle = xlNone End With lastRowColA = Me.Cells(Me.Rows.Count, "a").End(xlUp).Row With Me.Range("A" & firstTickerRow - 1 & ":A" & lastRowColA) .Borders(xlEdgeRight).LineStyle = xlContinuous .Borders(xlEdgeRight).Weight = xlMedium .Borders(xlEdgeBottom).LineStyle = xlContinuous .Borders(xlEdgeBottom).Weight = xlMedium End With With Me.Range("A" & firstTickerRow & ":A" & lastRowColA).Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorAccent1 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With ErrHandler: ' 无论代码是否报错都重新打开事件触发,避免后续Excel事件失效 Application.EnableEvents = True If Err.Number <> 0 Then MsgBox "错误:" & Err.Description, vbCritical End If End Sub
内容的提问来源于stack exchange,提问作者Zeeshan Hafeez
相关产品推荐
相关产品推荐

