VBA将数组输出至.Cells声明的区域时出现应用程序/对象定义错误
错误诱因
- 核心问题是单元格对象父引用不统一:你代码里
.Cells前的点号,必须配合With块指定父对象才能正常工作,当前写法没有把Range和Cells同时绑定到Worksheets("Log")对象:- 如果代码外层没有写
With Worksheets("Log")结构,.Cells根本没有合法的父对象,调用直接失败 - 如果外层
With块指向的是其他工作表,.Cells就归属于其他工作表,用其他工作表的单元格实例来构造Log工作表的Range属于跨表非法调用,VBA会直接抛出错误 - 就算你去掉Cells前面的点号,没有显式指定父对象的
Cells会默认指向当前活动工作表,只要操作时活动工作表不是Log,同样会触发跨表构造错误
- 如果代码外层没有写
- 次要可能:
Log工作表开启了保护,且目标写入区域被锁定,没有写入权限时也会返回该错误。 - 你核算的区域尺寸没有问题:代入变量值后行号为6,列范围从6到36,共31个横向单元格,和长度为31的数组完全匹配,尺寸不是报错原因。
解决方案
- 推荐使用
With块统一绑定父对象,这是VBA操作单元格区域的标准写法,能彻底避免跨表引用问题:
With Worksheets("Log") .Range(.Cells(MnthCount + 4, 6), .Cells(MnthCount + 4, MnthDayCount + 5)) = FrstLtr End With
- 如果不想使用With块,必须给所有
Cells显式指定同一个父工作表,写法相对冗余:
Worksheets("Log").Range( _ Worksheets("Log").Cells(MnthCount + 4, 6), _ Worksheets("Log").Cells(MnthCount + 4, MnthDayCount + 5) _ ) = FrstLtr
- 如果修改引用方式后仍报错,检查
Log工作表的保护状态,临时取消工作表保护,或者单独给目标区域开放编辑权限即可。
补充说明:如果代码运行不报错但写入结果异常,所有单元格都显示数组第一个元素,说明
FrstLtr是从单列单元格读取得到的31行1列二维数组,此时需要用转置函数转换为横向数组再写入:With Worksheets("Log") .Range(.Cells(MnthCount + 4, 6), .Cells(MnthCount + 4, MnthDayCount + 5)) = _ WorksheetFunction.Transpose(FrstLtr) End With该问题不会触发运行时错误,仅会导致写入结果不符合预期。
内容的提问来源于stack exchange,提问作者Drawleeh
相关产品推荐
相关产品推荐

