You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

打开Excel工作簿时反复弹出Run Time Error 1004,求修复

修复Run Time Error 1004的方案

常见原因及对应修复

1. 确认工作表存在且名称完全匹配

检查工作簿中是否存在名为SAQ Profile的工作表,注意名称的大小写、空格、特殊字符必须和代码里的完全一致(比如不能是Saq Profile或SAQ_Profile)。若名称不匹配,要么修改代码里的工作表名称,要么重命名工作表。

2. 避免无限循环导致行号超出Excel限制

当前循环依赖于找到单元格值为finished才会终止,如果SAQ Profile的B列从第20行开始一直没有这个值,StartRow会持续递增,直到超过Excel最大行号(2007及以后版本为1048576行),此时创建Range就会触发1004错误。
修复方法:给循环添加最大行限制:

While IsQuestion.Value <> "finished" And StartRow <= 1048576
    ' 原循环内代码
    StartRow = StartRow + 1
    If StartRow > 1048576 Then Exit While ' 提前退出避免报错
    Set IsQuestion = Range("'SAQ Profile'!$B$" & StartRow)
Wend

3. 改用更可靠的工作表引用方式

直接在Range中写工作表名称容易因环境问题出错,建议先获取工作表对象再引用单元格,修改后的完整代码如下:

Private Sub Workbook_Open()
    Dim saqSheet As Worksheet
    ' 先获取工作表对象,提前排查不存在的情况
    On Error Resume Next
    Set saqSheet = ThisWorkbook.Worksheets("SAQ Profile")
    On Error GoTo 0
    
    If saqSheet Is Nothing Then
        MsgBox "找不到工作表'SAQ Profile',请检查工作表名称"
        GoTo Exitsub
    End If
    
    Dim StartRow As Long ' 改用Long避免行号超出Integer的32767上限
    StartRow = 20
    Dim IsQuestion As Range
    Set IsQuestion = saqSheet.Range("$B$" & StartRow)
    
    While IsQuestion.Value <> "finished" And StartRow <= 1048576
        If IsQuestion.Value = True Then
            Dim QuestionId As Range
            Set QuestionId = saqSheet.Range("G" & StartRow)
            If QuestionId.Value <> "" Then
                Call CreateSingleSelect(QuestionId, StartRow)
            End If
        End If
        StartRow = StartRow + 1
        If StartRow > 1048576 Then Exit While
        Set IsQuestion = saqSheet.Range("$B$" & StartRow)
    Wend
    
    ' 去掉不必要的Select操作,或指定具体工作表
    ' ThisWorkbook.Worksheets("目标表名").Range("C7").Select
    
Exitsub:
    Application.EnableEvents = True
    Dim wSheetName As Worksheet
    For Each wSheetName In ThisWorkbook.Worksheets
        wSheetName.Protect UserInterfaceOnly:=True
    Next wSheetName
End Sub

4. 处理工作表保护状态

如果SAQ Profile打开时已处于保护状态(且未设置UserInterfaceOnly:=True),代码无法访问单元格会触发错误。可在代码开头临时解除保护,处理完成后再重新保护:

' 获取saqSheet后添加
saqSheet.Unprotect Password:="你的密码" ' 无密码则去掉Password参数

' 在Exitsub标签前添加
saqSheet.Protect UserInterfaceOnly:=True, Password:="你的密码"

额外优化建议

  • 尽量避免使用Select操作,VBA中直接操作对象比选择单元格更高效且不易出错;
  • StartRow改用Long类型,避免因行号超过Integer的32767上限导致溢出错误。

内容的提问来源于stack exchange,提问作者Nicanor Ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:34:53