Excel 文档中的某些 DDE 公式在文件保存和重新加载时会被重写。公式的项目部分以 为前缀_xlbgnm
,例如:
=App|Topic!ABC1
更改为:
=App|Topic!_xlbgnm.ABC1
这似乎发生了:
- 仅限
.xslx
文件,旧.xls
格式不受影响 - 对于以最多 3 个字母开头并后跟数字的项目 (
[A-Za-z]{1,3}[0-9]+
)
为什么会发生这种情况?有没有办法在不改变物品的情况下避免这种情况?
答案1
这些 _xlbgnm 名称是由于将较旧的 xls 文件保存为现代格式而产生的。当您将这些文件保存为 xlsx 或 xlsm 时,它们就会被创建和它们包含的名称在现代版本的 Excel 中类似于单元格地址。
在“旧”Excel 中,允许使用像 ABC1 这样的名称,因为没有列 ABC。在现代 Excel 中,列范围可达 XFD,因此 ABC1 是有效的单元格地址,因此不允许用作范围名称。为了确保文件仍能产生正确的结果,Excel 为这些名称添加了隐藏的 _xlbgnm 范围名称。bgnm 代表 Big Grid Name。
答案2
Excel 使用各种_xl*
前缀与相对于 Excel 版本或保存文件的文件格式版本将来创建的元素结合。
最广为人知的是_xlfn
前缀。它用于打开文件的 Excel 早期版本中不存在的函数。
所以实际发生的情况是,您的项目可能存在于数据类型中,但创建方式与早期版本不同。由于方法不可用,因此无法访问,因此您会在函数前添加前缀。
我没有找到“bgnm”这四个字母的含义,所以我无法给你更深入的见解和满足感,然而,我可以说最后两个字母“nm”Name
在 Excel 的用法中是有意义的(例如,许多内置定义的名称都是用前缀构建的_xlnm
),只剩下“bg”部分阻碍你完全理解。
但是,使用您获取的特定数据类型无法解决该问题。我没有使用它们,所以我不能说,但很可能存在您可以访问的该特定数据类型的旧版本。在这种情况下,它的创建方法可能不会使用创建该数据类型的特定未来技术或工具,然后您可能永远不会再看到这种情况发生。
或者,当然,当前数据类型可能有警告该问题及其解决方法的文档。
当然,常识告诉我们,如果术语中包含“名称”,则表示特定项目名称不可用,但这并不意味着它们不存在,也不意味着数据类型不包含其中存在的项目的替代名称。因此,可能只需使用不同的名称集即可。就这么简单。
答案3
不,我并不是说 Excel 保留与该 RegEx 表达式匹配的项目名称以供将来使用。
我是说,微软似乎使用这种_xl........
类型的表达式(用一个有意义的缩写来填空,例如“_xlfn”,其中“fn”表示兼容性失败与“功能”有关)来表示兼容性失败。(此外,他们在整个 MS Office 中都这样做,因此“xl”的开头表示 Excel 问题,而不是 Word 或 Access 或 PPT 或...问题。)
这种兼容性看起来通常(并且可以理解)是“向后兼容”,因此人们可以在当前 Excel 中创建电子表格并使用ARRATOTEXT()
,将其保存为 XLSX 文件,然后启动 Excel 2003 并打开该文件。它会保留最后保存的值,直到单元格进行计算,此时它会返回错误#NAME?
。但从打开文件的那一刻起,该函数就会被加上前缀,并且会显示为: _xlfnARRAYTOTEXT(...
。
我说“可以理解”,因为微软不会(而且大多数人可能也不想)对旧版本进行更新以采用其新功能。那么,到底有多少?至少有 13 个版本在流通?实际上,这只是一个粗略的统计。我电脑上的文件结构中包含“Microsoft Office 15”,我确信我在某处看到过“16”,所以可能至少有 16 个版本,其中 15 个没有添加新功能?
然而,你的问题和我发现的一些事情表明它包括向前兼容性,即“我们过去就是用这些方法做某些事情的,现在仍然用其中的一些方法,但已经放弃了其中的一些方法,并增加了一些新的方法。”
在 XLS 文件中工作,但不在 XLS 中Xworld 暗示他们以某种方式(或多种方式)做了某件事,DDE 方面,而你所做的就是其中之一。然后某年更新后,他们放弃了这种方法(虽然不是完全放弃)。
因此,您可以按照通常的方式编写它(可能还有其他方法可以实现它,但和所有人一样,您都有默认方法),如果 Excel 认为该文件是 XLS,它会认为这是一种处理方式。因此它允许它并且一切正常。但是,如果以 XLSX 格式打开,它知道不再允许这样做,并且在打开文件时没有可用的程序分支,因此尽管编程确实存在,但它knows
根本不令人感兴趣,因为它是一个 XLSX 文件,不会使用它。
造成这种情况的原因可能有很多。我首先想到的几个原因是:
这种做法与一些新的、重要的内容相冲突,因此被广泛地融入到新代码中,如果仍然允许使用这种方法,那么确保它的每一部分以及这些部分影响的所有部分都不会中断的任务太艰巨了,所以他们编写了一小段代码来排除在 XLS**X* 文件中存在该方法时的操作。由于在 XLS 文件预计会定期使用的版本中打开时不会发生冲突,因此当源是 XLS 文件时,没有理由再编写一段代码来排除它。
该方法存在安全问题。在为新版本进行改进时,他们开始研究一种全新的格式 (XLSX),并小心地排除了该方法,从而消除了安全问题。然而,数千亿个 XLS 电子表格仍然存在,仍然需要工作。在较新的版本中也可以为它们排除该方法(不会影响旧版本,也不在乎),但这是额外的工作,可能会引起很多仇恨。所以... 不行。
所以最后,bg
中间部分是谜团。(这肯定可以指出一个原因!)。但很明显,它表明存在兼容性问题。
逻辑上说,这是通过实现 DDE 或等效方法来实现的。选择不同的方法来实现 DDE 调用或其等效功能是前进的方向。在这里,这意味着您直接执行此操作。对于其他人(可能使用)Data Type
,这意味着通过选择不同的、可能较新的(因此了解此问题后会更新)Data Type
源来间接执行此操作。
但它的作用不是无论如何,意思是,根本没有,真的不能过分强调这一点:根本没有,函数本身,尤其是它的物理表示,是问题所在。所以“ABC1”本身不是问题。调用它之前的 DDE 的方法才是问题所在。