[英]Inserting a cross reference link to a table cell
如果 ReferenceItem 使用书签名称进行硬编码,则以下代码有效,但将交叉引用链接插入不正确的单元格(插入单元格(2、1)而不是单元格(2、6)。如果我使用 hlpageNo 如此处所示,那么它抛出一个错误。不知道我在这里错了什么。感谢任何支持。谢谢。
Sub setMSPageCrossRef()
Dim iRng As Word.Range
Dim cRng As Word.Range
Dim iDoc As Word.Document
Dim tableRowCount, iTableRow, rownow As Long
Dim hlPageNo As String
Set iDoc = ActiveDocument
Set iRng = iDoc.Range
iRng.Find.Text = "Failure Mode"
Do While iRng.Find.Execute(Forward:=True, Wrap:=wdFindStop) = True
Pageno = iRng.Information(wdActiveEndAdjustedPageNumber)
rowno = iRng.Information(wdEndOfRangeRowNumber)
Colno = iRng.Information(wdEndOfRangeColumnNumber)
tableRowCount = iRng.Tables(1).Range.Rows.Count
Call RemoveBlanksinTable(iRng.Tables(1).Range)
For iTableRow = rowno To tableRowCount
Set cRng = iRng.Tables(1).Cell(iTableRow + 1, 6).Range
hlPageNo = "p" & mid(cRng.Text, 1, Len(cRng.Text) - 1)
cRng.Collapse wdCollapseStart
cRng.InsertCrossReference ReferenceType:="Bookmark", ReferenceKind:= _
wdPageNumber, ReferenceItem:=hlPageNo, InsertAsHyperlink:=True, _
IncludePosition:=False, SeparateNumbers:=False, SeparatorString:=" "
Next
Loop
End Sub
问题出在这一行:
hlPageNo = "p" & mid(cRng.Text, 1, Len(cRng.Text) - 1)
应该改成这样:
hlPageNo = "p" & mid(cRng.Text, 1, Len(cRng.Text) - 2)
当 cRng 等 Word Range 设置为表格单元格的 Range 时,它始终以 2 字符序列 ChrW(13) & ChrW(7) 结尾。 删除 1 个字符只会删除 ChrW(7)。 因此 hlPageNo 将始终以 ChrW(13) 结尾,其中 (a) 不会与文档中的任何书签名称匹配,并且 (b) 在调试时不一定很明显。
使用 Word 表格单元格范围可能会令人困惑,因为不同的代码示例可能会显示未经调整使用的范围长度,或者减少了 1 甚至减少了 2,而且目前还不是很明显的原因。 例如,您可以设置单元格范围的文本,而无需处理那些额外的字符,例如
Dim r as Word.Range
Set r = ActiveDocument.Tables(1).Cell(1,1).Range
r.Text = "abc"
Set r = Nothing
没有问题。 但是,如果您想在范围中添加一个字段并尝试
Dim r as Word.Range
Set r = ActiveDocument.Tables(1).Cell(1,1).Range
r.Fields.Add r, WdFieldType.wdFieldEmpty, "QUOTE ""abc""", False
Set r = Nothing
您将收到运行时错误 4605。为避免这种情况,您必须确保 Range 不包含 ChrW(7) EndOfCell 字符,例如
Dim r as Word.Range
Set r = ActiveDocument.Tables(1).Cell(1,1).Range
r.End = r.End - 1
r.Fields.Add r, WdFieldType.wdFieldEmpty, "QUOTE ""abc""", False
Set r = Nothing
在这种情况下,如果您使用 r.End = r.End - 2 也没有什么区别。
最后,发布的代码中还有另一个不相关的问题,即 iTableRow 达到 tableRowCount 时,
iTableRow + 1
将大于表中的行数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.