不需要的范围名称移动怪异

2天后编辑:更好的问题解释,固定的再现步骤和额外的结论; 这现在也是如何可靠移动纸张的更大问题的一部分 –

我需要将工作表的内容移动到同一工作簿中的新工作表的内容中(请参阅此相当愚蠢的练习的背景 )。 我最初的猜测是使用sourceSheet.Cells.Cut destSheet.Cells

但是,我的工作表都具有已定义的工作表范围的名称,并且它们在工作表之间被引用。 当你做这个剪切/粘贴,你会假设所有被移动的数据的链接将保持原样,并且所有用户的名字将被正确更新。 我发现令我惊骇的是,在某些情况下,Excel将“帮助”添加并切换到工作簿范围的工作表范围名称的重复项。

手动执行时也会发生这种情况。 采取以下设置:

  • Sheet1和Sheet2都在A1上设置了一个名为“Source”的表格名称
  • Sheet1和Sheet2都通过公式“= Source”在B1中使用该名称
  • Sheet2还通过公式“Sheet1!Source”引用C1中的Sheet1的Source
  • 现在selectSheet1上的所有内容,并将其粘贴到Sheet3上

当您打开“名称pipe理器”时,效果是“源”名称仍然被定义为Sheet2和(现在)Sheet3上的工作表名称,但是它仍然在Sheet1本身上定义。 Sheet1上的版本指向Sheet3!A1 …单元格C1中的Sheet2的公式仍然使用此redirectSheet1名称版本。

然而,因为我需要实际刷新工作表(所以移动内容,然后删除原来的),我需要采取的下一步是:

  • 把旧的Sheet1摆脱它的痛苦,和
  • (在这里不相关)给新的表单的旧名称

完成这个之后,看到Sheet2仍然使用名称Sheet1!Source的Excel,显然有助于决定将其提升为工作簿范围名称“Source”,仍然指向Sheet3!A1。 C1中Sheet2的公式现在转换成=<workbook file name>!Source ; 即它现在指的是特定于工作簿的一个。

然而,在我的情况下,这是不可接受的,因为这个工作簿范围的版本严重阻碍了我的解决scheme的进一步行动,例如再次制作副本(这将使Excel向用户询问在副本中需要使用哪些版本的这些名称)。 而我真的只想“刷新”表格,而不是随着时间的推移收集它的一百万个老骨骼。

我已经尝试添加名称去重复代码,在那里我保留Sheet3范围内的版本和nuke工作簿作用域一个cq。 该工作表在即将解散Sheet1的范围内(恢复正确的名称定义,就像它们在此之前一样)。 然而,这将Sheet2!C1中的公式转换为#NAME? ,这是合乎逻辑的,因为我们只是从它的脚下推它的名字。 现在,我还可以添加额外的代码来扫描所有工作表上的所有公式,以便事先或之后修复公式,但这还不够,因为例如数据validation列表也可以使用名称 – 这很快就会变成很多专用代码, d宁可没有。

因此,似乎移动工作表的内容(与工作表本身分开)使得范围名称在该点分叉,其中叉的两个分支之后将被工作簿的不同部分使用。 换句话说混乱

有没有人有如何绕过这种不幸的情况的build议?

您的scheme不会导致我的Excel 2010上的重复。但是我也不时观察到这一点。

您可以通过代码删除全局名称(将公式结果转换为#REF!), 然后添加相同的工作表名称 。 表格上的公式会在不改变任何东西的情况下提取新名称,重新计算就足够了。

这也适用于数据validation源。 就我所知,在图表中,您不能使用命名引用。 至于其他地方的名称可以使用,只是testing…