首页 > 解决方案 > 粘贴到另一个工作表的下一个空行

问题描述

下面的代码,当用户将问题记录到表单中时,将登录相应的问题选项卡。

团队完成问题并将其标记为“完成并验证”后,我想将该问题(行)从当前选项卡移出到“5. 完成并验证”选项卡。

问题是,假设当前选项卡中有 9 行数据,宏将该行粘贴到“5. Complete & Verified”选项卡的第 9 行。

我试图从 B2 开始一个接一个地粘贴。我还尝试将选项卡名称粘贴到第 1 列(A 列)作为标识符。

Sub Complete()

    ActiveSheet.Activate
    Dim objWS As Worksheet
    Set objWS = ActiveSheet

    Dim intLastRowSrc As Long
    intLastRowSrc = ActiveSheet.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

    ActiveSheet.Activate
    Dim intLastRowSDes As Long
    intLastRowSDes = ActiveSheet.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1
    Dim r As Long

    For r = 2 To intLastRowSrc

        If objWS.Cells(r, "R") = "Complete & Verified" Then

           Sheets("5. Complete & Verified").Range("B" & intLastRowSDes & ":T" & intLastRowSDes).Value = objWS.Range("A" & r & ":S" & r).Value
           objWS.Rows(r).Delete
           Sheets("5. Complete & Verified").Cells(intLastRowSDes, 1) = ws1.Name
           intLastRowSrc = intLastRowSrc - 1
           intLastRowSDes = intLastRowSDes + 1 'Issue - I need it to paste into next row with now data in 5. tab

        End If

    Next

    Exit Sub

标签: excelvba

解决方案


有一些事情需要调整才能发挥作用(我认为)你想让事情发挥作用。

首先,设置对源工作表和目标工作表的引用并直接使用它们,而不是每次都命名。

其次,您不需要Activate任何工作表,所以让我们删除那些

第三,如果您要删除for循环中的行,请始终从数据范围的底部开始并向上移动 - 否则当您删除第 21 行和第 22 行向上移动时,您的循环将完全忽略 22 向上移动而不被检查的事实你会错过行

第四,只需从循环内部获取目标行,而不是尝试增加计数

第五,您将目标工作表上的第 1 列设置为ws1.name但从未定义它,因此我已将其替换为对源工作表名称的引用。

如果其中任何一个没有意义,请在下面发表评论,我会尝试更好地解释。

Sub Complete()

Dim sourceWS As Worksheet
Set sourceWS = ActiveSheet
Dim destWS As Worksheet
Set destWS = ThisWorkbook.Worksheets("5. Complete & Verified")

Dim intLastRowSrc As Long
intLastRowSrc = sourceWS.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

Dim intLastRowSDes As Long
Dim r As Long

For r = intLastRowSrc to 2 Step -1

    If sourceWS.Cells(r, "R") = "Complete & Verified" Then
       intLastRowSDes = destWS.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row + 1
       destWS.Range("B" & intLastRowSDes & ":T" & intLastRowSDes).Value = sourceWS.Range("A" & r & ":S" & r).Value
       sourceWS.Rows(r).Delete
       destWS.Cells(intLastRowSDes, 1) = sourceWS.Name

    End If

Next

Exit Sub

推荐阅读