2016-11-18 4 views
0

У меня есть макрос Excel, который я пытаюсь запустить на каждом листе в книге. Это просто настроить области печати и разрывы страниц, но есть 460 листов. Они все в одном и том же формате, поэтому они должны быть прямолинейными. Я использую имена файлов, поэтому это не должно быть проблемой.Подзаголовок вне пределов досягаемости, что мне не хватает?

Макрос работает на активном листе, затем возникает ошибка, когда он пытается перейти к следующему листу.

Листы («лист» + LTrim (Str (i + 1)) + «»). Выберите линию, в которую она отлаживается. См. Весь код ниже. У меня такое чувство, что это довольно простой лес для дерева, поэтому любая помощь будет принята с благодарностью!

Sub setup() 

    Dim i As Long 

    For i = 1 To 460 

ActiveSheet.VPageBreaks(1).DragOff Direction:=xlToRight, RegionIndex:=1 
ActiveWindow.SmallScroll Down:=24 
Set ActiveSheet.HPageBreaks(1).Location = Range("A64") 
ActiveWindow.SmallScroll Down:=-66 
Application.PrintCommunication = False 
With ActiveSheet.PageSetup 
    .PrintTitleRows = "$1:$3" 
    .PrintTitleColumns = "" 
End With 
Application.PrintCommunication = True 
ActiveSheet.PageSetup.PrintArea = "" 
Application.PrintCommunication = False 
With ActiveSheet.PageSetup 
    .LeftHeader = "" 
    .CenterHeader = "&A" 
    .RightHeader = "" 
    .LeftFooter = "" 
    .CenterFooter = "" 
    .RightFooter = "" 
    .LeftMargin = Application.InchesToPoints(0.236220472440945) 
    .RightMargin = Application.InchesToPoints(0.236220472440945) 
    .TopMargin = Application.InchesToPoints(0.748031496062992) 
    .BottomMargin = Application.InchesToPoints(0.748031496062992) 
    .HeaderMargin = Application.InchesToPoints(0.31496062992126) 
    .FooterMargin = Application.InchesToPoints(0.31496062992126) 
    .PrintHeadings = False 
    .PrintGridlines = True 
    .PrintComments = xlPrintNoComments 
    .PrintQuality = 600 
    .CenterHorizontally = False 
    .CenterVertically = False 
    .Orientation = xlLandscape 
    .Draft = False 
    .PaperSize = xlPaperA4 
    .FirstPageNumber = xlAutomatic 
    .Order = xlDownThenOver 
    .BlackAndWhite = False 
    .Zoom = 46 
    .PrintErrors = xlPrintErrorsDisplayed 
    .OddAndEvenPagesHeaderFooter = False 
    .DifferentFirstPageHeaderFooter = False 
    .ScaleWithDocHeaderFooter = True 
    .AlignMarginsHeaderFooter = False 
    .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 

Sheets("sheet" + LTrim(Str(i + 1)) + "").Select 
Next i 

End Sub 
+1

Попробуйте заменить. Выберите с .Activate. – DoctorMick

+1

«Я использую подписи кодов рабочего стола»: Нет, нет. В 'Таблицы (« Лист1 ») имя« Лист1 »не является кодовым именем, а настоящим именем листа. –

+0

Почему бы не использовать 'Для каждого wrkSht в этомWorkBook.Worksheets' (с' Dim wrkSht как WorkSheet') ... 'Next wrkSht'. Вам нужно будет заменить каждый экземпляр «ActiveWorksheet» на 'wrkSht'. –

ответ

0

Каждый рабочий лист является объектом внутри коллекции рабочих листов - и вы можете проходить каждый элемент в коллекции с использованием цикла For Each.

Ваш оригинальный код выглядит так, как будто он был записан и обновлен (ничего плохого в этом нет). Макро-рекордер записывает все, что угодно - включая настройки, которые являются настройками по умолчанию (поэтому вам не нужно указывать их значение - только если вы хотите, чтобы он отличался от значения по умолчанию). Линии, такие как ActiveWindow.SmallScroll Down:=24, могут быть удалены, так как это просто щелчок мышью, чтобы немного прокрутить экран вниз.

Public Sub SetUp() 

    Dim wrkSht As Worksheet 

    Application.PrintCommunication = False 

    'Look at each wrksht in turn. 
    'If you want to ignore certain worksheets you could use a 
    'SELECT CASE statement within the loop. 
    For Each wrkSht In ThisWorkbook.Worksheets 
     With wrkSht 
      'Remove all manually added page breaks. 
      'Resets to automatic page breaks. 
      'Microsoft Help helpfully just says: 
      'Resets all page breaks on the specified worksheet (thanks for that MS). 
      .ResetAllPageBreaks 
      .HPageBreaks.Add Before:=.Range("A64") 
      With .PageSetup 
       'You can ignore settings that are set as default. 
       'Not sure what they all are, but probably include anything that ends in ="" 
       'for a start. 
       .PrintTitleRows = "$1:$3" 
       .CenterHeader = "&A" 
       .LeftMargin = Application.InchesToPoints(0.236220472440945) 
       .RightMargin = Application.InchesToPoints(0.236220472440945) 
       .TopMargin = Application.InchesToPoints(0.748031496062992) 
       .BottomMargin = Application.InchesToPoints(0.748031496062992) 
       .HeaderMargin = Application.InchesToPoints(0.31496062992126) 
       .FooterMargin = Application.InchesToPoints(0.31496062992126) 
       .PrintHeadings = False 
       .PrintComments = xlPrintNoComments 
       .PrintQuality = 600 
       .Orientation = xlLandscape 
       .Zoom = 46 
      End With 
     End With 
    Next wrkSht 

    Application.PrintCommunication = True 

End Sub 
+0

Большое спасибо за исправленный код и дополнительную информацию о записи макроса. Он работает отлично. – scrapcode

0

Заказать ваши листы Excel по положению, и вы можете использовать:

Sheets(i + 1).Select 

вместо:

Sheets ("sheet" + LTrim (Str (i + 1)) + "").Select 

Пример Sheets (1) может быть первым в этом положении. Листы (2) - это вторая, и так далее ... Все ваши листы будут отмечены их позициями. Но будьте осторожны, чтобы не создавать/удалять листы. Надеюсь, это поможет!

Смежные вопросы