我讨论了Excel 2007和Excel 2010 Beta中存在的错误。以下是该条目的摘要:
当报表工作簿中的Excel范围名称引用数据库工作簿中的表单范围名称时,如果先打开报表工作簿,然后再打开数据库工作簿,则Excel会删除报表工作簿在数据库工作簿中引用的所有表单范围名称。
如果您不使用工作表范围的名称,那么此建议意义不大。因此,让我们先讨论打印范围来讨论范围名称的范围...
分配打印区域时,实际上是在为工作表分配范围名称“ Print_Area”。然后,在打印工作表时,如果已定义,则Excel仅打印Print_Area范围。
这种方法在早期的Excel中非常有效,当时工作簿只能有一个工作表。但是后来,Microsoft在1993年用Excel 5引入了多页工作簿。据说,微软正在向一组
开发人员演示Excel 5的早期版本。其中一个问:“我们现在可以在一个工作簿中放几张纸。但是我们只能有一个Print_Area范围名称。那么我们如何为工作簿中的每张图纸分配一个打印区域?”
程序员挤在舞台上,故事走了,最后告诉开发人员:“我们会尽快就此与您联系。”
程序员想出的是一种限定范围名称的方法。即,Excel范围名称可以具有工作簿范围或工作表范围。若要查看它们的工作原理,假设您定义“ Foo”以引用新工作簿的第1页的某些范围。
默认情况下,这将是一个工作簿范围的名称。现在,在工作表2中,假设您将工作表的区域定义为“ Sheet2!Foo”。这样做会将范围定义为工作表范围的名称。
(新Excel中的“新名称”对话框提供了一个下拉列表框,与以前的Excel版本相比,它使您可以更轻松地指定范围。)
现在让我们看看这些名称是如何工作的……
激活图纸2.按F5键,在“转到”对话框中输入“ Foo”作为“参考”,然后按OK。Excel将为工作表2选择工作表范围的名称。
激活图纸3.再次使用GoTo对话框转到“ Foo”。这次,Excel将选择由工作簿作用域名称定义的范围,该名称参考表1。
激活图纸3.使用“转到”对话框转到“ Sheet2!Foo”。这次,Excel将选择由工作表范围名称定义的范围名称,该名称指的是工作表2。
一个工作簿中可以有一个工作簿作用域名称,但是与工作表一样多。
这使我们进入了数据库工作簿……
到目前为止,我建议在数据库工作簿中使用多个工作表。例如,您可以在名为Actual的工作表中拥有一个数据库,而在名为Target的工作表中拥有另一个数据库。
可以为这两个数据库分配工作表范围的名称Data。使用这种方法,您可以使用以下引用来引用两个范围:
= [Database.xls]实际!数据
= [Database.xls]目标!数据
在Excel 2007之前,这种方法非常有效。但是,正如我在博客条目中对Excel漏洞(与Excel 2007(可能还有Excel 2010))中所述的那样,必须在打开报表工作簿之前打开Database.xls(或Database.xlsx)。如果首先打开报表工作簿,则Excel将在数据库工作簿中找到报表工作簿所依赖的所有工作表范围的名称,然后自动删除它们。
那么,解决此错误的最佳方法是什么?
在我的博客文章中,我提供了三种选择:使用Excel 2003,先打开数据库工作簿,或者在数据库工作簿中不要使用工作表范围的名称。最后的建议似乎是最好的长期解决方案。
也就是说,当您设置数据库和报表工作簿时,请按照设置范围名称以将报表连接到Excel数据库,第1部分中的说明来设置数据库工作簿。然后,当您需要其他数据库时-用于目标或在不同的时间时间段,
或者逻辑上不同的数据,或者其他任何内容,请在单独的工作簿中创建这些数据库。
然后,当您打开报表工作簿时,可以使用“编辑链接”对话框打开所有数据库工作簿。为此……
在New Excel中,选择“数据”,“连接”,“编辑链接” ...
在Classic Excel中,选择“编辑”,“链接” ...
最后,在“编辑链接”对话框中,选择列表中的所有工作簿,然后选择“开源”。当您这样做时,Excel将打开所有这些数据库工作簿。
这是我目前听到和研究的最好建议。如果我有更好的建议或者读者这边有更好的建立,我会一直与大家讨论并研究和大家一起分享的。