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

Vba 以编程方式更新MS Word(2007)中excel对象的链接命名范围,vba,ms-word,Vba,Ms Word,第一个问题,如果这个问题已经解决了,请原谅,但我已经彻底搜索了,找不到答案: 我已将几个命名范围链接到word文档中。此word文档(以及具有命名范围的相关excel工作簿)是一个模板:用于制作这些模板(word文档和excel工作簿)的多个副本的同事 我想在word文档中包含一个命令按钮,当单击该按钮时,将更新链接命名范围的源。具体来说,我希望它将工作簿设置为与worddoc同名的源 问题是它不喜欢我输入的命名范围。我得到: 运行时错误“6083”:此文档中的对象包含指向找不到的文件的链接。链

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

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

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

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

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

但是,我已将excel文档检查了四倍,指定的范围已存在。而且,当我在word中按Alt+F9时,我清楚地看到链接包含命名范围

{LINK Excel.Sheet.8 C:\Users\Marc\Documents\WIP\u 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工作表(我不希望它这样做)。关于它不喜欢命名范围的方式/原因有什么想法吗

谢谢, 马克

更新: 在比巴迪亚的帮助下,我找到了一个解决办法;此外,我想记录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字段(链接对象,或者更严格地说,)。然后,我在预设的书签位置添加了对象。 有趣的是,正如Bibadia所指出的,关键是输入
LinkToFile:=True
代码。如果对象被嵌入,Word似乎不会接受该对象:如果我删除该行,则会出现错误
Word无法获取C:\…\document的数据!NamedRange链接。

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

ActiveDocument.Fields(1).LinkFormat.SourceFullName = filepath+name & _
"!CED" 'that is the named range
当我同时更改word文档和excel工作簿的文件名时(请参阅原始消息了解上下文),它就可以工作一次。因此,当新文件路径+名称与现有文件路径+名称不匹配时,Word VBA接受了更改。但是,一旦初始更新,如果我再次尝试运行宏,我会得到:

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

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


就像所有不知道的人(像我一样)现在都知道了。很抱歉更新时间太长,我只是想彻底了解一下。

我不能完全确定这一点,但它有点太长,无法发表评论

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

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

但是,我不认为您试图修改子集名称。因此,我们假设您已经有一个链接字段,沿着

{ 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无法连接您提供的任何子集名称(我的猜测是,在Excel引入多页工作簿之后,Word从未真正赶上Excel)


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

仍然没有运气=/。我尝试过:
ActiveDocument.InlineShapes.AddOLEObject文件名:=“完整路径”,范围:=ActiveDocument.Bookmarks(“R1”)
这给了我一个“类型不匹配”错误。我尝试了:
ActiveDocument.Bookmarks(“R1”).Range.InlineShapes.AddOLEObject文件名:=“完整路径”
这给了我“Word无法获取C:\Users…exceldoc.xlsm链接”消息的数据。(我尝试了文件名的相对路径,我尝试了绝对路径,我尝试了命名范围CED,我只尝试了工作表,所有这些都是为了排除故障。没有运气)。我使用AddOLEObjects是否错误?如果CED始终在第一张工作表上,并且其作用域是工作簿或第一张工作表,那么我不知道是什么错误。但是,对于AddOLEObject,您需要更像ActiveDocument.InlineShapes.AddOLEObject类型:=“Excel.SheetMacroEnabled.12”,文件名:=“fullpath”&“CED”,LinkToFile:=True,DisplayAsIcon:=False,Range:=Selection.Range。即,该范围是Word文档中要插入链接对象的范围