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

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

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!" 

尝试这个

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

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

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

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

在将工作表复制到另一个工作簿时遇到类似的问题。 我宁愿避免使用“activesheet”,因为它在过去引起了我的问题。 因此我写了一个函数来满足我的需求。 我在这里添加它为那些通过谷歌到达像我一样:

这里的主要问题是将可见图表复制到最后一个索引位置会导致Excel将图表重新定位到可见图纸的末尾。 因此,将表格复制到最后一张可见表格sorting后的位置。 即使您正在复制隐藏的工作表。

 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 

使用这个function的原始问题(即在同一个工作簿)可以用类似于…

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

将此代码添加到开头:

  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 

这段代码来自于我的用户表单,它允许我使用格式和公式来复制特定工作表(从下拉框中select),然后使用用户input重新命名新工作表。 请注意,每次复印纸张时,都会自动指定“(2)”作为旧的纸张名称。 示例“OldSheet”在复制之后和重命名之前变为“OldSheet(2)”。 因此,您必须在重命名之前select具有程序命名的复制表格。

答:我find了这个,并想和你分享。

 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