Worksheets (Array (SheetsToPrint)). PrintOut - PullRequest
0 голосов
/ 27 ноября 2018

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

UserForm with Print Button

Я установил 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

1 Ответ

0 голосов
/ 27 ноября 2018

Поскольку вы еще не объявили это, SheetsToPrint уже неявно является Variant, а уже Array.Просто напишите:

Worksheets(SheetsToPrint).PrintOut preview:=True

Нет необходимости удваивать.Обратите внимание, что в связанном вопросе, который вы разместили, в конце они делают то же самое:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...