VBA复制源工作簿单元格至目标工作簿指定行时误覆盖旧数据问题
问题分析与解决方案
问题根源
- 原代码中读取行号的语句
Val = Worksheets("Sheet3").Range("A1").Value未指定所属工作簿,若运行代码时目标工作簿处于激活状态,会错误读取目标工作簿的Sheet3单元格值,而非源工作簿的,导致写入行号不符合预期,出现旧数据被覆盖的情况。 - 原代码中源工作簿名称写为
NEW RCA JUNE 23 v2,与你描述的NEW RCA TUNE 23 v2不一致,属于笔误,需统一。
修正后的VBA代码
Sub vba_copy_to_NumberLog() Dim sourceWB As Workbook Dim targetWB As Workbook Dim targetRow As Integer ' 明确指定源、目标工作簿,避免激活状态影响引用 Set sourceWB = Workbooks("NEW RCA TUNE 23 v2") Set targetWB = Workbooks("RCA NUMBER LOG") ' 从源工作簿Sheet3读取目标行号 targetRow = sourceWB.Worksheets("Sheet3").Range("A1").Value ' 方式1:仅复制单元格值(避免覆盖目标行原有格式) sourceWB.Worksheets("Sheet3").Range("B1:G1").Copy targetWB.Worksheets("RCA Log").Range("C" & targetRow).PasteSpecial Paste:=xlPasteValues ' 方式2:复制值+格式(保留源数据格式,替换上面两行即可) ' sourceWB.Worksheets("Sheet3").Range("B1:G1").Copy targetWB.Worksheets("RCA Log").Range("C" & targetRow) ' 清除剪贴板,消除Excel状态栏的复制提示 Application.CutCopyMode = False End Sub
关键修改说明
- 用对象变量明确绑定源/目标工作簿,彻底杜绝因工作簿激活状态导致的对象引用错误,确保行号读取和数据复制的准确性。
- 统一源工作簿名称与你的需求一致,避免找不到工作簿的报错。
- 提供两种粘贴模式,可根据是否需要保留格式自行选择。
- 添加剪贴板清除操作,优化使用体验。
内容的提问来源于stack exchange,提问作者Tim66
相关产品推荐
相关产品推荐

