【问题标题】:Store COPY of a worksheet in worksheet variable将工作表的副本存储在工作表变量中
【发布时间】:2015-04-07 18:18:34
【问题描述】:

我想要达到的目标:

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

我的尝试和结果

首先:下面的代码可以正常工作。我想实现这样的目标,但使用worksheet.copy

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

第二种:使用复制方法,在当前工作簿中创建工作表,但生成运行时错误424 - Object required

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

第三次:在新工作簿中创建工作表(因此创建书,然后工作表),但仍生成相同的运行时错误 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

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


问题:

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

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    这样可以吗?

    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 的对象资源管理器中,它更明显。如果它返回一个工作表对象,那么箭头会显示:

    Sub Copy([Before], [After]) 作为工作表

    【讨论】:

    • 第一个代码,我考虑过并且是这样做的(请参阅我的问题的 Workaround 部分)。第二个代码和解释,这就是我一直在寻找的:)。谢谢。
    • 很好的解释。我知道这是一个问题,但我从来没有去浏览对象资源管理器。为了避免使用Active... 引用,我通常使用索引来控制我正在使用的工作表。例如:Sheet1.Copy after:=Sheets(Sheets.Count)Sheets(Sheets.Count).Name = "Hello"
    • @user3561813 在这种情况下,我们不能 100% 确定新添加的工作表的索引、名称或编号,我认为Activesheet 是最安全的识别方式。通常,尽管您是正确的,但请使用Sheet1.worksheets("sheet1").worksheets("foobar").sheets(1). 以避免使用Activesheet.
    • @whytheq 同意。这就是为什么我们使用Worksheets.Count 属性来确定工作表的数量,然后将新复制的工作表放在后面。接下来,我们可以将.Count 索引处的工作表(这将是新工作表,因为我们指定它转到该索引)分配给一个变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2012-09-09
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多