Как правильно использовать заголовки и разрывы страниц при создании word?

#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. Нет, это не так. Стили заголовков предназначены для организации содержимого, разделы — для макета страницы.