繁体   English   中英

将交叉引用链接插入表格单元格

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM