Верхние / нижние колонтитулы Excel не будут меняться через VBA, если не пусто

отказ от ответственности: прошло несколько лет с тех пор, как я работал (много) с VBA, поэтому это может быть проблема, вызванная тем, что я путаю себя с тем, что по существу очень отличается от того, с чем я обычно имею дело.

Итак; у меня есть книга (Excel 2010) с несколькими листами (20+), большинство из которых многостраничные. Чтобы сделать вещи проще при печати все, я хочу добавить некоторые конкретные заголовки листа с Среди других имя листа, количество страниц и так далее.

Я написал крошечную функцию, которая должна (теоретически) сделать это для меня, повторяя все листы, устанавливающие заголовок. Однако, по какой-то причине он работает только если заголовок пуст; если это уже имеет значение, он отказывается перезаписывать по неизвестной причине.

Dim sheetIndex, numsheets As Integer
sheetIndex = 1
numsheets = Sheets.Count

' Loop through each sheet, but don't set any of them to active
While sheetIndex <= numsheets
    Dim sheetname, role, labeltext As String
    sheetname = Sheets(sheetIndex).name
    role = GetRole(mode) 
    labeltext = "Some text - " & sheetname & " - " & role

    With Sheets(sheetIndex).PageSetup
        .LeftHeader = labeltext
        .CenterHeader = ""
        .RightHeader = "Page &[Page] / &[Pages]"
        .LeftFooter = "&[Date] - &[Time]"
        .CenterFooter = ""
        .RightFooter = "Page &P / &N"
    End With

    sheetIndex = sheetIndex + 1
Wend

4 ответов


Я нашел решение, кажется, работает для замены текста. По какой-либо причине в макрос необходимо включить коды символов формата верхнего / нижнего колонтитула для того, чтобы работать должным образом.

этот код работал для замены существующего текста заголовка новой информацией:

Sub test()
    Dim sht As Worksheet
    Set sht = Worksheets(1)
    sht.PageSetup.LeftHeader = "&L left text"
    sht.PageSetup.CenterHeader = "&C center Text"
    sht.PageSetup.RightHeader = "&R right text"
End Sub

без &L, &C и &R кодексы перед текстом, Я не мог заставить его работать.

некоторые интересные поведения я нашел, что если вы используете следующий код:

.CenterHeader = "&L some text"

он фактически поставит some text на LeftHeader положении. Это заставило меня поверить, что коды форматирования были очень важны.


строку Application.PrintCommunication = False (который добавляется рекордером макросов) перед выполнением PageSetup закручивает формирование через VBA.

Если в вашем коде есть эта строка, попробуйте удалить ее. Это решило мою проблему с установкой верхнего и нижнего колонтитулов через VBA.


Я читал StackOverflow в течение многих лет, и это первый раз, когда я действительно смог опубликовать решение ... надеюсь, это кому-то поможет!! Кроме того, вы должны помнить, я CPA не программист ;-)

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

Sub PrintElection()
' Print preview the MTM Election
    If Range("Tax_Year").Value = Range("First_MTM_year").Value Then
        ActiveSheet.PageSetup.LeftHeader = Format(Worksheets("Election").Range("Taxpayer_Name").Value)
        ActiveSheet.PageSetup.RightHeader = Format(Worksheets("Election").Range("Taxpayer_SSN").Value)

        ActiveWindow.SelectedSheets.PrintPreview

    Else

        MsgBox "The 'Effective For Tax Year' date must EQUAL the 'First MTM year' date", vbOKOnly, "Check Years"
        Sheets("Roadmap").Select
        Range("First_MTM_year").Select
   End If

End Sub

он проверяет, если Mark-to-Market election year совпадает с формой выборов, а затем форматирует страницу выборов.


Я разделил настройку печати листа на 2 цикла. Первый цикл с приложением.PrintCommunication = Ложное Я запускаю заголовка/настройки футера. Затем я устанавливаю приложение.PrintCommunication = True и запустите настройку верхнего / нижнего колонтитула во втором цикле. Кажется, работает быстрее, чем в XL2003, и правильно применяет верхний/нижний колонтитул. Пока MS не исправит эту ошибку, это отлично работает для меня.