Ответ 1
Попробуйте это
Sub Sample()
Dim test As Worksheet
Sheets(1).Copy After:=Sheets(Sheets.Count)
Set test = ActiveSheet
test.Name = "copied sheet!"
End Sub
Я хочу скопировать лист и добавить его в конец всех текущих листов (независимо от того, скрыты ли листы).
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", хотя это и вызвало у меня проблемы в прошлом. Следовательно, я написал функцию для выполнения этой строки с моими потребностями. Я добавляю его сюда для тех, кто приходит через google, как и я:
Основная проблема здесь заключается в том, что копирование видимого листа в последнюю позицию индекса приводит к тому, что 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"
Добавьте этот код в начало:
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)". Пример "OldSheet" становится "OldSheet (2)" после копирования и перед переименованием. Поэтому перед переименованием вы должны выбрать скопированный лист с именами программ.
Когда вы хотите скопировать лист с именем "mySheet" и использовать .Copy After: =, Excel сначала называет скопированный лист точно таким же и просто добавляет "(2)", чтобы его окончательное имя было "mySheet (2)".
Скрыто или нет, не имеет значения. Он состоит из двух строк кода, добавляя скопированный лист в конец рабочей тетради !!!
Пример:
Sheets("mySheet").Copy After:=Sheets(ThisWorkbook.Sheets.count)
Sheets("mySheet (2)").name = "TheNameYouWant"
Просто нет!
Ответ: Я нашел это и хочу поделиться им с вами.
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