Скопируйте диапазон листов из Листа «Титульный лист» в Листы.Количество в новую рабочую книгу.

Скопируйте диапазон листов из Листа «Титульный лист» в Листы.Количество в новую рабочую книгу.

Я пытаюсь создать "клиентскую" версию рабочей книги, которая будет включать все вкладки от "Cover_Sheet" до последнего листа. В рабочей книге есть макрос для многократного копирования листа "value", каждый раз переименовывая его последовательно, например, value2, value3 и т. д., следовательно

Я не знаю, сколько листов нужно будет скопировать, и хочу использовать эту Sheets.Countфункцию. Книга дает мне только титульный лист и вкладку окончательного значения.

Я пытался использовать следующее:

Sub Activate_Sheet()
    Sheets("Cover_Sheet").Activate
End Sub

Sub ExportExcelWorkbookFinal()
' ----------------------------
' Macro to export the workbook and break the links
' which allows it to be sent on to clients.

    Application.ScreenUpdating = False
    Sheets(Array("Cover_Sheet", Sheets.Count)).Copy
    ActiveSheet.Protect "password"
    Application.ScreenUpdating = True
    Application.GetSaveAsFilename
   
End Sub

решение1

Вы получаете только "титульный лист" и вкладку "конечное значение", потому что вы говорите ему копировать Cover_Sheetsи Sheets.Count.
Sheets.Countвернет количество листов в рабочей книге.
Так что если у вас 5 листов, ваш код говорит: Копировать Cover_Sheetsи 5, 5будучи интерпретированным как 5-й лист, следовательно, ваш последний лист.

Я не совсем уверен, что именно вы имеете в виду, но предполагаю, что у вас есть другой макрос, который создает другие вкладки значений. Если вы хотите скопировать все листы, начиная с Cover_Sheetsи до конца, вы можете сначала создать этот массив, а затем использовать то, что у вас есть.
Я использую индекс Cover_Sheetв качестве отправной точки и прохожу весь путь до Sheets.Count.

Sub ExportExcelWorkbookFinal()
'
' Macro to export the workbook and break the links which allows it to be sent on to clients.

Dim sheetArr As Variant
sheetArr = Evaluate("TRANSPOSE(Row(" & Application.Sheets("Cover_Sheet").Index & ":" & Sheets.Count & "))")

Application.ScreenUpdating = False
    Sheets(sheetArr).Copy
    ActiveSheet.Protect "password"
    Application.ScreenUpdating = True
    Application.GetSaveAsFilename
   
End Sub

Однако это все равно установит пароль только на первом листе в новой рабочей книге, Cover_Sheet. Не уверен, является ли это проблемой, поскольку вы ее не поднимали. Но если это так, просто замените ActiveSheet.Protect "password"на следующее:

For Each wsheet In ActiveWorkbook.Worksheets
    wsheet.Protect Password:="password"
Next wsheet

Вы также можете заполнить массив более «обычным» способом, с помощью цикла, но я нахожу подход с одной строкой интересным.

Dim i As Long, sheetArr() As Variant
ReDim sheetArr(Application.Sheets("Cover_Sheet").Index To Sheets.Count)
For i = LBound(sheetArr) To UBound(sheetArr)
    sheetArr(i) = i
Next

Связанный контент