VBA使用Union函数合并范围时触发Run-time error '1004'问题咨询
错误触发原因
- 核心问题是跨工作表的命名范围无法直接映射为VBA的Range对象:
Range对象的作用域被严格限定为单张工作表,仅能指向同工作表内的单元格区域。你的invoice_totals是引用了多工作表单元格的工作簿级命名范围,不符合Range对象的取值要求,因此Range("invoice_totals")调用直接抛出1004错误。 - 附加问题:你后续用到的
Union方法同样仅支持合并同一张工作表内的Range对象,即使你解决了第一个问题,跨表区域合并时也会触发新的错误。
修正后的实现代码
你需要直接操作工作簿的Names集合来修改命名范围的引用公式,无需通过Range对象中转:
Sub addsheettorange() Dim targetName As Name Dim newRef As String ' 获取工作簿级全局命名范围对象 Set targetName = ThisWorkbook.Names("invoice_totals") ' 拼接原有引用 + 当前活动表E1的绝对引用,逗号分隔多表区域 newRef = targetName.RefersTo & "," & ActiveSheet.Range("E1").Address(True, True, xlA1, True) ' 更新命名范围的引用 targetName.RefersTo = newRef End Sub
代码说明
- 直接通过
ThisWorkbook.Names集合获取跨表命名范围对象,绕过Range对象的单表限制 - 用
Address方法的第四参数External:=True生成带工作表名的绝对引用,保证拼接后的引用格式符合跨表命名范围的规则 - 无需调用Union方法,直接通过拼接引用字符串的方式实现跨表区域的追加
内容的提问来源于stack exchange,提问作者Steve Kammerer
相关产品推荐
相关产品推荐

