我想复制一张纸并将其添加到所有当前纸张的末尾(无论纸张是否被隐藏)。
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!"
答案 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