在VBA中将动态行从一个工作表复制到另一个工作表

时间:2016-08-31 18:58:57

标签: excel vba excel-vba

我正在尝试将每个工作表中的一些行复制到名为"更新"的工作表中。在同一个工作簿中。

行定义在"Service Requests""Renewals"的关键字之间。

所以步骤1:定义那些行号,然后步骤2:将它们复制到续订表。

我遇到了第2步的问题,不知怎的,我无法解决如何在copy命令中使用rownumber1和rownumber2的问题。

任何帮助将不胜感激。谢谢!

enter image description here

Sub test()

Dim ws As Worksheet

    Application.ScreenUpdating = False
    Sheets("Renew").Activate

For Each ws In Worksheets
        If ws.Name <> "Renew" Then

            For i = 1 To 100

                Dim rownumber1 As Integer
                Dim rownumber2 As Integer

                    If Range("A" & i).Text = "Service Requests" Then
                       rownumber1 = i
                    ElseIf Range("A" & i).Text = "Renewals" Then
                       rownumber2 = i
                    End If

            Next i

       'copy rows between rownumber1 and rownumber2 to the renew sheet

        ws.Rows("rownumber1:rownumber2").EntireRow.Copy
        ActiveSheet.Paste Range("A65536").End(xlUp).Offset(1, 0)

     End If

Next ws

End Sub

更新:

Sub test2()

Dim ws As Worksheet

Dim rownumber1 As Integer
Dim rownumber2 As Integer
Dim FoundCell As Excel.Range

Application.ScreenUpdating = False
Sheets("Renew").Activate

For Each ws In Worksheets
        If ws.Name <> "Renew" Then

            Set FoundCell = ws.Range("A:A").Find(what:="Service Requests", lookat:=xlWhole)
            If Not FoundCell Is Nothing Then
            rownumber1 = FoundCell.Row
            End If

            Set FoundCell = ws.Range("A:A").Find(what:="Renewals", lookat:=xlWhole)
            If Not FoundCell Is Nothing Then
            rownumber2 = FoundCell.Row
            End If                              

'copy renewals to the renewalsummary

        ws.Rows(rownumber1 & ":" & rownumber2).EntireRow.Copy
        ActiveSheet.Paste Range("A65536").End(xlUp).Offset(1, 0)

     End If

Next ws

End Sub

1 个答案:

答案 0 :(得分:2)

您正在寻找的是:

SELECT P.plan_id 
      ,E.Name
      ,P.duration
FROM Plan P
LEFT JOIN Emp E
    ON P.emp_id = E.emp_id
LEFT JOIN PlanEmp PE
    ON P.plan_id = PE.plan_id

尽管如此,您的代码还需要考虑其他一些事项。这可能是一项正在进行的工作,所以我只回答了你的问题,但是:

  • 你的循环每次都会返回第100行,所以我很好奇你的循环是什么意思。
  • 你永远不应该在一个循环中使用DIM,因为你只能声明一个变量,并且每次循环都会尝试这样做而应该抛出一个错误(用你的{{Dim你的rownumber变量) 1}}变量)。
  • 为什么要循环到100?你应该循环到值列表的末尾。

回复编辑

看起来很不错。最重要的是它有效。虽然我会改变这个:

ws.Rows(rownumber1 & ":" & rownumber2).EntireRow.Copy

到此:

ws

硬编码的值不是非常适合未来的,它会查看工作表的最后一行(无论可能是什么)。如果您的任何工作表开始达到最大行,则需要执行此操作:

ActiveSheet.Paste Range("A65536").End(xlUp).Offset(1, 0)

但这可能会在未来发展,那时你可能会超出Excel。