跨工作簿用动态变量定义Range报错:Range of Object Worksheet Failed
问题根源分析
- 动态范围拼接错误:原代码把
Range("M1")嵌套在字符串引号里,VBA无法将其解析为单元格数值,导致生成无效的Range地址。 - 对象引用模糊:
Range("M1")、Sheet8未指定所属工作簿,打开新工作簿后,VBA默认对象会切换,引发引用混乱。 - 未绑定目标工作簿:直接调用
Sheet8可能指向源工作簿的同名工作表,而非刚打开的目标工作簿中的表。
修正后的完整代码
Public Sub CopyExportToTracking() Dim srcWB As Workbook Dim destWB As Workbook Dim kng As Range Dim vng As Range Dim lastRow As Long Dim pasteRow As Long ' 绑定源工作簿(当前运行宏的工作簿) Set srcWB = ThisWorkbook ' 从源工作表获取动态行号,明确指定父对象 lastRow = srcWB.Sheet4.Range("M1").Value ' 正确拼接动态Range地址 Set kng = srcWB.Sheet4.Range("$A$1:$K$" & lastRow) kng.Copy ' 打开目标工作簿并绑定到变量 Set destWB = Workbooks.Open("C:\Users\Michelle\Documents\Maple Inventory System\YYYY\YYYY SYRUP MANAGEMENT\test YYYY SYRUP INVENTORY TRACKING.xlsm") ' 从目标工作表获取粘贴行号 pasteRow = destWB.Sheet8.Range("Y1").Value ' 定义目标粘贴范围 Set vng = destWB.Sheet8.Range("$B$" & pasteRow) vng.PasteSpecial Paste:=xlPasteValuesAndNumberFormats ' 可选操作:保存并关闭目标工作簿 ' destWB.Save ' destWB.Close ' 释放对象变量,清理内存 Set vng = Nothing Set destWB = Nothing Set kng = Nothing Set srcWB = Nothing End Sub
核心改进说明
- 明确对象归属:用
ThisWorkbook固定源工作簿,目标工作簿打开后立即绑定到destWB变量,彻底杜绝对象混淆。 - 正确动态范围拼接:先提取单元格中的数值到变量,再和固定地址字符串拼接,确保生成的Range地址合法有效。
- 全限定引用:所有工作表、Range都明确指定所属工作簿,避免VBA默认对象切换导致的报错。
- 对象释放:最后清空所有对象变量,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者Michelle Trudeau
相关产品推荐
相关产品推荐

