Верхние / нижние колонтитулы 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 не исправит эту ошибку, это отлично работает для меня.