【问题标题】:Change Link in Workbook programmatically以编程方式更改工作簿中的链接
【发布时间】:2013-07-16 14:25:22
【问题描述】:

全部,

我有以下代码来更改工作簿的链接。

ThisWorkbook.ChangeLink "OldPath.xlsx", "NewPath.xlsx", xlLinkTypeExcelLinks

我的问题是“NewPath.xlsx”代表一个工作簿,其工作表对象的名称与 OldPath.xlsx 中的名称略有不同。那么,有没有办法以编程方式不仅更改与 Excel 工作簿关联的路径,还更改实际的对象/范围引用或有问题的外部链接?

提前致谢。

【问题讨论】:

  • 仅供参考,定义名称是未来防止此问题的最佳方法,因为移动单元格或重命名工作表都没有关系。
  • 如果这些是我从一开始的工作簿,我们就不会遇到这个问题。我现在使用 OpenXML SDK 采用不同的方法,我认为它会起作用。不过,由于受到其他项目的猛烈抨击,所以目前这个项目的优先级较低。
  • 另外,要使命名范围起作用,实际上需要打开链接的工作簿以刷新数据。
  • 我忘了 - 好点。如何将工作表从 New -> Old 重命名,然后打开带有链接的书。然后你可以做任何事情:将工作表重命名为 New,或者只是更新值并关闭源书而不保存,等等......
  • 我考虑过这一点,如果我不能让所有东西都在 OpenXML 中工作,我可能最终会这样做。问题是旧文件位置不再存在,所以无论哪种方式,我至少需要使用 OpenXML 将工作簿路径更新为我可以实际进入和更改的工作簿。

标签: excel vba


【解决方案1】:

我唯一的想法是@d-stroyer 解决方案的扩展版本。您还需要替换部分公式,包括文档路径(或者如果打开了工作簿参考,则只需替换):

Cells.Replace What:="C:\Users\Name\Desktop\[OldPath.xlsx]OldSheetName", _
    Replacement:="C:\Users\Name\Desktop\[NewPath.xlsx]NewSheetName", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

不幸的是,如果您想替换其他 excel 元素中的链接,例如:一系列图表、可能是数据透视表的数据源等,这将不起作用(我认为,未经测试)。

【讨论】:

  • 你是对的。这不起作用。此外,它有点笨拙,因为我必须解析 OldPath 和 NewPath 以将文件与包含该文件的文件夹分开。
【解决方案2】:

是的,有。使用简单的 Replace 语句:

Sub UpdateSheetName()

    Cells.Replace What:="OldSheetName", Replacement:="NewSheetName", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
End Sub

如果您的工作簿有其他出现的工作表名称,并且您不希望它们被搜索捕获,请使用有限范围。此外,您可以通过搜索“OldSheetName!”进行限制。 (使用“!”)并替换为“NewSheetName!”。

【讨论】:

  • 这对使用问题中的简单代码行没有任何影响。在这两种情况下,您都会看到窗口要求确认其他来源中无法识别的工作表更改...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 2012-08-10
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多