#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, он просит меня выбрать имя файла и местоположение (сохранить как …) для каждого листа.