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

VBA实现工作表数据粘贴至另一工作表最后空白单元格问题求助

问题分析与修复方案

你的代码每次覆盖CARGA表的原有数据,核心原因是没有定位到目标表的最后空白行,而是固定从第2行开始写入,自然会覆盖旧数据。另外原代码里的Select操作既低效又容易出错,建议直接操作工作表对象。

以下是修复后的完整代码:

Sub COPIAR()
    ' 定义变量
    Dim fecha As Date
    Dim arato As Variant
    Dim direccion As String
    Dim cuadrilla As String
    Dim id As Variant
    Dim material() As Variant
    Dim cantidad() As Variant
    Dim sourceLR As Long ' 源数据最后一行
    Dim targetLastRow As Long ' 目标表最后一行
    Dim wsSource As Worksheet ' 源工作表(REMITO)
    Dim wsTarget As Worksheet ' 目标工作表(CARGA)
    
    ' 绑定工作表对象,避免Select操作
    Set wsSource = ThisWorkbook.Worksheets("REMITO")
    Set wsTarget = ThisWorkbook.Worksheets("CARGA")
    
    ' 读取固定单元格数据
    fecha = wsSource.Range("K5").Value
    arato = wsSource.Range("K11").Value
    direccion = wsSource.Range("B9").Value
    cuadrilla = wsSource.Range("B16").Value
    id = wsSource.Range("K8").Value
    
    ' 获取源数据(C28开始的material列)的最后一行
    sourceLR = wsSource.Range("C" & wsSource.Rows.Count).End(xlUp).Row
    ' 读取material和cantidad数据
    material = wsSource.Range("C28:C" & sourceLR).Value
    cantidad = wsSource.Range("M28:M" & sourceLR).Value
    
    ' 获取目标表的最后一行(以A列为基准,因为A列每次都会写入fecha)
    targetLastRow = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row
    ' 如果目标表是空的(没有表头以外的数据),则从第2行开始,否则从最后一行的下一行开始
    If targetLastRow = 1 Then ' 假设第1行是表头
        targetLastRow = 2
    Else
        targetLastRow = targetLastRow + 1
    End If
    
    ' 写入数据到目标表的空白区域
    Dim dataRows As Long
    dataRows = UBound(material, 1) ' 获取源数据的行数
    
    With wsTarget
        ' 写入批量重复数据(fecha、arato等)
        .Range(.Cells(targetLastRow, "A"), .Cells(targetLastRow + dataRows - 1, "A")).Value = fecha
        .Range(.Cells(targetLastRow, "B"), .Cells(targetLastRow + dataRows - 1, "B")).Value = arato
        .Range(.Cells(targetLastRow, "C"), .Cells(targetLastRow + dataRows - 1, "C")).Value = direccion
        .Range(.Cells(targetLastRow, "D"), .Cells(targetLastRow + dataRows - 1, "D")).Value = cuadrilla
        .Range(.Cells(targetLastRow, "F"), .Cells(targetLastRow + dataRows - 1, "F")).Value = id
        ' 写入material和cantidad数据
        .Range(.Cells(targetLastRow, "H"), .Cells(targetLastRow + dataRows - 1, "H")).Value = material
        .Range(.Cells(targetLastRow, "I"), .Cells(targetLastRow + dataRows - 1, "I")).Value = cantidad
    End With
End Sub

关键修改点说明:

  1. 移除Select操作:直接通过工作表对象(wsSource、wsTarget)操作单元格,避免因选中其他工作表导致的错误,同时提升代码运行效率。
  2. 定位目标表最后空白行:通过wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row获取A列最后有数据的行,然后从下一行开始写入新数据,确保不会覆盖旧内容。
  3. 动态计算数据行数:用UBound(material, 1)获取源数据的行数,替代原代码中手动循环计算的g,更准确可靠。
  4. 批量写入数据:使用Range批量赋值,比逐行写入效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 07:12:43