Excel VBA:将多个工作表中的单元格复制到单个工作表

时间:2012-11-27 16:26:09

标签: excel-vba vba excel

我对VBA很新,我正在尝试自动化工作流程,我需要从6张数据块中提取精选单元格并将它们合并到另一张表格中。我工作的代码,但有点“笨重” - 我使用excel复制和粘贴功能,但似乎无法找到一个远离复制粘贴功能的好解决方案。当我尝试添加粘贴特殊功能时,我收到1004错误。会喜欢优化这个的建议!

对于要复制的每个工作表,单元格在第一列中标记为“1”,“0”或留空 - 如果单元格为“1”或“0”,则将行中的其他单元格复制到合并表。行之间存在一些差距,因此我选择使用For-Loop而不是Do-While语句。

我附上了以下代码:

Sub TEST()
    Dim i As Integer 'copying row counter for each sheet to be copied
    Dim j As Integer 'pasting row counter in consolidated sheet
    Dim cal(1 To 6) As String  'copied sheetname
          cal(1) = "Picks"
          cal(2) = "Eats"
          cal(3) = "Night Out"
          cal(4) = "Active"
          cal(5) = "Family"
          cal(6) = "Arts"
    Dim x As Integer

    Dim y As Integer 'column for date
    Dim z As Integer 'max row to run till

    y = 1 'column checked in each sheet where condition for copying is met
    z = 300 'number of rows to check in each sheet

    j = 1

    For x = 1 To 6

    For i = 1 To z
        If Sheets(cal(x)).Cells(i, y) = "0" Or Sheets(cal(x)).Cells(i, y) = "1" Then
            Sheets(cal(x)).Select
            Range(Sheets(cal(x)).Cells(i, 2), Sheets(cal(x)).Cells(i, 10)).Select
            Selection.Copy
            Application.Goto ActiveWorkbook.Sheets(Consolidated).Cells(j, 1)
            ActiveSheet.Paste
    Else
        j = j - 1
        End If
        j = j + 1
    Next i
    Next x
End Sub

我再次希望优化此代码,使用其他方法而不是复制粘贴。我也试过了:

Application.Goto ActiveWorkbook.Sheets(Consolidated).Cells(j, 1)
ActiveSheet.PasteSpecial Operation:=xlPasteValues

导致1004错误。很想知道出了什么问题。

1 个答案:

答案 0 :(得分:1)

您收到错误是因为您尝试粘贴到活动表而不是活动表的范围内,并且因为PasteSpecial方法的参数错误。

虽然这不符合您的要求,但仍然有效:(请参阅下面的CopyWithoutClipboard以获得更好的替代方案)

Sub PasteIntoGoto()
    Sheets("sheet1").Range("A1").Copy
    Application.Goto ActiveWorkbook.Sheets("Sheet3").Cells(1, 1)
    ActiveSheet.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
End Sub

请注意ActiveSheetPasteSpecialPaste:=之间插入的范围,而不是Operation:=

您想要优化代码是正确的。也许Excel VBA开发中最重要的指导方针是从不选择任何,这可能会导致各种问题。在第一个示例中,您明确使用了.Select,而在第二个示例中,.GoTo实际上是在做同样的事情。

您可以将数据的副本写入目标范围(在同一张纸上或另一张纸上),而不是选择工作表,复制范围,选择另一个工作表并粘贴到另一个范围,如下所示: / p>

Sub CopyWithoutClipboard()
    Sheets("sheet1").Range("A1").Copy Sheets("sheet2").Range("A1")
End Sub

显然,您可以使用变量代替上面代码段中的硬编码对象。