VBA - 恼人的复制和粘贴问题

时间:2017-04-07 15:32:32

标签: vba excel-vba excel

我正在努力解决这个问题,我不明白为什么会导致问题。

ActiveSheet.Range("B1:E" & lastrow).Copy
        ActiveSheet.Range("B1").Select
        Selection.PasteSpecial xlPasteValues
        ActiveSheet.Name = startday & "_" & startmonth & "_" & startyear

这会在第三行产生错误。

最初我只是简单地使用了“Range(”B1“)。pastespecial”等等,但这是粘贴到另一个打开的工作簿中,即使它不是活动工作表。

我尝试了大约70或80种不同的替代方法,我无法做到我认为相当简单的事情 - 即复制此范围并将它们作为值粘贴到同一位置的相同位置。

3 个答案:

答案 0 :(得分:1)

ActiveSheet可能会导致问题,have a read有关如何避免使用SelectActive...ActiveSheet元素的问题。

基本上,只需确定您对Worksheet的每个引用的完全限定,同时指定工作表所在的Workbook

ThisWorkbook.Worksheets("SomeWorksheet").Range("B1:E" & lastrow).Copy
ThisWorkbook.Worksheets("AnotherWorksheet").Range("B1").PasteSpecial xlPasteValues
ThisWorkbook.Worksheets("YetAnotherWorksheet").Name = startday & "_" & startmonth & "_" & startyear

如果您的所有操作都与同一工作表相关,则可以使用With令牌简化操作:

With ThisWorkbook.Worksheets("SomeWorksheet")    
    .Range("B1:E" & lastrow).Copy
    .Range("B1").PasteSpecial xlPasteValues
    .Name = startday & "_" & startmonth & "_" & startyear
End With

答案 1 :(得分:1)

如果您尝试将值粘贴到相同的表中,则只需执行以下操作:

With ActiveSheet.Range("B1:E" & lastrow)
    .Value = .Value
End With
ActiveSheet.Name = startday & "_" & startmonth & "_" & startyear

最好,我会定义哪个表,这样就没有歧义:

With Workbooks("name of workbook").Worksheets("name of sheet").Range("B1:E" & lastRow)
    .Value = .Value
End With

这将获取范围/数组的.Value属性并将其写回工作表。无需复制或粘贴任何内容,结果将只保留(即,所有公式引用都将被删除)。

答案 2 :(得分:0)

感谢大家的好评。

我确定了原因,但我并不完全理解问题的根本原因。

我正在采用将工作表从一个工作簿复制到新工作簿的方法,然后将此新工作表上的目标范围(包括公式)复制并粘贴为值。

当这个没有用时,我尝试了@David Zemens建议的方法,但这也没有用。

在我看来好像问题是新工作表中的公式引用了原始工作表中的单元格,并且出于某种原因(原因是我目前不了解的那个原因),这意味着当我尝试将它们转换为值和/或复制并粘贴为值时,VBA不喜欢它。

一旦我采用了让VBA创建新工作簿,然后将新书中原始工作表的内容粘贴为值的替代方法,问题就解决了。