该代码将有条件地执行您想要的操作。
Sub InsertCrossRef()
Dim RefList As Variant
Dim LookUp As String
Dim Ref As String
Dim s As Integer, t As Integer
Dim i As Integer
On Error GoTo ErrExit
With Selection.Range
' discard leading blank spaces
Do While (Asc(.Text) = 32) And (.End > .Start)
.MoveStart wdCharacter
Loop
' discard trailing blank spaces, full stops and CRs
Do While ((Asc(Right(.Text, 1)) = 46) Or _
(Asc(Right(.Text, 1)) = 32) Or _
(Asc(Right(.Text, 1)) = 11) Or _
(Asc(Right(.Text, 1)) = 13)) And _
(.End > .Start)
.MoveEnd wdCharacter, -1
Loop
ErrExit:
If Len(.Text) = 0 Then
MsgBox "Please select a reference.", _
vbExclamation, "Invalid selection"
Exit Sub
End If
LookUp = .Text
End With
On Error GoTo 0
With ActiveDocument
' Use WdRefTypeHeading to retrieve Headings
RefList = .GetCrossReferenceItems(wdRefTypeNumberedItem)
For i = UBound(RefList) To 1 Step -1
Ref = Trim(RefList(i))
If InStr(1, Ref, LookUp, vbTextCompare) = 1 Then
s = InStr(2, Ref, " ")
t = InStr(2, Ref, Chr(9))
If (s = 0) Or (t = 0) Then
s = IIf(s > 0, s, t)
Else
s = IIf(s < t, s, t)
End If
If LookUp = Left(Ref, s - 1) Then Exit For
End If
Next i
If i Then
Selection.InsertCrossReference ReferenceType:="Numbered item", _
ReferenceKind:=wdNumberFullContext, _
ReferenceItem:=CStr(i), _
InsertAsHyperlink:=True, _
IncludePosition:=False, _
SeparateNumbers:=False, _
SeparatorString:=" "
Else
MsgBox "A cross reference to """ & LookUp & """ couldn't be set" & vbCr & _
"because a paragraph with that number couldn't" & vbCr & _
"be found in the document.", _
vbInformation, "Invalid cross reference"
End If
End With
End Sub
以下是条件:-
- 文档中有“编号项目”和“标题”。您要求标题。我做了编号项目,因为我的电脑上没有这种风格。然而,在我的电脑上“标题”are编号的项目。如果该代码不适用于您的文档,请更换
wdRefTypeNumberedItem
for wdRefTypeHeading
在代码中标记的行处。
- 我假设编号格式为“1”“1.1”,“1.1.1”。如果你有什么不同的话,也许是“1”。 “1.1.”、“1.1.1.”,代码需要调整。关键点是代码将查找数字后面的空格或制表符。如果后面跟着句点、右括号或破折号,则不起作用。另外,如果您碰巧选择“1.2”。 (最后一个句号)在文本中代码将忽略句号并查找引用“1.2”。请注意,代码对选择中的偶然错误不敏感。它将删除任何前导或尾随空格以及意外包含的回车符或段落标记以及句号。
该代码将用它自己的(相同)文本替换您所做的选择。这可能会导致现有格式发生更改。事实上,插入的参考字段从目标中获取文本。我不太清楚它适用哪种格式,目标的格式还是被替换的格式。如果有的话,我没有处理这个问题。
请查看代码插入的交叉引用的属性。你会看到InsertAsHyperlink
是真的。如果您愿意,可以将其设置为 False。IncludePosition
是假的。如果将此属性设置为 True,您将看到代码替换的数字中添加了“上方”或“下方”。