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

VBA动态数组赋值时触发Run-time error 1004错误求助

解决VBA中Run-time Error 1004(应用程序定义或对象定义错误)的问题

嘿,我一眼就瞅出你代码里的问题啦!咱们来一步步拆解:

错误根源

你循环里的i从0开始,但Excel单元格的行号是从1开始计数的!当i=0时,Sheet1.Cells(i, 1)就相当于调用第0行第1列的单元格——这在Excel里根本不存在,自然就触发1004错误了。

修正方案

有两种简单的调整方式,选哪种都能解决问题:

方式一:调整数组索引与单元格行号对应

让数组从1开始索引(和Excel行号对齐),修改ReDim和循环的范围:

Dim f() As String
Private Sub CommandButton1_Click()
    Dim Finalrow As Long, i As Long
    Finalrow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row
    ' 让数组从1开始索引,和Excel行号匹配
    ReDim Preserve f(1 To Finalrow)
    For i = 1 To Finalrow
        f(i) = Sheet1.Cells(i, 1).Value ' 建议加上.Value明确读取单元格值
    Next i
    
    ' 把数组内容写入E列的部分也对应调整
    For i = 1 To Finalrow
        Sheet1.Cells(i, 5).Value = f(i)
    Next i
End Sub

方式二:保持数组0索引,调整单元格行号

如果你想保留数组从0开始的索引,那读取单元格时把行号改成i+1就行:

Dim f() As String
Private Sub CommandButton1_Click()
    Dim Finalrow As Long, i As Long
    Finalrow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row
    ReDim Preserve f(Finalrow - 1)
    For i = 0 To Finalrow - 1
        ' 行号用i+1,对应Excel的第1到Finalrow行
        f(i) = Sheet1.Cells(i + 1, 1).Value
    Next i
    
    ' 写入E列时同样对应调整
    For i = 0 To Finalrow - 1
        Sheet1.Cells(i + 1, 5).Value = f(i)
    Next i
End Sub

额外小贴士

  • 建议每次引用单元格时都明确指定工作表(比如Sheet1.),避免当前激活的工作表不是目标表时出错
  • 如果数据量较大,推荐一次性读取整列数据到数组,效率会比循环逐行读高很多,示例代码:
    Dim f As Variant
    Private Sub CommandButton1_Click()
        Dim Finalrow As Long
        Finalrow = Sheet1.Cells(Sheet1.Rows.Count, 1).End(xlUp).Row
        ' 一次性读取A1到AFinalrow的所有数据到数组
        f = Sheet1.Range("A1:A" & Finalrow).Value
        ' 一次性写入E列
        Sheet1.Range("E1:E" & Finalrow).Value = f
    End Sub
    
    这种方法不需要手动循环,代码更简洁,运行也更快~

内容的提问来源于stack exchange,提问作者Vasant Kumbhojkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:43:28