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

求助:Sheet1指定区域数据导入Sheet14的VBA代码问题

问题分析与代码修正

原代码存在的问题

  • 数据范围定义错误:Set Database = Sheet14.Range("A1:I1")仅选中了Sheet14的第一行,后续计算最后一行时基于这个小范围,导致逻辑混乱。
  • 仅复制第一列数据:循环中只取New_Input.Cells(i, 1)(即Sheet1的C列),没有处理K列在内的其他列。
  • 列对应逻辑错误:将第一列数据写入Database.Cells(Last_Row, i),会把第i行的第一列数据写到Sheet14的第i列,完全不符合整行复制的需求。
  • 最后一行查找效率低:用While循环逐行判断,不如直接用Excel内置的End(xlUp)方法高效准确。

修正后的代码

Sub Save()
    Dim wsSource As Worksheet, wsTarget As Worksheet
    Dim sourceRange As Range
    Dim lastRowTarget As Long
    Dim i As Long, j As Long
    
    ' 定义工作表对象,提高可读性
    Set wsSource = ThisWorkbook.Sheets("Sheet1")
    Set wsTarget = ThisWorkbook.Sheets("Sheet14")
    
    ' 定义要复制的源数据范围
    Set sourceRange = wsSource.Range("C6:K105")
    
    ' 找到Sheet14中A列最后一个非空行,下一行就是要写入的起始行
    lastRowTarget = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row + 1
    
    ' 遍历源数据的每一行
    For i = 1 To sourceRange.Rows.Count
        ' 检查当前行第一列是否非空(保留原逻辑的过滤条件)
        If sourceRange.Cells(i, 1).Value <> "" Then
            ' 遍历当前行的每一列,复制到目标工作表
            For j = 1 To sourceRange.Columns.Count
                wsTarget.Cells(lastRowTarget, j).Value = sourceRange.Cells(i, j).Value
            Next j
            ' 每复制一行,目标行号加1
            lastRowTarget = lastRowTarget + 1
        End If
    Next i
End Sub

代码说明

  • 工作表对象定义:用wsSource和wsTarget明确源和目标工作表,避免代码歧义。
  • 准确查找目标行:通过wsTarget.Rows.Count结合End(xlUp)快速定位最后非空行,比循环判断更高效可靠。
  • 整行数据复制:嵌套循环处理每行的所有列,确保C6:K105的所有列数据都被复制到Sheet14的对应列。
  • 过滤空行:保留原代码中“仅复制第一列非空的行”的逻辑,若不需要过滤可直接删除If判断块,改为直接复制所有行。

内容的提问来源于stack exchange,提问作者Felix Angcap Jr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:07:18