使用原始文档中的文本在 Word VBA 宏中操作编号段落的交叉引用

问题描述 投票:0回答:1

我已向 Chat GPT 询问此问题。以下是我的部分发言:

我有一个宏。该宏背后的想法是有一个打开的文档(openDoc),用户在其中选择格式化的段落并将它们复制到剪贴板中。复制的段落具有以下第一、第二和第三段结构:

  1. 文字
  2. 1, .... 的文字
  3. 1 或 2 的文字,...

这些是使用样式编号的段落。此外,第二段(编号 2)中的“1”是使用编号项和插入的段落编号引用对第一段落的交叉引用。同样,第三段中的“1”是相同的,第三段中的“2”是使用编号项目和插入的段落编号引用对第二段的交叉引用。

宏打开一个新文档(newDoc)。从 openDoc 复制的文本将粘贴到 newDoc 中并进行操作。样式和交叉引用得以保留。 newDoc 中经过操作的文本将粘贴回原始文档 (openDoc) 中用户放置光标的位置。这个效果很好。

在newDoc中,原始交叉引用存在,因此当将操作的文本粘贴到原始文档中时,原始交叉引用被保留。风格也被保留。将 newDoc 中的操作文本添加到 openDoc 后,原始文档中的文本如下所示:

  1. 文字
  2. 1, .... 的文字
  3. 1 或 2 的文字,...
  4. 操纵文本
  5. 操纵文本 1, ....
  6. 操纵文本 1 或 2,...

我宁愿更新交叉引用,以便宏的最终结果如下:

  1. 文字
  2. 1, .... 的文字
  3. 1 或 2 的文字,...
  4. 操纵文本
  5. 操纵文本 4, ....
  6. 操纵文本 4 或 5,...

也就是说,操作文本的交叉引用遵循相同的结构和原始段落,但更新为新添加的段落。这意味着第 5 段与第 4 段有交叉引用;第 6 段与第 4 段和第 5 段交叉引用。

此时,我给了 Chat GPT 一个示例宏(一个很小的宏,因为我的做了很多操作),并询问它有什么建议。

聊GPT的第一次尝试:

    ' Manipulate the cross-references in newDoc
    For Each field In newDoc.Fields
        If field.Type = wdFieldRef Then
            ' Update the field code to refer to the correct paragraph in the newDoc
            field.Code.Text = Replace(field.Code.Text, "REF _Ref", "REF _Ref" & field.Result.Text)
        End If
    Next field
    
    ' Insert the manipulated text at the current cursor location in openDoc
    aRng.FormattedText = newDoc.Range.FormattedText
    
    ' Update cross-references in openDoc
    For Each field In openDoc.Fields
        If field.Type = wdFieldRef Then
            ' Update the field code to refer to the correct paragraph in openDoc
            field.Code.Text = Replace(field.Code.Text, "REF _Ref", "REF _Ref" & field.Result.Text)
        End If
    Next field
    
    ' Close the new document without saving changes
    newDoc.Close SaveChanges:=wdDoNotSaveChanges

这会破坏原始文档 (openDoc) 中的所有引用以及从 newDoc 粘贴到 openDoc 中的所有引用。

Chat GPT 的第二次尝试(仅显示 newDoc 的一个循环,但 newDoc 和 openDoc 的两个循环是相同的):

    For Each field In newDoc.Fields
        If field.Type = wdFieldRef Then
            ' Update the field result to refer to the correct paragraph in newDoc
            field.Result.Text = field.Result.Text + 3 ' Adjust the number based on your specific needs
        End If
    Next field

在我的实际代码中,我确定了编号段落的数量,因此我将“3”替换为确定的数字。这似乎在 newDoc 和 openDoc 的粘贴文本中都有效,但是当我更新参考文献时,所有参考文献都回到了我上面显示的内容,其中参考文献适用于第 5 段,而不是第 5 段的 4。

在我看来,我应该能够操作 newDoc 中的交叉引用(在插入原始打开文档之前复制和操作文本)。但是,当我简单地向 newDoc 中的引用添加一个数字并将其复制回 openDoc 时,交叉引用看起来不错,但当我更新 openDoc 中的引用时,添加的数字丢失了。

有没有办法让我操作交叉引用,以便它们在复制回 newDoc 后立即更新?

vba ms-word cross-reference
1个回答
0
投票

所以,我一直在对此进行更多研究。看起来应该很容易。我插入对编号项目的交叉引用,并插入对段落编号的引用。

对编号项目的交叉引用看起来像“_RefSome#”。要查看这些,请按 alt-F9。

这些是对“隐藏”书签的交叉引用。要查看这些书签,请按 Ctrl-shift-F5,确保选中“隐藏书签”框。隐藏书签的格式相同:_RefSome#.

因此,想法应该是找到一个具有相同名称(_RefSome#)的书签和交叉引用并进行更改。很简单吧?

但是,如果您通过 Ctrl-shift-F5 打开窗口,查看隐藏的书签,然后单击“转到”按钮,则整个段落在某种程度上都是书签。

对书签名称进行简单更改,如下所示,会导致整个段落被重命名:

For Each bookmark In newDoc.Bookmarks
    ' Check if the bookmark name starts with "_Ref" (assuming this pattern)
    If Left(bookmark.Name, 4) = "_Ref" Then
        bookmark.Range.Text = "New_" & Mid(bookmark.Name, 5)
    End If
Next bookmark

但是您可以使用隐藏书签窗口删除隐藏书签,并且该书签所附加的段落不会发生任何变化。

我完全困惑了。

© www.soinside.com 2019 - 2024. All rights reserved.