Подтвердить что ты не робот

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

Ответ 1

Попробуйте это

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

Ответ 2

Перед копированием сделайте исходный лист видимым. Затем скопируйте лист так, чтобы копия также оставалась видимой. Затем копия будет активной. Если вы хотите, скройте исходный лист еще раз.

Ответ 3

Если вы используете следующий код на основе кода @Siddharth Rout, вы переименовываете только скопированный лист, независимо от того, активирован он или нет.

Sub Sample()

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

End Sub

Ответ 4

Я столкнулся с аналогичной проблемой при копировании листа в другую книгу. Я предпочитаю избегать использования "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"

Ответ 5

Добавьте этот код в начало:

    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)" после копирования и перед переименованием. Поэтому перед переименованием вы должны выбрать скопированный лист с именами программ.

Ответ 6

Когда вы хотите скопировать лист с именем "mySheet" и использовать .Copy After: =, Excel сначала называет скопированный лист точно таким же и просто добавляет "(2)", чтобы его окончательное имя было "mySheet (2)".

Скрыто или нет, не имеет значения. Он состоит из двух строк кода, добавляя скопированный лист в конец рабочей тетради !!!

Пример:

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

Просто нет!

Ответ 7

Ответ: Я нашел это и хочу поделиться им с вами.

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