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
关键改动说明
循环终止逻辑:
- 删掉了原代码中找
lastRow的步骤,改成逐行检查源区域的A列单元格。 - 一旦发现
IsEmpty(sourceRange.Cells(row, 1))为真,就执行Exit For直接终止循环,完全符合你“遇到空单元格就停止”的需求。
- 删掉了原代码中找
目标行定位逻辑:
- 使用
targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row精准找到目标表A列最后一行有数据的位置。 - 增加了判断逻辑,处理目标表只有表头的情况,确保每次都能把新数据追加到旧数据后面,不会覆盖已有内容。
- 使用
代码简化:移除了原代码中不必要的变量(比如
targetRange),让代码更简洁易读。
你直接复制这段代码替换原来的,测试一下应该就能解决你的两个问题啦!
备注:内容来源于stack exchange,提问作者Shaharyar
相关产品推荐
相关产品推荐

