VBA复制表到工作簿结尾(带有隐藏的工作表)

时间:2012-08-16 15:20:37

标签: excel vba excel-vba

我想复制一张纸并将其添加到所有当前纸张的末尾(无论纸张是否被隐藏)。

Sheets(1).Copy After:=Sheets(Sheets.Count)
Sheets(Sheets.Count).name = "copied sheet!"

这样可以正常工作,但是当有隐藏工作表时,新工作表仅在最后一个可见工作表之后插入,因此name命令会重命名错误的工作表。

我尝试了以下变体来获取对新复制的WorkSheet的引用,但没有一个是成功的和/或有效的代码。

Dim test As Worksheet
Set test = Sheets(1).Copy(After:=Sheets(Sheets.Count))
test.Name = "copied sheet!"

7 个答案:

答案 0 :(得分:33)

试试这个

Sub Sample()
    Dim test As Worksheet
    Sheets(1).Copy After:=Sheets(Sheets.Count)
    Set test = ActiveSheet
    test.Name = "copied sheet!"
End Sub

答案 1 :(得分:4)

复制前使源表可见。然后复制工作表,以便副本保持可见。然后该副本将成为活动表。如果需要,请再次隐藏源表。

答案 2 :(得分:1)

如果您使用基于@Siddharth Rout代码的以下代码,则重命名刚复制的工作表,无论是否已激活。

Sub Sample()

    ThisWorkbook.Sheets(1).Copy After:=Sheets(Sheets.Count)
    ThisWorkbook.Sheets(Sheets.Count).Name = "copied sheet!"

End Sub

答案 3 :(得分:0)

我在将工作表复制到另一个工作簿时遇到了类似的问题。我宁愿避免使用'activesheet',因为它在过去曾引起我的问​​题。因此,我编写了一个函数来根据我的需要执行此操作。我在这里为那些通过谷歌到达的人添加它:

此处的主要问题是将可见工作表复制到最后一个索引位置会导致Excel将工作表重新定位到可见工作表的末尾。因此,将工作表复制到最后一个可见工作表后对此问题进行排序的位置。即使您正在复制隐藏的工作表。

Function Copy_WS_to_NewWB(WB As Workbook, WS As Worksheet) As Worksheet
    'Creates a copy of the specified worksheet in the specified workbook
    '   Accomodates the fact that there may be hidden sheets in the workbook

    Dim WSInd As Integer: WSInd = 1
    Dim CWS As Worksheet

    'Determine the index of the last visible worksheet
    For Each CWS In WB.Worksheets
        If CWS.Visible Then If CWS.Index > WSInd Then WSInd = CWS.Index
    Next CWS

    WS.Copy after:=WB.Worksheets(WSInd)
    Set Copy_WS_to_NewWB = WB.Worksheets(WSInd + 1)

End Function

要将此功能用于原始问题(即在同一工作簿中),可以使用类似的内容...

Set test = Copy_WS_to_NewWB(Workbooks(1), Workbooks(1).Worksheets(1))
test.name = "test sheet name"

答案 4 :(得分:0)

将此代码添加到开头:

    Application.ScreenUpdating = False
     With ThisWorkbook
      Dim ws As Worksheet
       For Each ws In Worksheets: ws.Visible = True: Next ws
     End With

将此代码添加到最后:

    With ThisWorkbook
     Dim ws As Worksheet
      For Each ws In Worksheets: ws.Visible = False: Next ws
    End With
     Application.ScreenUpdating = True

如果您希望第一张纸张超出活动且可见,请在末尾调整代码。如下:

     Dim ws As Worksheet
      For Each ws In Worksheets
       If ws.Name = "_DataRecords" Then

         Else: ws.Visible = False
       End If
      Next ws

要确保新工作表是重命名的工作表,请调整代码,类似于以下内容:

     Sheets(Me.cmbxSheetCopy.value).Copy After:=Sheets(Sheets.Count)
     Sheets(Me.cmbxSheetCopy.value & " (2)").Select
     Sheets(Me.cmbxSheetCopy.value & " (2)").Name = txtbxNewSheetName.value

此代码来自我的用户表单,允许我将特定工作表(从下拉框中选择)与我想要的格式和公式复制到新工作表,然后使用用户输入重命名新工作表。请注意,每次复制工作表时,都会自动为其指定一个旧工作表名称" (2)&#34 ;.示例" OldSheet"成为" OldSheet(2)"复制之后和重命名之前。因此,在重命名之前,必须选择带有程序命名的复制表。

答案 5 :(得分:0)

当您要复制名为“ mySheet”的工作表并使用.Copy After:=时,Excel首先将复制的工作表命名为完全相同的名称,然后简单地添加“(2)”,使其最终名称为“ mySheet(2)” “。

是否隐藏,无关紧要。它用两行代码震撼,将复制的工作表添加到工作簿的末尾!!!

示例:

Sheets("mySheet").Copy After:=Sheets(ThisWorkbook.Sheets.count)
Sheets("mySheet (2)").name = "TheNameYouWant"

简单不!

答案 6 :(得分:-3)

答案:我找到了这个并希望与您分享。

Sub Copier4()
   Dim x As Integer

   For x = 1 To ActiveWorkbook.Sheets.Count
      'Loop through each of the sheets in the workbook
      'by using x as the sheet index number.
      ActiveWorkbook.Sheets(x).Copy _
         After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)
         'Puts all copies after the last existing sheet.
   Next
End Sub

但问题是,我们是否可以使用以下代码重命名工作表,如果是,我们该怎么办呢?

Sub CreateSheetsFromAList()
Dim MyCell As Range, MyRange As Range
Set MyRange = Sheets("Summary").Range("A10")
Set MyRange = Range(MyRange, MyRange.End(xlDown))
For Each MyCell In MyRange
Sheets.Add After:=Sheets(Sheets.Count) 'creates a new worksheet
Sheets(Sheets.Count).Name = MyCell.Value ' renames the new worksheet
Next MyCell
End Sub