Статьи из блога

Статьи из блога

Поиск заголовков и вставка разрывов страниц перед ними

Алексей спрашивает:

Столкнулся со след. проблемой. Имеется документ на 25 000 стр. Этот документ получился в результате выгрузки из БД.

Как в этом документе сделать так чтобы определенные заголовки начинались с новой страницы, а не по окончании пред. текста. То есть, этот загловок начинается с середины, а мне нужно, чтобы с новой страницы.

Для начала вы должны определить, каким стилем у вас оформлены заголовки в тексте. Обычно это Заголовок 1, Заголовок 2 или другой стиль.

 

После того, как вы определили стиль заголовка, можете применить следующий макрос. Он ищет по тексту заголовки, оформленные стилем "Заголовок 1", а затем вставляет разрыв страницы перед найденным заголовком, оформленным этим стилем. Обратите внимание, что макрос ищет определенные заголовки, оформленные конкретным стилем - в примере это стиль "Заголовок 1". Если у вас эти заголовки оформлены другим стилем, или вообще не оформлены каким-либо стилем, то ничего изменено не будет.

Sub headBreak()
With Selection.Find
   .ClearFormatting
   .Replacement.ClearFormatting
   .Forward = True
   .Wrap = wdFindContinue
   .Text = ""
   .Style = ActiveDocument.Styles("Заголовок 1")
   .Execute
End With
Selection.Collapse wdCollapseStart
Selection.InsertBreak Type:=wdSectionBreakNextPage
End Sub

UPD: Либо воспользуйтесь советом, приведенным в комментариях Александром Витером (диалоговое окно "Абзац", вкладка "Положение на странице", установить флажок на параметре "с новой страницы").

]]>twitter.com facebook Вконтакте Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>

Комментариев: 37

  1. 23.04.2009 в 10:01 | #1

    Если заголовки действительно оформлены стилями, то нужно просто в свойствах этого стиля поставить свойство «Начинать с новой страницы.»

  2. Моторокер
    24.04.2009 в 15:07 | #2

    Начинать с новой страницы

    Сразу же об этом подумал, только прочитав анонс в ридере.

    Если же надо искать определённые заголовки (например, Заголовок 1, в котором есть слово «Аларма»), то при поиске и замене нажать Больше, выбрать Формат - Стиль.

    P.S. Вместо двух капч можно поставить одну – dimoningru-captcha

  3. 24.04.2009 в 15:09 | #3

    Спасибо.

    Одна капча не справляется.

  4. Антон
    07.08.2009 в 12:00 | #4

    А если не оформлены эти заголовки совершенно никаким стилем? То как посоветуете поступить? Пробовал создать стиль заголовка и применить его к документу, но ничего не получилось, а ведь документов действительно много и приходится руками изза незнания может быть простых вещей, подскажите.

  5. 07.08.2009 в 12:08 | #5

    Антон, если не оформлены, то придется руками искать эти заголовки и применять к ним соответствующие стили.

    Зачем создавать стиль заголовока? Шаблон уже содержит предустановленные стили заголовков. Можете воспользоваться ими или подредактировать их по своему усмотрению.

    Почему у вас не получилось создать стиль и применить его? В чем трудность?

  6. 07.08.2009 в 12:13 | #6

    А если не оформлены эти заголовки совершенно никаким стилем? …

    Тогда это не заголовки, а просто текст. Word не знает, что это у вас заголовок. Нужно ему об этом сказать, т.е. оформить их стилем. Других вариантов нет. Или делать по-человечески, или мучаться с каждым документом.

    Другой вопрос, как оформить стилем. Если каждый ваш «заголовок» имеет совершенно четкое и оригинальное оформление, то можно макросом искать текст, оформленный нужным образом и применять к нему стиль нужного заголовка.

  7. Антон
    07.08.2009 в 12:36 | #7

    Спасибо за оперативность Антон Кокин и Александр Витер,честно говоря не ожидал! По поводу

    Если каждый ваш «заголовок» имеет совершенно четкое и оригинальное оформление, то можно макросом искать текст, оформленный нужным образом и применять к нему стиль нужного заголовка.
    очень в тему,значит мне необходимо найти подходящий стиль(на самом деле вид не должен менятся это плат.документ) и применить его к каждому похожему будущему заголовку, тогда вопрос, каккой макрос поможет мне найти заголовки и заменить их стиль, а затем начать следующее плат.поручение с новой строки? Заранее благодарен за помощь

  8. 07.08.2009 в 14:14 | #8

    Находить стиль не нужно. Выделите текст, оформленный как нужно, и на его основе создайте стиль. А макрос можно будет предложить, видя исходный документ

  9. Моторокер
    09.08.2009 в 14:59 | #9

    Антон
    А если не оформлены эти заголовки совершенно никаким стилем?

    Но как-то ведь они оформлены? Часто заголовки выделяют жирным. Ищите жирный текст и заменяйте на стиль Заголовок.

    Не оформлены жирным? По правилам точка в конце заголовка не ставится - ищите любую букву + знак абзаца.

    Часто заголовок отделяют двойными абзацами, если нет форматирования, тоже поможет ускорить поиск.

    Одна капча не справляется.

    Поробуйте

    dimoning.ru-captcha

  10. darklumen
    28.09.2009 в 13:28 | #10

    скажите, скажем я нашел с помощью любой буквы и знака абзаца нужный фрагмент, то как мне выделить всю строку?

  11. 28.09.2009 в 14:00 | #11

    строку или абзац?

  12. 28.09.2009 в 14:02 | #12

    Мышкой или же воспользоваться макросом для выделения текущей строки:

    Sub selLine()
    'выделяем текущую строку (где находится курсор ввода)
       Selection.Bookmarks("\line").Select
    End Sub

  13. darklumen
    28.09.2009 в 14:09 | #13

    спасибо огромное.

    еще вопросик, скажите пожалуйста, как выделить в тексте все таблицы и оформить из одним стилем.

    я автоформатом таблиц задаю нужный стиль, но применяется только к одной таблице.

    извините, если не в том разделе спрашиваю.

  14. darklumen
    28.09.2009 в 23:03 | #14

    Sub Макрос1()
    '
    ' Макрос1 Макрос
    ' Макрос записан 28.09.2009 DarkLumen
    '
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        Selection.Find.Replacement.Style = ActiveDocument.Styles("Заголовок 1")
        Selection.Find.Replacement.ParagraphFormat.Borders.Shadow = False
        With Selection.Find
            .Text = "^$^p"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub

    помогите пожалуйста. в макросах плохо разбираюсь, поэтому сначала записываю действие потом его редактирую. Здесь поиском нахожу символ буквы + символ абзаца и заменяю на стиль "заголовок 1". Проходит нормально. Заголовки становятся нужным стилем. Но когда запускаю занова макрос - заголовки обрамляются черной линией и это уже становится на "заголовок 1", а "заголовок+ 15рт и так далее". не могли бы объяснить, в чем дело? почему так происходит?

  15. 29.09.2009 в 10:47 | #15

    darklumen, удалите эту строку:

    Selection.Find.Replacement.ParagraphFormat.Borders.Shadow = False

  16. darklumen
    17.11.2009 в 13:38 | #16

    а что делать , если заголовок содержится на 2 и более строках. как выполнить выделение и форматирование более 1 строки?

    =)

  17. 17.11.2009 в 14:44 | #17

    У вас один заголовок разделен на две части знаком абзаца? С какой целью? Если это один заголовок (стиль), который просто продолжается естественным образом на второй и третьей строках, то он будет отформатирован как один заголовок.

    Либо же попытайтесь заменить знак абзаца на знак разрыва строки.

  18. darklumen
    17.11.2009 в 15:01 | #18

    нет, это один большой заголовок, не влезающий на 1 строку.

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

  19. 17.11.2009 в 19:59 | #19

    чтобы применить стиль ко всему заголовку

    Ваш заголовок уже имеет стиль. Получается, вы хотите переопределить стиль для этого заголовка (текста, оформленного стилем заголовка)?

    В таком случае, мне непонятен вопрос. Вы сами, кстати, и отвечаете на него, сообщив, что:

    я ищу необходимую строку по символу и знаку абзаца

    Находите, выделяете и форматируете, как желаете. Уточните, что и как вы хотите получить?

  20. darklumen
    17.11.2009 в 21:20 | #20

    разобрался. спасибо. все понял.

    но пока разбирался появилось еще 2 вопросика:

    1) как преобразовать все буквы заголовка в прописные?

    2) и как сделать сквозную нумерацию заголовков без точки?

    извините, если достал расспросами!

  21. 17.11.2009 в 21:29 | #21

    1. Выбираете нужный стиль, заходите в его настройки (в опции Шрифт) и устанавливаете там опцию "Все прописные".

    2. Вам нужно опять же изменить стиль нумерации. Почитайте вот эту заметку на сайте - http://wordexpert.ru/page/stili-spiskov-v-redaktore-word-2007 (ну и первую часть, если у вас 2003 редактор.

  22. darklumen
    17.11.2009 в 22:53 | #22

    а скажите, что написать в макросе чтобы оглавление вставить именно на какую-то конкретную страницу?

  23. 18.11.2009 в 14:07 | #23

    А в чём проблема? В содержании или в конкретной странице? Вот так можно вставить оглавление с двумя уровнями заголовков в местоположение курсора:

    Selection.Fields.Add Selection.Range, wdFieldTOC, "\o ""1-2"" \u", False

  24. darklumen
    07.12.2009 в 23:37 | #24

    Простите, не подскажите как сделать перенос строк в макросе?

  25. darklumen
    08.12.2009 в 01:26 | #25

    и еще вопрос: как сделать резервное копирование, чтобы пользователь сам выбирал место куда сохранить исх файл.

    т.е: открываем файл - жмем макрос - текст дублируется на новый документ - появляется окно "сохранить как" - а дальше макрос выполняет свои какие-то действия....

    собственно, как обработать появления окна "сохранить как" в макросе?

    заранее благодарен. =)

  26. 08.12.2009 в 07:41 | #26

    Простите, не подскажите как сделать перенос строк в макросе?

    Поставьте нижнее подчеркивание после оператора и продолжайте код с новой строки.

  27. 08.12.2009 в 09:30 | #27

    …собственно, как обработать появления окна "сохранить как" в макросе?…

    Есть два варианта.

    Вариант 1. После нажатия кнопки «Сохранить» документ просто будет сохранён:

    With Dialogs(wdDialogFileSaveAs)
        .Name = ActiveDocument.Name
        .Show
      End With

    Вариант 2. Обладает большей гибкостью. Можно задать заголовок, расширения файлов, текст кнопки, вид окна. После положительного ответа на диалог, его результат можно обработать:

    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Куда сохранять?"
        .AllowMultiSelect = False
        .ButtonName = "Сохраните, плиз"
        .InitialFileName = ActiveDocument.Name
        If .Show Then 'Если нажали кнопку «Сохраните, плиз»
          '…
        Else 'Если нажали «Отмена»
          '…
        End If
      End With

  28. darklumen
    08.12.2009 в 13:53 | #28

    спасибо огромное! )

  29. darklumen
    08.12.2009 в 13:54 | #29

    Простите, не подскажите как сделать перенос строк в макросе?

    Поставьте нижнее подчеркивание после оператора и продолжайте код с новой строки.

    я имел ввиду, как программно написать расстановку переносов в тексте? =)))))

  30. darklumen
    08.12.2009 в 15:31 | #30

    извините, я понимаю, что уже надоел всвоими вопросами, но у меня опять проблема с форматированием заголовков в тексте.

    Этим макросом я создаю свой стиль заголовка, приэтом применяется нумерация цифрами без точки.

    Sub CreateStyle()
        ActiveDocument.Styles.Add Name:="Стиль ГОСТ", Type:=wdStyleTypeParagraph
        ActiveDocument.Styles("Стиль ГОСТ").AutomaticallyUpdate = False
        With ActiveDocument.Styles("Стиль ГОСТ").Font
            .Name = "Times New Roman"
            .Size = 14
            .Bold = False
            .Italic = False
            .Underline = wdUnderlineNone
            .UnderlineColor = wdColorAutomatic
            .StrikeThrough = False
            .DoubleStrikeThrough = False
            .Outline = False
            .Emboss = False
            .Shadow = False
            .Hidden = False
            .SmallCaps = False
            .AllCaps = True
            .Color = wdColorAutomatic
            .Engrave = False
            .Superscript = False
            .Subscript = False
            .Scaling = 100
            .Kerning = 0
            .Animation = wdAnimationNone
        End With
        With ActiveDocument.Styles("Стиль ГОСТ").ParagraphFormat
            .LeftIndent = CentimetersToPoints(2.54)
            .RightIndent = CentimetersToPoints(0)
            .SpaceBefore = 0
            .SpaceBeforeAuto = False
            .SpaceAfter = 18
            .SpaceAfterAuto = False
            .LineSpacingRule = wdLineSpace1pt5
            .Alignment = wdAlignParagraphJustify
            .WidowControl = True
            .KeepWithNext = False
            .KeepTogether = False
            .PageBreakBefore = True
            .NoLineNumber = False
            .Hyphenation = True
            .FirstLineIndent = CentimetersToPoints(-1.27)
            .OutlineLevel = wdOutlineLevel1
            .CharacterUnitLeftIndent = 0
            .CharacterUnitRightIndent = 0
            .CharacterUnitFirstLineIndent = 0
            .LineUnitBefore = 0
            .LineUnitAfter = 0
        End With
        ActiveDocument.Styles("Стиль ГОСТ").NoSpaceBetweenParagraphsOfSameStyle _
            = False
        ActiveDocument.StylesСтиль ГОСТ").ParagraphFormat.TabStops.ClearAll
        With ActiveDocument.Styles("Стиль ГОСТ").ParagraphFormat
            With .Shading
                .Texture = wdTextureNone
                .ForegroundPatternColor = wdColorAutomatic
                .BackgroundPatternColor = wdColorAutomatic
            End With
            .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
            .Borders(wdBorderRight).LineStyle = wdLineStyleNone
            .Borders(wdBorderTop).LineStyle = wdLineStyleNone
            .Borders(wdBorderBottom).LineStyle = wdLineStyleNone
            With .Borders
                .DistanceFromTop = 1
                .DistanceFromLeft = 4
                .DistanceFromBottom = 1
                .DistanceFromRight = 4
                .Shadow = False
            End With
        End With
        ActiveDocument.Styles("Стиль ГОСТ").LanguageID = wdRussian
        ActiveDocument.Styles("Стиль ГОСТ").NoProofing = False
        ActiveDocument.Styles("Стиль ГОСТ").Frame.Delete
    End Sub

    --------------------------------------

    Этим макросом я нахожу все заголовки в тексте и применю вышесделанный стиль на все найденные заголовки.

    НО в результате, отступы все поехали, нумерация не проставлена. Макросы делал макрорекодером, все нормально было. В чем проблема? Голова уже не соображает.. =(((

    Sub StyleUse()
    '
    ' Макрос1 Макрос
    ' применение стиля к заголовкам'
        Selection.Find.ClearFormatting
        Selection.Find.Replacement.ClearFormatting
        Selection.Find.Replacement.Style = ActiveDocument.Styles("Стиль ГОСТ")
        
        With Selection.Find
            .Text = "^$^p"
            .Replacement.Text = ""
            .Forward = True
            .Wrap = wdFindContinue
            .Format = True
            .MatchCase = False
            .MatchWholeWord = False
            .MatchWildcards = False
            .MatchSoundsLike = False
            .MatchAllWordForms = False
        End With
        Selection.Find.Execute Replace:=wdReplaceAll
    End Sub

  31. 08.12.2009 в 16:19 | #31

    я имел ввиду, как программно написать расстановку переносов в тексте? =)))))

    Согласитесь, перенос строк и расстановка переносов немного разные вещи. smile

    Вот строка для установки расстановки переносов в тексте:

    ActiveDocument.AutoHyphenation = True

    Или вы что-то другое имели в виду?

  32. darklumen
    08.12.2009 в 16:24 | #32

    именно это! огромное спасибо.

    и прошу прощения за мое неумение излагать свои мысли!=))))

  33. 08.12.2009 в 16:40 | #33

    darklumen, в записанных макросах я не нашёл строк, которые добавляют нумерацию к заголовками. К сожалению, не всё, что вы делаете, записывается макрорекордером.

    Я, честно говоря, никогда программно стили не создавал и нумерацию не задавал, но попробую разобраться.

  34. 08.12.2009 в 16:48 | #34

    darklumen, а с какой целью вы создаете стиль программно? Вам это нужно для шаблона (нумерованные заголовки по ГОСТу)?

    И как у вас оформлены заголовки в тексте, которые вы ищете? В макросе это не определено.

  35. darklumen
    08.12.2009 в 22:17 | #35

    ГОСТ 7.1-2003 «Общие требования к текстовым документам»

    Подчеркивать заголовки не допускается. Слова в заголовках не переносятся, точки в конце не ставятся. Заголовки пишутся без кавычек.

    Разделы имеют порядковые номера в пределах всей записки. Заголовки разделов (глав) пишутся прописными буквами. Обозначаются арабскими цифрами без точки 1, 2 и т.д. и начинаются с абзацного отступа (1,27 см). Расстояния между текстом и заголовками равно двум 1,5-м интервалам.Каждый раздел пояснительной записки рекомендуется начать с нового листа.

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

    может я слишком все усложняю и есть другое решение?

  36. 08.12.2009 в 22:26 | #36

    Думаю, что усложняете. Я тоже работаю по ГОСТу и у меня давным давно сделан шаблон с нужными заголовками, нумерацией заголовков. Кстати, об этом я даже написал заметку: http://wordexpert.ru/page/sozdanie-stiley-dlya-zagolovkov-i-mnogourovnevyih-spiskov-v-word

  37. Миша
    07.03.2012 в 14:29 | #37

    Для форматирования заголовков совсем не нужно выделять строку, это можно сделать с помощью "горячих клавиш": 1. установите курсор на строке, где должен быть заголовок. 2. нажмите комбинацию клавиш: "Alt"+ "1"(ряд цифр в верху) (цифра 1= заголовок первого типа, цифра 2= второго, 3=третьего). PS: для ворда версий 2000-2003 (в 2007 не пробовал)

Оставьте комментарий!

(обязательно)

^ Наверх