在工作表变量中存储工作表的COPY

时间:2015-04-07 09:52:46

标签: excel vba excel-vba

我想要实现的目标:

我想将工作表的副本分配给变量,供以后使用。

我尝试了什么和结果

首先:以下代码运行正常。我希望实现这样的东西,但使用worksheet.copy

Sub DuplicateSheetRenameFirst()
    Dim wsDuplicate As Worksheet
    Set wsDuplicate = Worksheets.Add
    wsDuplicate.Name = "Duplicate"
End Sub

第二:使用复制方法,在当前工作簿中创建工作表,但会生成运行时错误424 - 需要对象

Sub DuplicateSheetRenameSecond()

    Dim wsDuplicate As Worksheet
    Set wsDuplicate = Worksheets("Sheet1").Copy(after:=Worksheets(Worksheets.Count))
    'above line : runtime error 424 object required, but the sheet is created
    wsDuplicate.Name = "Duplicate"

End Sub

第三:在新工作簿中创建工作表(因此创建book,然后创建工作表),但仍会生成相同的运行时错误424 - 需要对象

Sub DuplicateSheetRenameThird()

    Dim wsDuplicate As Worksheet
    Set wsDuplicate = Worksheets("Sheet1").Copy
    'above line : runtime error 424 object required, but the sheet is created in new workbook
    wsDuplicate.Name = "Duplicate"

End Sub

解决方法:我可以修改任何第二第三方式,首先复制工作表,然后将变量设置为activesheet,但是,如果有一步这样做,我就会徘徊。我不确定这是否会一直有效,因为活动表可能不是刚才复制的那个。可能。


问题:

是否有简单的(一步)方法将工作表的副本存储在变量中?最好没有错误或没有使用错误处理程序过滤错误。

1 个答案:

答案 0 :(得分:2)

这可能还好吗?

Sub copySheet()

Dim ws As Excel.Worksheet
Excel.ThisWorkbook.Sheets("Sheet1").Copy After:=Sheets(1)
Set ws = Excel.ThisWorkbook.ActiveSheet

End Sub

不幸的是,在这种情况下,您需要使用Active...对象。通常,最好避免使用Active...个对象。

你不能这样做,因为方法.copy没有返回工作表类的对象:

Sub copySheet()

Dim ws As Excel.Worksheet
Set ws = Excel.ThisWorkbook.Sheets("Sheet1").Copy(After:=Sheets(1))

End Sub

在上一篇文章中有一些进一步的解释:
Why does Worksheet.Copy not return a reference to the new workbook created

MSDN中,该方法不会返回任何内容,这一点并不明显: https://msdn.microsoft.com/EN-US/library/office/ff837784.aspx

...但在您朋友的Excel对象资源管理器中,这一点更为明显。如果它返回了一个工作表对象,则箭头将显示为:

  

子副本([之前],[之后])作为工作表

enter image description here