【问题标题】:Programmatically Update Linked Named Range of excel object in MS Word (2007)以编程方式更新 MS Word (2007) 中 excel 对象的链接命名范围
【发布时间】:2016-12-06 16:14:24
【问题描述】:

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

我已将几个命名范围链接到一个 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 似乎不喜欢“更新”文件路径+名称。

让以前不知道的人(比如我)现在都知道了。很抱歉更新了这么久,我只是想彻底。

【问题讨论】:

    标签: vba ms-word


    【解决方案1】:

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

    据我所知,您只能将 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 定义的范围在第一张表中 not 的工作簿,您会看到您描述的错误。

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

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

    【讨论】:

    • 还是没有运气=/。我试过了:ActiveDocument.InlineShapes.AddOLEObject filename:="full path", Range:=ActiveDocument.Bookmarks("R1") 这给了我一个“类型不匹配”的错误。我试过:ActiveDocument.Bookmarks("R1").Range.InlineShapes.AddOLEObject filename:="full path" 这给了我“Word 无法获取 C:\Users...exceldoc.xlsm 链接的数据”消息。 (我尝试了文件名的相对路径,我尝试了绝对路径,我尝试了命名范围 CED,我只尝试了工作表,全部进行故障排除。没有运气)。我使用 AddOLEObjects 错了吗?
    • 好吧,如果 CED 总是在第一张纸上并且它的范围是工作簿或第一张纸,那么我不知道出了什么问题。但是,对于 AddOLEObject,您将需要更多类似于 ActiveDocument.InlineShapes.AddOLEObject ClassType:= "Excel.SheetMacroEnabled.12", FileName:="fullpath" & "!CED", LinkToFile :=True, DisplayAsIcon:=False, Range: =选择。范围。即范围是 Word 文档中要插入链接对象的范围,而不是 Excel 工作簿中的范围。但是,您在尝试插入完整文件时遇到错误这一事实并不令人鼓舞。
    • 我只是想知道这里是否存在与安全相关的问题,例如.xlsm 不在受信任的位置。
    • 更新:我能够使用 `ActiveDocument.Bookmarks("R1").Range.InlineShapes.AddOLEObject filename:="full path.xlsm" 来嵌入完整的 excel 工作表!但是,它确实不喜欢命名范围。我尝试引用 sheet1 并尝试将其排除在外。
    • 在 AddOLEObject 方法调用中您肯定需要链接 LinkToFile:=True 参数。否则 Word 会尝试 Embed 对象而不是 Link 对象(对于 Embed,范围名称是不相关的)
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多