1

我对 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 错误。很想知道出了什么问题。

4

1 回答 1

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

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

你想优化你的代码是对的。也许 Excel VBA 开发中最重要的准则是永远不要选择任何东西,这可能会导致各种问题。在您的第一个示例中,您正在.Select显式使用,而在第二个示例中,.GoTo实际上是在做同样的事情。

无需选择工作表、复制范围、选择另一个工作表并粘贴到另一个范围,您可以将数据的副本写入目标范围(在同一个工作表上或另一个工作表上),如下所示:

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

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

于 2012-11-27T16:43:45.393 回答