我已向 Chat GPT 询问此问题。以下是我的部分发言:
我有一个宏。该宏背后的想法是有一个打开的文档(openDoc),用户在其中选择格式化的段落并将它们复制到剪贴板中。复制的段落具有以下第一、第二和第三段结构:
这些是使用样式编号的段落。此外,第二段(编号 2)中的“1”是使用编号项和插入的段落编号引用对第一段落的交叉引用。同样,第三段中的“1”是相同的,第三段中的“2”是使用编号项目和插入的段落编号引用对第二段的交叉引用。
宏打开一个新文档(newDoc)。从 openDoc 复制的文本将粘贴到 newDoc 中并进行操作。样式和交叉引用得以保留。 newDoc 中经过操作的文本将粘贴回原始文档 (openDoc) 中用户放置光标的位置。这个效果很好。
在newDoc中,原始交叉引用存在,因此当将操作的文本粘贴到原始文档中时,原始交叉引用被保留。风格也被保留。将 newDoc 中的操作文本添加到 openDoc 后,原始文档中的文本如下所示:
我宁愿更新交叉引用,以便宏的最终结果如下:
也就是说,操作文本的交叉引用遵循相同的结构和原始段落,但更新为新添加的段落。这意味着第 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 后立即更新?
所以,我一直在对此进行更多研究。看起来应该很容易。我插入对编号项目的交叉引用,并插入对段落编号的引用。
对编号项目的交叉引用看起来像“_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
但是您可以使用隐藏书签窗口删除隐藏书签,并且该书签所附加的段落不会发生任何变化。
我完全困惑了。