如何在Word中复制对活动列表编号的引用?

时间:2015-10-21 08:19:17

标签: vba ms-word word-vba

我的文档中有很多列表,其数字看起来像“1.3.2”,我希望自动创建列表元素的交叉引用。

我正在尝试创建一个宏:

  • 检测列表元素,光标位于;
  • 创建一个列表元素的交叉引用,其中数字作为参考文本(即“1.3.2”);
  • 把它放入剪贴板;
  • 使“LCtrl + C”热键在光标位于列表编号时启动该宏(可选:仅用于具有已声明样式的列表)。

如何使用VBA实现这一目标?

2 个答案:

答案 0 :(得分:1)

在查看对象模型以及Word的行为后,我认为您可以管理某些内容,但可能并不完全符合您的设想。问题在于编号项目,它们似乎面向字幕而不是编号行...在任何情况下,当通过对话框将交叉引用插入“编号项目”时,Word会创建书签,然后参考。所以我的建议模仿了这种行为,如下面的代码片段所示。

您需要/想要做的是维护一个“计数器”来增加书签名称(或者您可以像Word那样生成GUID)。我的演示的书签名称是硬编码的。

此示例在当前选择的段落开头设置隐藏书签。然后插入交叉引用,扩展Range以包含交叉引用(因为该方法不返回范围或对象)并将其剪切到剪贴板。然后,用户可以将其粘贴到任何他想要的地方。

Sub InsertThenCopyCrossRef()
    Dim rng As word.Range, rngBkm As word.Range
    Dim bkm As word.Bookmark
    Dim sMyRef As String

    sMyRef = "_MyRef_1" 'a counter or something to make name unique!
    Set rng = Selection.Range
    Set rngBkm = rng.Duplicate.Paragraphs(1).Range
    rngBkm.Collapse wdCollapseStart
    Set bkm = ActiveDocument.Bookmarks.Add(sMyRef, rngBkm)
    rng.InsertCrossReference wdRefTypeBookmark, wdNumberFullContext, sMyRef
    rng.MoveEnd wdWord, 1
    rng.Fields(1).Cut
    'rng.Select
End Sub

答案 1 :(得分:0)

我为了它的乐趣和冗长的故事而喋喋不休:我认为你不会设法做到这一点。原因:这是用于在VBA中创建对编号项目的交叉引用的代码:

Set r = Selection.Range

r.InsertCrossReference ReferenceType:="Numbered item", _
        ReferenceKind:=wdNumberRelativeContext, ReferenceItem:="5", _
        InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, _
        SeparatorString:=" "

麻烦在于ReferenceItem:=“5”。当我录制它时,它只是第五个编号的项目,无论其列表级别如何。 因此,您现在要做的就是找到一种方法来将编号的项目识别为文档中的第n个编号项目。

如果你可以解决这个问题,你可以指定一个组合键来复制对当前列表项的引用,如下所示:

Sub CopyReference()
Dim r As Range
Dim dObject As DataObject

Set dObject = New DataObject

Set r = Selection.Range

r.InsertCrossReference ReferenceType:="Nummeriertes Element", _
        ReferenceKind:=wdNumberRelativeContext, ReferenceItem:="5", _
        InsertAsHyperlink:=True, IncludePosition:=False, SeparateNumbers:=False, _
        SeparatorString:=" "

dObject.SetText r.Paragraphs(1).Range.Fields(1).Code
r.Paragraphs(1).Range.Fields(1).Delete
dObject.PutInClipboard

End Sub

另一个关键组合来粘贴你的引用:

Sub pasteField()
Dim fld As Field, dObject As DataObject
Dim gg

Set fld = ActiveDocument.Fields.Add(Selection.Range, wdFieldRef)
Set dObject = New DataObject
dObject.GetFromClipboard
gg = dObject.GetText
fld.Code.Text = gg
fld.Update
End Sub

正如您所看到的,我实际上并没有复制交叉引用字段,只复制了它的代码。