Я пытался создать UserForm для печати из динамически сгенерированного ListBox доступных листов в моей книге.Это выглядит так:

Я установил 1 - fmMultiSelectMulti в свойствах ListBox, чтобы разрешить множественный выбор.Обычно мне нужны листы, напечатанные в цвете, а также копия, напечатанная в черно-белом варианте.И чтобы убедиться, что все выглядит хорошо, прежде чем тратить чернила, есть флажок для предварительного просмотра печати.
До сих пор мне удалось захватить выделение и сохранить его в переменной с именем SheetsToPrint ,Но приведенная ниже команда печати не работает с Subscript вне диапазона (Ошибка 9) .
Worksheets(Array(SheetsToPrint)).PrintOut preview:=True
Если я не использую переменную и не изменяю ее на следующую строку, она работаеткак и ожидалось:
Worksheets(Array("Sheet1", "Sheet2")).PrintOut preview:=True
И я получаю то, что мне нужно в одном задании на печать. За исключением для изображения баскетбола, которое не отображается / печатается должным образом.
Смежный вопрос: Печать переменных массивов отдельных листов на одной распечатке
MyКод VBA выглядит следующим образом:
Private Sub UserForm_Initialize()
Dim N As Integer
Do
N = N + 1
If Sheets(N).Visible = True Then
SelectedSheets.AddItem Sheets(N).Name
End If
Loop Until N = Worksheets.Count
End Sub
Private Sub SelectAll_Click()
Dim N As Single
If SelectAll.Value = True Then
For N = 0 To SelectedSheets.ListCount - 1
SelectedSheets.Selected(N) = True
Next N
Else
For N = 0 To SelectedSheets.ListCount - 1
SelectedSheets.Selected(N) = False
Next N
End If
End Sub
Private Sub PrinterButton_Click()
Application.Dialogs(xlDialogPrinterSetup).Show
End Sub
Private Sub PrintButton_Click()
Dim vPrev As Boolean
If PrintPreview.Value = True Then
vPrev = True
Else
vPrev = False
End If
With SelectedSheets
For N = 0 To .ListCount - 1
If .Selected(N) = True Then
If SheetsToPrint = vbNullString Then
SheetsToPrint = """" & .List(N) & """"
Else
SheetsToPrint = SheetsToPrint & ", " & """" & .List(N) & """"
End If
End If
Next N
MsgBox "Print Array:" & vbCrLf & SheetsToPrint
Me.Hide
End With
' Color Config
If Original.Value = True Then
Dim sht As Worksheet
For Each sht In Worksheets(Array(SheetsToPrint))
With sht.PageSetup
.BlackAndWhite = False
End With
Next
' Print Original in single print job
With Worksheets(Array(SheetsToPrint))
.PrintOut preview:=vPrev
End With
End If
' Grayscale Config
If Copy.Value = True Then
Dim shtBW As Worksheet
For Each shtBW In Worksheets(Array(SheetsToPrint))
With shtBW.PageSetup
.BlackAndWhite = True
End With
Next
' Print Grayscale in single print job
With Worksheets(Array(SheetsToPrint))
.PrintOut preview:=vPrev
End With
End If
End Sub
Я пробовал много комбинаций и много искал, но безуспешно.Любой совет очень приветствуется.Это мой файл Excel: userform_printout_array.xlsm