Я создаю макрос печати рабочей книги, инициируемый с помощью пользовательской кнопки ленты.Мне нужно перебрать подмножество рабочих листов, скопировать их, выполнить некоторое форматирование и скрыть оригиналы перед печатью.Однако методы рабочих листов активируются, а копирование ничего не делает, и я не получаю сообщение об ошибке.
Кнопка ленты выполняет этот код макроса в модулях. Модуль 1
Sub bmPrintWB(control As IRibbonControl)
g_printWorkbook = True
ActiveWorkbook.PrintOut
g_printWorkbook = False
End Sub
g_printWorkbook - глобальное логическое значение в модулях.Module2
Это вызывает ThisWorkbook.BeforePrint
Private Sub Workbook_BeforePrint(Cancel As Boolean)
On Error GoTo ERR_HANDLE
If g_printWorkbook Then
bmPrintWorkbookWithSBS
Exit Sub
End If
bmPrintWorkbookWithSBS находится в Modules.Module1
Sub bmPrintWorkbookWithSBS()
Dim ws As Worksheet
Dim tmpWs As Worksheet
Dim sbsWorksheets As Collection
Dim sbsTempWorksheets As Collection
Dim tmpNumber As Integer
Dim bAllowSBSPrint As Boolean
Dim iResult As Integer
Dim bCalc As Boolean
Set sbsWorksheets = New Collection
Set sbsTempWorksheets = New Collection
Application.ScreenUpdating = False
Application.DisplayAlerts = False
If Application.Calculation = xlCalculationAutomatic Then
bCalc = True
Else
bCalc = False
End If
If bCalc Then Application.Calculation = xlCalculationManual
For Each ws In ThisWorkbook.Worksheets
If ws.Visible = xlSheetVisible And IsSheetSideBySide(ws.Name) Then
sbsWorksheets.Add ws
End If
Next ws
tmpNumber = 1
For Each ws In sbsWorksheets
ws.Activate
If Not ActiveSheet.Name = ws.Name Then
Exit Sub
End If
'Set up the global names
iResult = SetGlobalWorksheetNames()
iResult = SetGlobalCallerBasedOnSheetName(ws.Name)
Set tmpWs = CreateSBSTemp(ws, tmpNumber)
If Not tmpWs Is Nothing Then
sbsTempWorksheets.Add tmpWs
ws.Visible = xlSheetHidden
tmpNumber = tmpNumber + 1
End If
Next ws
g_ribbonPrinting = True
Application.ActiveWorkbook.PrintOut
g_ribbonPrinting = False
For Each ws In sbsWorksheets
ws.Visible = xlSheetVisible
Next ws
For Each ws In sbsTempWorksheets
ws.Delete
Next ws
Application.ScreenUpdating = True
Application.DisplayAlerts = True
If bCalc Then Application.Calculation = xlCalculationAutomatic
End Sub
В основном нет вызовов метода листа (Activate, Copy) внизуsub или вызываемая функция делают что-либо.Я попытался включить ScreenUpdating только для ws.Activate, и это тоже не помогло.
Что касается того, почему я не просто запускаю подпрограмму непосредственно с кнопки ленты.Дело в том, что проект vba защищен паролем, и я не мог понять, как предоставить доступ к ленте.Установка глобальной переменной, которую видели в beforePrint, была моим обходным решением.