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

时间:2016-08-01 14:21:15

标签: word-vba

首先,对不起,如果这已经解决了,但我已经彻底搜索过,找不到答案:

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

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

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

  

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

但是,我已经对我的Excel文档进行了四倍检查,命名区域存在。并且,当我在单词中按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工作簿的文件名时,它会工作一次(请参阅上下文的原始消息)。因此,当新文件路径+名称DID与现有文件路径+名称不匹配时,Word VBA接受了更改。但是,一旦最初更新,如果我再次尝试运行宏,我会得到:

  

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

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

所以任何不认识的人(比如我)现在都知道。对于长时间的更新感到抱歉,我只想彻底。

1 个答案:

答案 0 :(得分:0)

我对此并不完全确定,但评论时间太长了。

据我所知,您只能将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 }

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

{ 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对象模型来发现其Range所在的工作表,构造相应的子集名称,以及删除/重新插入LINK字段