繁体   English   中英

以编程方式更新 MS Word 中 Excel 对象的链接命名范围 (2007)

[英]Programmatically Update Linked Named Range of excel object in MS Word (2007)

第一个问题,如果已经解决了,请原谅,但我已经彻底搜索并找不到答案:

我已将几个命名范围链接到一个 word 文档中。 这个word doc(以及相关的具有命名范围的excel工作簿)是一个模板:它是为一个同事制作的,他将制作这些模板(word doc和excel工作簿)的许多副本。

我想在 word doc 中包含一个命令按钮,单击该按钮时,将更新链接命名范围的源。 具体来说,我希望它将与 worddoc 同名的工作簿设置为源。

问题是它不喜欢我输入的命名范围。 我得到:

运行时错误“6083”:本文档中的对象包含指向无法找到的文件的链接。 链接的信息将不会更新。`

但是,我对我的 excel 文档进行了四次检查,命名范围存在。 而且,当我在 word 中按 Alt+F9 时,我清楚地看到链接包含命名范围!

{LINK Excel.Sheet.8 C:\\Users\\Marc\\Documents\\WIP_SSS.xlsm CED \\a \\p}

这是我的代码:

Public Sub ChangeSource()
Dim filename As Variant
Dim fieldcount As Integer
Dim x As Integer

filename = Left(Application.ActiveDocument.Name, Len(Application.ActiveDocument.Name) - 4) & "xlsm"
fieldcount = ActiveDocument.Fields.Count

For x = 1 To fieldcount
'Debug.Print ActiveDocument.Fields(x).Type
If ActiveDocument.Fields(x).Type = 56 Then
    ActiveDocument.Fields(x).LinkFormat.SourceFullName = ActiveDocument.Path & "\" & _
    filename & "!CED"
End If
Next x

End Sub

如果我根本不输入命名范围,宏就可以工作,但它嵌入了整个 excel 工作表(我不希望它这样做)。 关于如何/为什么不喜欢命名范围的任何想法?

谢谢,马克

更新:在 Bibadia 的帮助下,我找到了一个解决方案; 此外,我想记录 Word VBA 表现出的一些奇怪行为:

首先,解决方案代码:

Public Sub ChangeSource()
Dim filename As Variant
Dim fieldcount As Integer
Dim x As Integer

filename = ThisDocument.Path & "\" & Left(Application.ActiveDocument.Name, Len(Application.ActiveDocument.Name) - 4) & "xlsm"
fieldcount = ActiveDocument.Fields.Count
For x = 1 To fieldcount
On Error Resume Next
    If ActiveDocument.Fields(x).Type = 56 Then
        ActiveDocument.Fields(x).Delete
    End If
Next x

ActiveDocument.Bookmarks("R1").Range.InlineShapes.AddOLEObject filename:=filename & "!Range1", LinkToFile:=True
End Sub

我首先删除了所有类型为 56 的字段(链接对象,或者更专业地说, "wdfieldlinked" )。 然后,我在预设的书签位置添加了 OLEObjects。 有趣的是,正如 Bibadia 指出的,关键是输入LinkToFile:=True代码。 如果对象被嵌入,Word 似乎不会接受该对象:如果我删除该行,我会收到错误Word Cannot obtain the data for the C:\\...\\document!NamedRange link.

最后,我发现了另一种奇怪的行为:尝试简单地替换链接时,使用此代码,

ActiveDocument.Fields(1).LinkFormat.SourceFullName = filepath+name & _
"!CED" 'that is the named range

当我更改 word 文档和 excel 工作簿的文件名时,它会起作用一次(有关上下文,请参阅原始消息)。 因此,当新文件路径+名称与现有文件路径+名称不匹配时,Word VBA 接受了更改。 但是,一旦最初更新,如果我再次尝试运行宏,我会得到:

运行时错误“6083”:此文档中的对象包含指向无法找到的文件的链接。 链接的信息不会更新。

即使我将命名范围更改为同一工作表(显然是同一工作簿)中的另一个命名范围,我也会收到此错误。 因此,当文件路径+名称未更改时,Word VBA 似乎不喜欢“更新”文件路径+名称。

只是让任何不知道的人(比如我)现在都知道了。 对不起,更新太长了,我只是想彻底。

我不完全确定这一点,但评论有点太长了。

据我所知,您只能将 LinkFormat.FullSourceName 设置为文件名,而不是全名 + 子集名称,这是您在附加“!CED”时尝试执行的操作。 虽然您可以从 OleFormat.Label 读取子集名称 (CED),但您不能修改它,因为它是只读属性。

因此,如果您确实需要修改子集名称 (CED),AFAICS 唯一的方法就是删除并重新插入 LINK 字段。 如果使用 Fields.Add 重新插入,则只需指定字段的文本,这样就可以正确获取文件名和子集名称。 有点令人困惑的是,如果您使用 InlineShapes.AddOleObject 插入 LINK,您可以完全按照您在代码中尝试执行的方式指定全名+子集名称。

但是,我认为您不是尝试修改子集名称。 因此,让我们假设您已经有一个 LINK 字段

{ LINK Excel.SheetMacroEnabled.12 "the full pathname of a .xlsm file" CED \a f 0 \p }

如果路径+文件名有效(即该位置有一个 .xlsm,工作簿有一个名为 CED 的范围名称,并且范围名称在第一个工作表中,则 Word 将只能更新该链接。否则,您必须还指定一个工作表名称,例如

{ LINK Excel.SheetMacroEnabled.12 "the full pathname of a .xlsm file" Sheet2!CED \a f 0 \p }

这只是一个猜测,但如果您的代码尝试连接到 CED 定义的范围不在第一张工作表中的工作簿,您将看到您描述的错误。

此外,CED 范围名称的范围必须是“工作簿”或第一个工作表的名称。 否则,如果范围是第一个工作表但范围实际上在另一个工作表中,反之亦然,我认为 Word 无法建立连接,无论您提供什么子集名称(我的猜测是 Word 在 Excel 之后从未真正赶上 Excel引入了多页工作簿)。

如果 CED 可以引用除第一个以外的工作表,我认为您可能必须使用 Excel 对象模型来发现其范围所在的工作表,构造适当的子集名称,并删除/重新插入 LINK 字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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