【发布时间】:2020-04-17 19:33:36
【问题描述】:
我正在尝试在某些 VBA 代码中使用 Word 中目录对象右侧的页码。我可以使用GetCrossReferenceItems(wdRefTypeHeading) 访问存储与这些页码关联的文本的数组,但似乎无法获取页码本身。 here 列出的 GetCrossReferenceItems 常量似乎都不相关。
有没有办法引用这些页码?谢谢!
【问题讨论】:
我正在尝试在某些 VBA 代码中使用 Word 中目录对象右侧的页码。我可以使用GetCrossReferenceItems(wdRefTypeHeading) 访问存储与这些页码关联的文本的数组,但似乎无法获取页码本身。 here 列出的 GetCrossReferenceItems 常量似乎都不相关。
有没有办法引用这些页码?谢谢!
【问题讨论】:
我不是“言辞者”,所以这是我想出的:
Function GetPagesNumber(doc As Document) As Long()
Dim i As Long
Dim myRng As Range
Dim myHeadings As Variant
With doc
Set myRng = .Content
myRng.Collapse Direction:=wdCollapseEnd
myHeadings = .GetCrossReferenceItems(wdRefTypeHeading)
ReDim pages(1 To UBound(myHeadings)) As Long
For i = 1 To UBound(myHeadings)
myRng.InsertCrossReference ReferenceType:=wdRefTypeHeading, ReferenceKind:=wdPageNumber, ReferenceItem:=i
With .Paragraphs(ActiveDocument.Paragraphs.count).Range
myRng.SetRange Start:=.Start, End:=.End - 1
End With
pages(i) = CLng(myRng.Text)
Next i
End With
myRng.Delete
GetPagesNumber = pages
End Function
用法如下:
Option Explicit
Sub main()
Dim myPagesNumber() As Long
myPagesNumber = GetPagesNumber(ActiveDocument) '<-- store index pages numbers in myPagesNumber
End Sub
【讨论】:
而不是使用;
myHeadings = .GetCrossReferenceItems(wdRefTypeHeading)
你也可以用;
Dim myField As Field
Set myField = ActiveDocument.TablesOfContents(1).Range.Fields(1)
myHeadings = Split(myField.Result.Text, Chr(13))
这将返回一个字符串数组,数组的最后一个字符内包含标题的页码。使用pgnr = CInt(Right(myHeadings (i), Len(myHeadings (i)) - InStrRev(myHeadings (i), Chr(9)))) 获取页码。
最好先将myHeadings拆分成行,以Chr(13)为分隔符再拆分成以Chr(9)为分隔符的列。
所以整个目录在一个数组中。
【讨论】: