VBA Range引用超64个非连续单元格触发错误1004问题咨询
问题描述
从其他工作簿向当前工作簿复制多个非相邻单元格时,经实测最多仅能成功操作64个单元格;只要新增1个待复制单元格,就会触发Error 1004: Method 'Range' of object '_Worksheet' failed(_Worksheet对象的Range方法调用失败)。
复现场景
- 实际业务代码中,自定义
data_range函数返回的逗号分隔单元格地址共包含67个单元格,运行始终触发上述错误,对应代码如下:
For Each cel In wsTarget.Range(data_range(wsSource.Range("rng_tbl_cell_ref_ttl_rows"), wsSource.Range("rng_tbl_cell_ref_st_row"), wsSource.Range("rng_CV_Col_No_A1"), wsSource.Range("rng_cell_ref_sheet")))
- 手动传入仅包含64个单元格的地址字符串调用Range方法时,代码可正常运行,测试代码如下:
For Each cel In wsTarget.Range("D10,D11,H25,L25,Q25,H26,L26,Q26,H24,L24,Q24,G27,H27,L27,Q27,G28,H28,L28,Q28,E31,N31,Q31,C36,G36,H40,H41,H42,H43,H44,H45,H46,Q40,Q41,Q42,H51,H52,H53,Q51,Q52,Q53,N54,Q54,Q55,Q56,H57,H58,B62,B63,B64,B65,B66,B67,B68,L62,L63,L64,L65,L66,L67,L68,Q62,Q63,Q64,Q65")
- 只要在上述地址字符串中新增Q66或任意其他单元格,就会再次触发1004错误。后续业务场景需要引用超过67个单元格,需明确错误产生原因及可行解决方案。
关联自定义函数代码
问题涉及的data_range自定义函数代码如下:
Function data_range(row_count As Integer, offset_row As Integer, col As Integer, w_sheet_name As String) As String Dim i As Integer Dim data_range_string As String data_range_string = "" If row_count > 1 Then data_range_string = ThisWorkbook.Worksheets(w_sheet_name).Cells(offset_row, col) For i = 1 To row_count - 1 data_range_string = data_range_string & "," & ThisWorkbook.Worksheets(w_sheet_name).Cells(offset_row + i, col) Next i ElseIf row_count = 1 Then data_range_string = ThisWorkbook.Worksheets(w_sheet_name).Cells(1 + offset_row, col) End If data_range = data_range_string End Function
错误原因
该问题是Excel VBA的固有设计限制:通过逗号分隔的地址字符串调用Range方法时,字符串中包含的非连续区域数量不能超过64个,超出阈值就会触发1004错误,和单元格内容、工作表权限、文件损坏等外部因素无关。
可行解决方案
放弃拼接长地址字符串传参的实现方式,改用Union方法逐块合并单元格区域,该方法无64个区域的数量限制,实现逻辑如下:
- 初始化目标Range对象为空
- 遍历所有需要引用的单元格/连续单元格块,逐次通过
Union方法将新区域合并到目标Range对象中 - 全部区域合并完成后,直接遍历该合并后的Range对象,即可执行后续复制、取值等操作
针对现有代码的优化方向:可将data_range函数的返回值类型从String改为Range,在函数内部直接通过Union拼接需要的单元格区域,从根源上避开字符串传参的数量限制。
内容的提问来源于stack exchange,提问作者taezar.tw
相关产品推荐
相关产品推荐

