我对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错误。很想知道出了什么问题。
答案 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
请注意ActiveSheet
与PasteSpecial
和Paste:=
之间插入的范围,而不是Operation:=
。
您想要优化代码是正确的。也许Excel VBA开发中最重要的指导方针是从不选择任何,这可能会导致各种问题。在第一个示例中,您明确使用了.Select
,而在第二个示例中,.GoTo
实际上是在做同样的事情。
您可以将数据的副本写入目标范围(在同一张纸上或另一张纸上),而不是选择工作表,复制范围,选择另一个工作表并粘贴到另一个范围,如下所示: / p>
Sub CopyWithoutClipboard()
Sheets("sheet1").Range("A1").Copy Sheets("sheet2").Range("A1")
End Sub
显然,您可以使用变量代替上面代码段中的硬编码对象。