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

时间:2017-01-27 11:28:09

标签: excel vba excel-vba excel-formula

2天后编辑:更好的问题解释,固定的复制步骤和额外的结论;现在这也是the bigger question of how to reliably move sheets about -

的一部分

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

但是,我的工作表都定义了工作表范围的名称,并且它们在工作表之间被引用。当您执行此剪切/粘贴时,您假设所有正在移动的数据的链接将保持原样,并且名称的所有用户都将正确更新。我发现我的恐怖之处在于,Excel将会帮助我们提供帮助。在某些情况下添加并切换到工作表范围的工作表范围的重复名称。

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

  • Sheet1和Sheet 2都有一个名为"来源"在A1
  • 上设置
  • Sheet1和Sheet 2都通过公式" = Source"
  • 在B1中使用该名称
  • Sheet2还通过公式" = Sheet1!Source"
  • 引用C1中的Sheet1&...
  • 现在选择Sheet1上的所有内容,并将其粘贴到Sheet3

当您打开名称管理器时,效果是"来源" name仍然被定义为Sheet2和(现在)Sheet3上的工作表范围名称,但它仍然在Sheet1本身上定义。然而,Sheet1上的版本指向Sheet3!A1 ...单元格C1中的Sheet2&#39的公式仍然使用此重定向的Sheet1名称版本。

然而,因为我需要实际刷新'表格(因此移动内容,然后删除原文),我需要采取的下一步是:

  • 把旧的Sheet1从它的痛苦中解脱出来,
  • (此处不相关)为新表格提供旧名称

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

然而,这在我的情况下是不可接受的,因为这个工作簿范围的版本严重阻碍了我的解决方案的进一步操作,例如再次复制工作表(现在将使Excel向用户询问它需要使用哪些版本的这些名称在副本中)。我真的只想刷新&#39;这张纸,不是随着时间的推移收集了一百万个旧骨架。

我已经尝试添加名称重复数据删除代码,我将Sheet-scoped版本保留在Sheet3上并将工作簿范围内的一个cq核对。很快就要解决Sheet1的工作表范围(在所有这些之前恢复正确的名称定义)。然而,这会将Sheet2!C1中的公式转换为#NAME?,这是合乎逻辑的,因为我们只是将它使用的名称推到了它的脚下。现在我还可以添加额外的代码来扫描所有工作表上的所有公式,以便事先或之后修复公式,但这不够,因为例如数据验证列表也可以使用名称 - 这很快就变成了许多我不想拥有的专门代码。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

这也适用于数据验证来源。在图表中,据我所知,您不能使用命名引用。至于可以使用名称的其他地方,只需测试......