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

将活动单元格地址赋值给Range变量时出现Error 1004错误的原因

搞定VBA里的Error 1004:应用程序定义或对象定义错误

我来帮你拆解这个1004错误的根源,你的代码里踩了几个VBA常见的坑:

  • 变量声明的"隐形陷阱"
    VBA的变量声明规则和不少语言不一样,比如Dim ws1, ws2 As Worksheet其实只有ws2被声明为Worksheet类型,ws1会默认变成Variant类型;同理Dim srcRef, dstRef, tempAdr As Range里只有tempAdr是Range对象,srcRef和dstRef都是Variant。这种模糊的类型声明会导致对象引用时出现不可预期的错误,因为Variant类型无法保证和Range对象的正确交互。

  • Range引用的工作表上下文混乱
    你写了Set dstRef = Range("C19"),这里没有指定具体工作表,VBA会默认把它绑定到当前激活的工作表。如果此时激活的不是ws2,那dstRef其实指向的是其他工作表的C19单元格。之后你又用ws2.Range(dstRef.Address),虽然能拿到ws2上的C19,但这种绕弯子的写法完全没必要,还容易因为Address的格式问题(比如带了其他工作表的名称)导致引用失败。

  • 不必要的工作表激活操作
    循环里反复调用ws2.Activate和ws1.Activate是非常糟糕的习惯:一来会拖慢代码运行速度,二来激活操作会改变当前的工作表上下文,很容易让后续的Range引用"找错地方",这也是1004错误的常见诱因之一。

修复后的代码示例

把这些问题修正后,代码应该是这样的:

' 明确声明每个变量的类型
Dim ws1 As Worksheet, ws2 As Worksheet
Dim dstRef As Range
Dim k As Integer, srn As Integer

Set ws1 = Worksheets("Tabelle1")
Set ws2 = Worksheets("Packinglist_Annexure-1")
' 直接指定工作表绑定dstRef,避免上下文混乱
Set dstRef = ws2.Range("C19")

k = reqRow
srn = 0
' 全程不需要激活工作表,直接通过工作表对象引用Range
For k = reqRow To row1
    dstRef.Offset(srn, 0).Value = srn + 1
    ws1.Range(reqAddr.Address).Offset(0, srn).Copy ' 这里的reqAddr也建议绑定到ws1,避免同样的问题
    srn = srn + 1 ' 别忘了递增srn,不然循环会一直操作同一个单元格
Next k

这样修改后,不仅能解决1004错误,代码的可读性和稳定性也会提升不少。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:25:23