#excel #vba #ms-word #page-break
#excel #vba #ms-word #разрыв страницы
Вопрос:
Я не понимаю, как правильно использовать заголовки в сочетании с разрывами страниц. У меня есть отчет в формате Word, который я создаю с помощью VBA из Excel. Базовая структура должна быть такой:
страница 1
- заголовок
- текст
- текст
- разрыв страницы
страница 2
- текст
- текст
- текст
- текст
Результат, который я получаю, выглядит так:
страница 1
- заголовок
- текст
- текст
страница 2
- разрыв страницы
- пустая страница
- пустая страница
- пустая страница
страница 3
- текст
- текст
- текст
- текст
Разрыв страницы создается с использованием этой части кода:
'Launches word application
Set Wapp = CreateObject("Word.Application")
With Wapp
With .Selection
'New paragraph amp; line
.TypeParagraph
.TypeText St1
.TypeText St2
'Collapses selection
.Collapse Direction:=0 'Direction:=wdCollapseEnd
'New page
.InsertBreak Type:=7 'Type:=wdPageBreak
End With
End With
Я попытался изменить тип на 4 или 2, затем он не создает дополнительной страницы, но затем заголовок появляется на второй странице, а я этого не хочу. Также я пытался добавить эту строку при создании заголовка, но, похоже, это не работает:
With Doc.PageSetup
.DifferentFirstPageHeaderFooter = True
End With
Тогда я подумал, может быть, можно удалить пустую страницу, обнаружив абзац с разрывом страницы, и написал этот код:
'Procedure will check if there are blank pages and remove them
Sub DeleteLastPageBreak(Wapp As Object)
Dim i As Long
Dim Doc As Word.Document
Dim P As Paragraph
'Creates reference to Word document
Set Doc = Wapp.ActiveDocument
For Each P In Doc.Content.Paragraphs
If P.Range.Characters.Count = 1 Then
If P.Range.Characters(1) = vbFormFeed Then
MsgBox "paragraph found"
End If
End If
Next
End Sub
Кажется, что он не может обнаружить разрыв страницы. Что именно я делаю не так и как достичь желаемого результата?
Комментарии:
1. Вы не вставили разрыв страницы. Посмотрите типы разрывов в документации , и вы увидите, что вы вставили разрыв раздела.
2. В исходном коде используется wdPageBreak или 7 и да, я использовал ту же документацию, только что упомянул, что я также пробовал 2 и 4.
3. Не используйте Createobject на этом этапе, используйте ссылку на Word, чтобы получить доступ к intellisense для объекта Word. (Инструменты. Ссылки прокрутите вниз и убедитесь, что установлен флажок рядом с объектом Microsoft Word XX.XX.). Вы путаете заголовки и заголовки? Если вам действительно нужен заголовок, то это свойство объекта Section. Страницы на самом деле не существуют в Word, они представляют собой артефакт, созданный драйвером принтера. Работайте с разделами, и жизнь станет намного проще.
4. И наоборот, если вы используете стиль абзаца для заголовка (как и должно быть), и вы хотите, чтобы заголовок начинался с новой страницы, присвоите этому стилю атрибут «разрыв страницы перед»). Таким образом, вам не нужен код для вставки разрывов страниц.
5. Вставка разрыва страницы сама по себе не приведет к пустой странице в вашем документе. Вставка определенных типов разрыва раздела, wdSectionBreakEvenPage (4) или wdSectionBreakOddPage (5), может. Добавляйте разрыв раздела только в том случае, если вы вносите изменения, влияющие на макет страницы, который включает верхние и нижние колонтитулы.
Ответ №1:
Следующий код, в котором используется ссылка на Word (ранний связанный объект Word), может быть полезен для иллюстрации принципов.
Option Explicit
Sub main()
Dim myWord As Word.Application
Set myWord = New Word.Application
myWord.Visible = True
myWord.Activate
Dim myDoc As Word.Document
Set myDoc = myWord.Documents.Add
'Information for first section
With myDoc.StoryRanges(wdMainTextStory)
' At this point there is only 1 section in the document
With .Sections.Last
With .Headers(wdHeaderFooterPrimary).Range
.Paragraphs.Item(1).Range.Text = "This is paragraph1 in the header"
End With
With .Range.Paragraphs.Item(1).Range
.Style = myDoc.Styles(WdBuiltinStyle.wdStyleHeading1)
.Text = "MyHeadingText "
.InsertParagraphAfter
.Collapse Direction:=wdCollapseEnd
.Text = "Paragraph 2"
.InsertParagraphAfter
.Collapse Direction:=wdCollapseEnd
.Text = "paragraph 3"
.Collapse Direction:=wdCollapseEnd
'start a new section with next page enabled
.InsertBreak Type:=WdBreakType.wdSectionBreakNextPage
.Collapse Direction:=wdCollapseEnd
With .Sections.Item(1).Headers(wdHeaderFooterPrimary)
.LinkToPrevious = False
.Range.Paragraphs.Last.Range.Text = "This is header in section 2 which is on a new page"
End With
.Style = myDoc.Styles(WdBuiltinStyle.wdStyleHeading1)
.Text = "MyHeadingText in section 2 (on a new page)"
.InsertParagraphAfter
.Collapse Direction:=wdCollapseEnd
.Text = "Paragraph 2"
.InsertParagraphAfter
.Collapse Direction:=wdCollapseEnd
.Text = "paragraph 3"
.Collapse Direction:=wdCollapseEnd
End With
End With
End With
End Sub
Комментарии:
1. Разрыв раздела следует вставлять только в том случае, если вы вносите изменения, которые влияют на макет страницы. Разрыв раздела ни при каких обстоятельствах не следует использовать просто для добавления новой страницы.
2. @TimothyRylatt Какой еще цели служит разрыв раздела, если не разрешить новый раздел, который начинается на новой странице. Ручные разрывы страниц — это работа дьявола, и их следует избегать любой ценой.
3. Разрывы разделов @freeflow значительно увеличивают сложность документа. Ручные разрывы страниц лучше, но все же не так хороши. Лучший способ начать новую страницу — форматирование с разрывом страницы перед форматированием в стиле абзаца, с которого начинается новая страница. Разрывы разделов — очень плохой выбор для начала новой страницы. Это было предложено macropod в комментарии к вопросу. addbalance.com/word/MovePages.htm
4. Разрыв раздела следует использовать только при изменении макета страницы, например, при изменении формата бумаги, книжной ориентации на альбомную, формата номера страницы, верхнего или нижнего колонтитулов. Добавление раздела просто для переноса текста на новую страницу — очень плохая практика. Единственным допустимым обстоятельством было бы, если бы было необходимо использовать нечетную страницу или четный разрыв страницы для обеспечения двусторонней печати.
5. Нет, это не так. Стили заголовков предназначены для организации содержимого, разделы — для макета страницы.