Как мне распечатать все листы с помощью VBA в Excel? Мой код ведет себя не так, как я думаю, он должен

#excel #vba

#excel #vba

Вопрос:

У меня есть книга Excel, в которой нужно запустить только один лист. Затем есть макрос, который берет данные с этого листа и создает один новый лист для каждой строки на первом листе. Количество создаваемых листов является динамическим и будет увеличиваться или уменьшаться с течением времени или в зависимости от установленных нами фильтров. Для примера, допустим, на данный момент это приводит примерно к 20 новым листам.

У меня есть другой макрос, который предназначен для печати всех вновь созданных листов, но именно здесь у меня возникают проблемы. Макрос начинается со скрытия первого листа, затем предполагается, что он выбирает все видимые листы, выбирает диапазон на всех этих листах и, наконец, печатает выделение.

(примечание: я использовал «выделение» вместо листов или книг в целом, потому что печатные области не будут центрироваться на бумаге.)

В моей голове предполагается, что это распечатывает одну страницу для каждого листа, но я не могу заставить его вести себя должным образом. Когда я выполняю действия вручную для записи макроса, все работает — команда print показывает, что она хочет напечатать 19 страниц. Отлично! Но когда я воспроизводю тот же макрос, он хочет печатать только тот лист, который активен, а не остальные. Есть идеи? Вот мой код:

 'Declare variables
Dim ws As Worksheet

'Temporarily hide the Customer List so the rest of the workbook can print
Worksheets("Customer List").Visible = False

'Select all visible sheets
For Each ws In Sheets
If ws.Visible Then ws.Select False
Next

'Select the range of cells on whatever sheets is active
Range("A1:J49").Select

'Promp user for which printer to use
Application.Dialogs(xlDialogPrinterSetup).Show

'Page setup
Application.PrintCommunication = False
With ActiveSheet.PageSetup
    .LeftHeader = ""
    .CenterHeader = ""
    .RightHeader = ""
    .LeftFooter = ""
    .CenterFooter = ""
    .RightFooter = ""
    .LeftMargin = Application.InchesToPoints(0.25)
    .RightMargin = Application.InchesToPoints(0.2)
    .TopMargin = Application.InchesToPoints(0.25)
    .BottomMargin = Application.InchesToPoints(0.25)
    .HeaderMargin = Application.InchesToPoints(0.05)
    .FooterMargin = Application.InchesToPoints(0.05)
    .PrintHeadings = False
    .PrintGridlines = False
    .PrintComments = xlPrintNoComments
    .PrintQuality = 600
    .CenterHorizontally = True
    .CenterVertically = True
    .Orientation = xlPortrait
    .Draft = False
    .PaperSize = xlPaperLetter
    .FirstPageNumber = xlAutomatic
    .Order = xlDownThenOver
    .BlackAndWhite = False
    .Zoom = False
    .FitToPagesWide = 1
    .FitToPagesTall = 1
    .PrintErrors = xlPrintErrorsDisplayed
    .OddAndEvenPagesHeaderFooter = False
    .DifferentFirstPageHeaderFooter = False
    .ScaleWithDocHeaderFooter = True
    .AlignMarginsHeaderFooter = True
    .EvenPage.LeftHeader.Text = ""
    .EvenPage.CenterHeader.Text = ""
    .EvenPage.RightHeader.Text = ""
    .EvenPage.LeftFooter.Text = ""
    .EvenPage.CenterFooter.Text = ""
    .EvenPage.RightFooter.Text = ""
    .FirstPage.LeftHeader.Text = ""
    .FirstPage.CenterHeader.Text = ""
    .FirstPage.RightHeader.Text = ""
    .FirstPage.LeftFooter.Text = ""
    .FirstPage.CenterFooter.Text = ""
    .FirstPage.RightFooter.Text = ""
End With
Application.PrintCommunication = True

'Print all visible sheets
Selection.PrintOut Copies:=1, Collate:=True

'Unhide Customer List after printing and select
Worksheets("Customer List").Visible = True
Worksheets("Customer List").Select
Range("A1").Select

End Sub
 

Ответ №1:

Я сам все еще новичок, но если бы я попробовал это, я бы установил его в цикле For / Next и действовал на основе количества листов. если вы «Список клиентов» — это первая страница, тогда вы просто обойдете ее.

 AllSheets = Application.Sheets.Count

Application.Dialogs(xlDialogPrinterSetup).Show

For i=2 to AllSheets  '//Assuming sheet 1 is the Customer List
Sheets(i).Range("A1:J49").Select
Application.PrintCommunication = False
With ActiveSheet.PageSetup
    .LeftHeader = ""
    .CenterHeader = ""
    .RightHeader = ""
    .LeftFooter = ""
    .CenterFooter = ""
    .RightFooter = ""
    .LeftMargin = Application.InchesToPoints(0.25)
    .RightMargin = Application.InchesToPoints(0.2)
    .TopMargin = Application.InchesToPoints(0.25)
    .BottomMargin = Application.InchesToPoints(0.25)
    .HeaderMargin = Application.InchesToPoints(0.05)
    .FooterMargin = Application.InchesToPoints(0.05)
    .PrintHeadings = False
    .PrintGridlines = False
    .PrintComments = xlPrintNoComments
    .PrintQuality = 600
    .CenterHorizontally = True
    .CenterVertically = True
    .Orientation = xlPortrait
    .Draft = False
    .PaperSize = xlPaperLetter
    .FirstPageNumber = xlAutomatic
    .Order = xlDownThenOver
    .BlackAndWhite = False
    .Zoom = False
    .FitToPagesWide = 1
    .FitToPagesTall = 1
    .PrintErrors = xlPrintErrorsDisplayed
    .OddAndEvenPagesHeaderFooter = False
    .DifferentFirstPageHeaderFooter = False
    .ScaleWithDocHeaderFooter = True
    .AlignMarginsHeaderFooter = True
    .EvenPage.LeftHeader.Text = ""
    .EvenPage.CenterHeader.Text = ""
    .EvenPage.RightHeader.Text = ""
    .EvenPage.LeftFooter.Text = ""
    .EvenPage.CenterFooter.Text = ""
    .EvenPage.RightFooter.Text = ""
    .FirstPage.LeftHeader.Text = ""
    .FirstPage.CenterHeader.Text = ""
    .FirstPage.RightHeader.Text = ""
    .FirstPage.LeftFooter.Text = ""
    .FirstPage.CenterFooter.Text = ""
    .FirstPage.RightFooter.Text = ""
End With
Application.PrintCommunication = True
'Print it
Selection.PrintOut Copies:=1
Next
 

Комментарии:

1. Я попробовал аналогичный метод, но затем он хочет печатать каждую страницу отдельно, или в моем случае, поскольку я печатаю в формате PDF, он просит меня выбрать имя файла и местоположение (сохранить как …) для каждого листа.