vba 将字符串放入现有标题的单词宏

vba word macro to put a string to an existing Heading

我正在尝试编写一个带有 find/replace 字符串的宏,然后将其移动到现有标题。原文是这样的:

1.标题 1

ID: abcd

1.1 标题 2

ID: abcd

它应该看起来像:

1.Heading 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 which is the raw text and i want to process it to look like this final。我已经找到了,感谢您如何替换文本,只是我停留在原始版本中。谢谢,我给你喝一两杯啤酒

后期编辑:所以我有 5 种标题格式,1。 Heading 1, 1.1 Heading 2 等到5,下面都有一个ID,每个都有一个具体的编号,但是名字是一样的,ID ASD_PC_AWP_[XXXX]。我只需要摆脱 ID ASD_PC_ 并将 AWP_[xxxx] 放在与标题相同的级别,例如:1.Heading 1 AWP_[ xxxx1] ** , **2。标题 2 AWP_[xxx2]...

对后跟 ID: 的任何段落标记执行通配符查找。

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

您需要为标题样式指定替换文本的样式,因为当您删除标题段落末尾的段落标记时,您也会删除标题段落的样式信息。

您需要对后跟 ID:文本的每个样式标题执行此操作。

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 = " []"
            .MatchWildcards = True
            .Wrap = wdFindContinue
            .Execute Replace:=wdReplaceAll

        End With

    Next

End Sub

尝试:

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