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