我正在处理工作簿中的多个工作表。每张纸都有相同的标题行。我想编写一个宏来复制每个工作表中的一系列数据(A2:L2 到工作表上的最后一行数据)并将其粘贴到主工作表 A 列中的第一个空单元格中。
我下面的似乎不起作用。如有任何帮助,我们将不胜感激。
Dim Lastrow As Integer
Lastrow = ActiveSheet.Cells(Rows.Count,1).End(xlUp).Row
Sheets("Master Sheet").Range("A2:L10000).Clear
Sheets("Sheet1").Activate
Range("A2:L" & Lastrow).Select
Selection.Copy
Sheets("Master Sheet").Select
Range("A30000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1,0).Range("A1").Select
ActiveSheet.Paste
Sheets("Sheet2").Activate
Range("A2:L" & Lastrow).Select
Selection.Copy
Sheets("Master Sheet").Select
Range("A30000").Select
Selection.End(xlUp).Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste
Run Code Online (Sandbox Code Playgroud)
从看起来你已经快到了。看起来您已经录制了一个宏,这是一个很好的起点。您的特定代码可能无法工作的原因是因为Sheets("Master Sheet").Range("A2:L10000).Clear. 您缺少范围内的结束引号。但无论如何,我选择将其保留,这样您在移动数据时就不会意外清除工作表
所以一般来说最好避免使用select和activate,但是对于录音机来说你在这件事上没有太多发言权。下面您可以看到我如何直接对范围进行操作。
每次找到主工作表的最后一行以及当前工作表非常重要,这样您就知道要复制的范围以及可以将其粘贴到的位置。请务必记住,您始终会找到最后填充的单元格,因此在粘贴目标的情况下,您需要向行值再添加一个,以免意外覆盖某些数据。
For 循环非常有用,我不确定其余工作表的名称是什么,但幸运的是在 VBA 中您可以使用For each. 所以它的作用是循环遍历您指定的每个项目。在本例中,我指定了工作表。现在唯一的问题是我们不想尝试复制并粘贴到同一个主表中,因此我们需要快速检查以确保我们不在主表上。我只是通过将工作表的名称与您输入的主工作表的名称进行比较来完成此操作。
有趣的是,当您复制某些内容时,您只需指定左上角的单元格,它就会填充其余部分。它使生活变得更容易,因为您不需要计算出要粘贴的数组的确切尺寸。VBA 中的函数Copy有一个可选参数Destination,您可以使用该参数来告诉它要立即将其粘贴到哪里。
当您使用它们时,最好完全指定范围,这样Range您就可以看到我如何使用ThisWorkbook.Worksheets("Master Sheet").Range. 这会告诉计算机您想要引用的确切位置;而Range让计算机进行猜测,因此它假设您指的是活动工作表,这可能不是您想要的。
Sub Paster()
Dim LastRowCurr As Long
Dim LastRowMaster As Long
Dim wksht As Worksheet
For Each wksht In ThisWorkbook.Worksheets
If Not wksht.Name = "Master Sheet" Then
LastRowCurr = wksht.Cells(wksht.Rows.Count, 1).End(xlUp).Row
LastRowMaster = Worksheets("Master Sheet").Cells(Worksheets("Master Sheet").Rows.Count, 1).End(xlUp).Row + 1
Range("A2:L" & LastRowCurr).Copy Destination:=ThisWorkbook.Worksheets("Master Sheet").Cells(LastRowMaster, "A")
End If
Next wksht
End Sub
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6390 次 |
| 最近记录: |