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

如何实现非相邻单元格复制转置粘贴(非整行)并解决TargetRow重置问题

解决非相邻单元格转置粘贴并持续追加到目标工作表的问题

我明白你的需求:要把Form工作表里的非相邻区域TicketData和Scores转置后粘贴到DB工作表的指定列,而且不能覆盖已有数据,要每次追加到下一行。你提到的TargetRow初始值为0是变量声明后的默认值,执行计算语句后得到正确行号是正常的,但如果重新运行时出现覆盖或没有正确追加的情况,问题大概率出在判断最后一行的依据列不对。

问题分析

你的代码里用A列(Cells(Rows.Count, 1))来定位目标表的最后一行,但如果DB工作表的A列没有数据,End(xlUp)会默认回到第1行,导致每次计算出来的TargetRow都是2,重复覆盖同一行,看起来就像TargetRow又“回到0”重新开始了。

修正后的代码

我们应该用你实际粘贴数据的列(比如F列,因为第一个数据粘贴到F列)来判断最后一行,这样就能确保每次都定位到下一个空白行:

Sub TransferData()
    Dim wsSource As Worksheet
    Dim wsTarget As Worksheet
    Dim TargetRow As Long
    
    ' 定义源和目标工作表
    Set wsSource = ThisWorkbook.Worksheets("Form")
    Set wsTarget = ThisWorkbook.Worksheets("DB")
    
    ' 基于F列(第一个粘贴数据的列)获取最后一行,避免A列无数据导致的错误
    TargetRow = wsTarget.Cells(wsTarget.Rows.Count, "F").End(xlUp).Row
    ' 如果F列是空的(首次运行),默认从第2行开始(假设第1行是表头)
    If TargetRow = 1 And wsTarget.Range("F1").Value = "" Then
        TargetRow = 2
    Else
        TargetRow = TargetRow + 1
    End If
    
    ' 复制TicketData并转置粘贴到F列开始的行
    wsSource.Range("TicketData").Copy
    wsTarget.Range("F" & TargetRow).PasteSpecial Paste:=xlValues, Transpose:=True
    
    ' 复制Scores并转置粘贴到Q列开始的行
    wsSource.Range("Scores").Copy
    wsTarget.Range("Q" & TargetRow).PasteSpecial Paste:=xlValues, Transpose:=True
    
    ' 清除剪贴板,避免后续操作受影响
    Application.CutCopyMode = False
End Sub

关键改进点

  • 定位最后一行的列修正:改用F列来判断,因为这是你第一个粘贴数据的列,能准确获取已有数据的最后位置
  • 首次运行处理:如果F列完全为空,默认从第2行开始(适配表头在第1行的常见场景)
  • 添加剪贴板清除:避免复制粘贴后剪贴板保留内容,影响其他操作

额外注意事项

  • 确保TicketData和Scores这两个命名区域的范围是正确的,包含你需要复制的非相邻单元格
  • 如果你的目标表表头不在第1行,可以调整代码里的TargetRow = 2为对应的起始行号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:44:42