2016-09-27 135 views
0

我目前有一个宏,它可以复制一张纸上的数据并将其存档到另一张纸上。我的问题是它正在复制和粘贴公式,它只需要复制和粘贴值。在Excel中粘贴值而不是宏中的公式

Sub Archive_Execution() 

Dim mainworkbook As Workbook 
Set mainworkbook = ActiveWorkbook 
Dim rangeName 
Dim strDataRange As Range 
Dim keyRange As Range 

rangeName = "Archive_Execution" 
Application.Goto Reference:=rangeName 
Selection.Copy 
Sheets("Archive Execution").Activate 
Range("A" & Rows.Count).End(xlUp).Offset(1).Select 
mainworkbook.Sheets("Archive Execution").Paste 

Sheets("Archive Execution").Activate 
Set strDataRange = Range("A2:AA1000000") 
Set keyRange = Range("D1") 
strDataRange.Sort Key1:=keyRange, Order1:=xlAscending 

End Sub 

任何帮助,将不胜感激在我的调整代码,以便仅值粘贴没有公式

+0

从技术上讲,所有你需要做的就是更换'mainworkbook.Sheets(“存档执行”)。用'mainworkbook.Sheets(“存档执行”)Paste'。PasteSpecial的xlPasteValues'但我建议你重新考虑你的代码避免使用“选择”,“复制”和“粘贴”。相反,您可以将新工作表中的单元格设置为您要导入的值。 – Jordan

+0

谢谢你。我曾尝试包括.PasteSpecial xlPasteValues,但我得到一个错误的PasteSpecial方法的工作表类失败?请问您可以通过将新工作表中的单元格设置为值来扩展您的意思吗? –

+0

对不起,您需要指定您正在粘贴的范围,此刻您只指定工作表。 (1).PasteSpecial xlPasteValues' – Jordan

回答

2

正如在评论中提到使用Range().PasteSpecial xlPasteValues,如果你只想复制值。

我也推荐使用Intersect方法和Worksheets("").UsedRange来缩小你的范围。

Sub Archive_Execution() 

    Dim strDataRange As Range 
    Dim keyRange As Range 

    With Sheets("Archive Execution") 
     Range("Archive_Execution").Copy 
     .Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial xlPasteValues 
    End With 

    With Sheets("Archive Execution") 
     Set strDataRange = Intersect(.Range("A2:AA" & .Rows.Count), .UsedRange) 
     Set keyRange = .Range("D1") 
     strDataRange.Sort Key1:=keyRange, Order1:=xlAscending 
    End With 

End Sub 
+0

谢谢你的回答。这不会复制和粘贴值mainbookbook.Sheets(“存档执行”)粘贴线,我得到错误'对象需要' –

+0

Thankyou非常多,已经工作:) –

1

为避免使用复制和粘贴,您可以尝试类似以下的操作,比复制粘贴快得多。

Sub Archive_Execution() 

    Dim mainworkbook As Workbook, rangeName 
    Dim strDataRange As Range, keyRange As Range 
    Dim r As Integer, c As Integer 

    Set mainworkbook = ActiveWorkbook 
    rangeName = "Archive_Execution" 
    r = Range(rangeName).Rows.Count 
    c = Range(rangeName).Columns.Count 

    With Sheets("Archive Execution").Range("A" & Rows.Count).End(xlUp).Offset(1) 
     .Resize(r, c) = Range(rangeName).Value 
    End With 

    Sheets("Archive Execution").Activate 
    Set strDataRange = Range("A2:AA1000000") 
    Set keyRange = Range("D1") 
    strDataRange.Sort Key1:=keyRange, Order1:=xlAscending 

End Sub 
+0

您将需要调整范围使用该技术来适应新的数据。 – 2016-09-27 10:06:50

+0

确实,编辑答案作为复制和粘贴的替代方法。 –

+0

Sheets(“Archive Execution”)中的每个范围。Range()'需要限定引用'Sheets(“Archive Execution”)',并且使用调整大小会更干净。如果我编辑了你的答案,你介意吗? – 2016-09-27 12:47:29