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
相关产品推荐
相关产品推荐

