vba word macro для добавления строки в существующий заголовок

Я пытаюсь написать макрос, который с найти / заменить строку, а затем переместить его в существующий заголовок. Исходный текст выглядит так:

1. Заголовок 1

ID: abcd

1.1 Заголовок 2

ID: abcd

И это должно выглядеть так:

1. Заголовок 1 abcd

1.1 Заголовок 2 abcd

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

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Style = "Heading 2"
With Selection.Find
    .Text = "abcd"
    .Replacement.Text = "abcd^p"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = True
    .MatchSoundsLike = False
    .MatchAllWordForms = False

End With
Selection.Find.Execute Replace:=wdReplaceAll

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

РЕДАКТИРОВАТЬ: Я надеюсь, что я не облажался снова, извините большой:). Итак, у меня есть raw, который является необработанным текстом, и я хочу обработать его, чтобы он выглядел как этот финал. Я уже узнал, благодаря вам, как заменить текст, просто я застрял в сырой версии. Спасибо, у меня есть пиво или два

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: Итак, у меня есть 5 типов форматов заголовков: 1. Заголовок 1, 1.1 Заголовок 2 и т. Д. До 5, и все они имеют ниже идентификатор, каждый с определенным номером, но имя одно и то же, ID ASD_PC_AWP_ [ XXXX]. Мне просто нужно избавиться от идентификатора ASD_PC_ и поставить AWP_[xxxx] на том же уровне заголовка, например: 1.Heading 1 AWP_ [xxxx1] **, ** 2. Заголовок 2 AWP_ [xxx2]...

2 ответа

Решение

Пытаться:

Sub Demo()
Application.ScreenUpdating = False
Dim Rng As Range
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "ID:*^13"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    Set Rng = .Duplicate.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel")
    Rng.End = Rng.Paragraphs.First.Range.End - 1
    Rng.InsertAfter Split(Split(.Duplicate.Text, ":")(1), vbCr)(0)
    .Text = vbNullString
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
Application.ScreenUpdating = True
End Sub

Сделайте поиск по шаблону для любого маркера абзаца, за которым следует ID:.

.Text = "^ 13ID:"
.Replacement.Text = ""

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

Вам нужно будет сделать это с каждым заголовком стиля, за которым следует идентификатор: текст.

Обновлено 2018-11-01

Следующий код должен работать. Я получил несколько подсказок от оригинального кода Macropods.

Обновление 2 2018-11-01

Пересмотрен для работы со списком стилей, определенных пользователем по запросу OP

Sub ConsolidateHeadingWithID()

Const HEADINGS                                   As String = "Heading 1,Heading 2,Heading 3,Heading 4,Heading 5,Other style,another style"

Dim my_headings                                 As Variant
Dim my_heading                                  As Variant
my_headings = Split(HEADINGS, ",")

For Each my_heading In my_headings

        With ActiveDocument.StoryRanges(wdMainTextStory)

            With .Find

                .ClearFormatting
                .format = True
                .Text = ""
                .Style = my_heading
                .MatchWildcards = True
                .Wrap = wdFindStop
                .Execute

            End With

            Do While .Find.Found

                If .Duplicate.Next(unit:=wdWord).Text = "ID" Then

                    .Duplicate.Next(unit:=wdParagraph).Style = my_heading

                End If

                .Collapse wdCollapseEnd
                .MoveStart unit:=wdCharacter, Count:=2
                .Find.Execute

            Loop

        End With

        With ActiveDocument.Range.Find

            .ClearFormatting
            .format = True
            .Text = "(^13)(ID:)(*)(AWP_)([0-9]{1,})"
            .Style = my_heading
            .Replacement.Text = " [\4\5]"
            .MatchWildcards = True
            .Wrap = wdFindContinue
            .Execute Replace:=wdReplaceAll

        End With

    Next

End Sub
Другие вопросы по тегам