【问题标题】:Excel VBA: Copy cells from multiple sheets to a single sheetExcel VBA:将单元格从多个工作表复制到单个工作表
【发布时间】:2012-11-27 16:26:08
【问题描述】:

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

【问题讨论】:

  • 是否愿意用预期的输出更新您的问题? :) 如果您无法使用屏幕截图进行更新,请添加输出的文本视图。我假设您想在最后一张表中获得枢轴/子总视图。对吗?
  • 如果您想避免复制粘贴和安装,请使用那些机器资源以使用更有效的 VBA sn-p 来实现结果:看看some sample here 示例并不意味着为您的确切要求。但是为了让您对执行具有更优化的视角有一个想法:)
  • @bonCodigo 抱歉回复晚了!我没有足够的声誉来发布图片。输入表有一组格式,当我将它们粘贴到输出中时,我希望更改它们,我怎样才能最好地做到这一点?会不会是一个没有格式化的特殊粘贴,然后以某种方式在格式化上分层?

标签: excel vba


【解决方案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 正在有效地做同样的事情。

您可以像这样将数据的副本写入目标范围(在同一个工作表上或另一个工作表上),而不是选择一个工作表、复制一个范围、选择另一个工作表并粘贴到另一个范围内:

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

显然你可以使用变量来代替上面 sn-p 中的硬编码对象。

【讨论】:

  • +1 表示“从不选择任何内容”。如果您期望优化,那是一个禁忌:D 还尝试在处理过程中保持程序计算手动,然后在全部完成后放回自动计算。
  • 抱歉回复晚了! @headofcatering 我试过: Sheets(cal(x)).Range(Cells(i, 15), Cells(i, 26)).Copy Sheets(goba).Range(Cells(j + 1, 1), Cells(j + 1, 12)) 但这似乎不起作用。为什么这样?它确实适用于 Range(Sheets(cal(x)).Cells(i, 15), Sheets(cal(x)).Cells(i, 26)).Copy Sheets(goba).Cells(j + 1, 1)
  • @bonCodigo 为我的无知道歉,但自动计算是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多