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
关键修改点说明:
- 移除
Select操作:直接通过工作表对象(wsSource、wsTarget)操作单元格,避免因选中其他工作表导致的错误,同时提升代码运行效率。 - 定位目标表最后空白行:通过
wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row获取A列最后有数据的行,然后从下一行开始写入新数据,确保不会覆盖旧内容。 - 动态计算数据行数:用
UBound(material, 1)获取源数据的行数,替代原代码中手动循环计算的g,更准确可靠。 - 批量写入数据:使用
Range批量赋值,比逐行写入效率更高。
内容的提问来源于stack exchange,提问作者Navvvvx__
相关产品推荐
相关产品推荐

