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

VBA循环遇源区域空单元格停止及目标表可用行粘贴问题求助

VBA循环遇源区域空单元格停止及目标表可用行粘贴问题求助

嗨,我来帮你搞定这两个问题!咱们一步步拆解和修改代码:

问题1:碰到源区域空单元格就立刻停止循环

你的原代码是先找到源区域最后一个有数据的行,然后循环到该行,中间只是跳过空行继续执行。但你要的是遇到第一个空单元格就终止循环,不用再处理后面的行。所以我们要把循环里的判断逻辑调整成:只要当前行是空的,直接退出循环,而不是跳过。

问题2:粘贴到目标表的可用行(避免覆盖旧数据)

原代码固定从第2行开始粘贴,每次运行都会覆盖之前的数据。正确的做法是先找到目标表中最后一行有数据的位置,然后从下一行开始粘贴新内容,实现追加效果。

修改后的完整代码

Sub CopyPasteValues()
    Dim sourceSheet As Worksheet
    Dim targetSheet As Worksheet
    Dim sourceRange As Range
    Dim row As Long
    Dim targetRow As Long
    
    ' 设置源工作表和数据起始区域(从A23开始逐行检查)
    Set sourceSheet = ThisWorkbook.Sheets("Create Output")
    Set sourceRange = sourceSheet.Range("A23:H44")
    
    ' 设置目标工作表
    Set targetSheet = ThisWorkbook.Sheets("New Output")
    
    ' 找到目标表最后一行有数据的行,下一行就是粘贴起始行
    ' 优先检查A列,确保拿到真正的最后一行
    targetRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row
    ' 处理目标表只有表头的情况:如果A列只有第1行有数据,就从第2行开始;否则从最后一行下一行开始
    If targetRow = 1 Then
        targetRow = 2
    Else
        targetRow = targetRow + 1
    End If
    
    ' 逐行遍历源区域
    For row = 1 To sourceRange.Rows.Count
        ' 检查当前行的A列是否为空
        If IsEmpty(sourceRange.Cells(row, 1)) Then
            ' 遇到空单元格,直接终止循环
            Exit For
        End If
        
        ' 粘贴固定单元格数据(发票号、日期等)
        targetSheet.Range("A" & targetRow).Value = sourceSheet.Range("B9").Value 'invoice no
        targetSheet.Range("B" & targetRow).Value = sourceSheet.Range("H9").Value 'invoice date
        targetSheet.Range("C" & targetRow).Value = sourceSheet.Range("C12").Value 'buyer's name
        targetSheet.Range("D" & targetRow).Value = sourceSheet.Range("C15").Value 'buyer's address
        targetSheet.Range("E" & targetRow).Value = sourceSheet.Range("G18").Value 'recipe
        
        ' 粘贴源区域对应行的明细数据
        targetSheet.Range("F" & targetRow).Value = sourceRange.Cells(row, 3).Value 'description
        targetSheet.Range("G" & targetRow).Value = sourceRange.Cells(row, 2).Value 'Uom
        targetSheet.Range("H" & targetRow).Value = sourceRange.Cells(row, 1).Value 'quantity
        targetSheet.Range("I" & targetRow).Value = sourceRange.Cells(row, 4).Value 'item rate
        targetSheet.Range("J" & targetRow).Value = sourceRange.Cells(row, 5).Value 'Ex.Sale Tax Value
        targetSheet.Range("K" & targetRow).Value = sourceRange.Cells(row, 6).Value 'Sales Tax Rate
        targetSheet.Range("L" & targetRow).Value = sourceRange.Cells(row, 7).Value 'Total Sales Tax
        targetSheet.Range("M" & targetRow).Value = sourceRange.Cells(row, 8).Value 'TOTAL AMOUNT
        
        ' 目标行下移一行,准备下一次粘贴
        targetRow = targetRow + 1
    Next row
End Sub

关键改动说明

  1. 循环终止逻辑:

    • 删掉了原代码中找lastRow的步骤,改成逐行检查源区域的A列单元格。
    • 一旦发现IsEmpty(sourceRange.Cells(row, 1))为真,就执行Exit For直接终止循环,完全符合你“遇到空单元格就停止”的需求。
  2. 目标行定位逻辑:

    • 使用targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row精准找到目标表A列最后一行有数据的位置。
    • 增加了判断逻辑,处理目标表只有表头的情况,确保每次都能把新数据追加到旧数据后面,不会覆盖已有内容。
  3. 代码简化:移除了原代码中不必要的变量(比如targetRange),让代码更简洁易读。

你直接复制这段代码替换原来的,测试一下应该就能解决你的两个问题啦!

备注:内容来源于stack exchange,提问作者Shaharyar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 08:45:31