在我目前的工作中,我发现许多 Excel 文件都大得没有必要,一个只有一张工作表和一张简单表格的文件就可能超过 2 MB,而且 Excel 有时似乎非常慢。过了一段时间,我发现这些文件都包含数百个(甚至数千个)已定义的名称和/或命名范围,请参见下图的链接。删除这些文件后,文件大小会大幅缩小,性能也会提高。
我的问题是为什么会发生这种情况?这种情况是如何发生的?有趣的是,许多名称都指向旧位置,例如名为“预算 1998”(?!) 的网络文件夹。有时我会将“干净”的文件发送给同事,他们会从另一个工作簿中添加一页,然后将其发回时,名称会再次出现,文件大小会从 500kB 增加到 5MB。不知何故,他们不断通过(意外)复制这些名称来污染他们的 Excel 工作簿,这真的很奇怪。
此外,(最后的想法),名字太多了,不可能是任何人故意输入的,所以这似乎是 Excel 本身完成的,而不是用户完成的。。?
有人知道这是什么原因造成的吗?
答案1
首先,它不是病毒,不是一般意义上的病毒,也不是 Excel 病毒。与此相关的是,它不是 Excel 病毒。
其次,Excel 本身不会创建名称。Excel 当然愿意帮助人类完成这项工作,但它本身不会创建这些名称。
第三,关于宏,宏不需要在您的电子表格中才能影响它。尤其是用户个人工作簿中的宏。因此,提到宏绝对是合适的,但 a) 主题太广泛,无法在这里详细介绍,并且 b) 在许多方面不太可能直接导致这个普遍问题。然而,后一个方面……VBA 所要做的就是问一个是或否的问题,然后它就可以以非常工业化的方式继续进行,并在停止之前做 10,000 件事。因此,根据“事物”,它很可能是问题的根源。
稍后将对此进行详细介绍。
用户所要做的就是将他自己的几张写满姓名的表格复制到你的表格中,每张表格都会带上自己的姓名。如果有人(我敢打赌是真钱,不是假的网络钱)给你带来麻烦,他自己的文件中有几张或十几张自己的表格,当你的表格到达时,他将这些表格复制到你的文件中,使他自己使用你的电子表格的世界更加融洽,然后删除这些表格,除非他想得太多了,否则表格中的任何姓名都会保留下来。他为什么要这么做?世界围着他转,而不是你,所以……
但您报告文件大小也增加了。看看图片中的那些名称。它们中的每一个都可能是(让我们面对现实:是)列标签。16,384 个列标签如何变成名称?好吧,一个宏。或者... Excel 有一个选项,供用户从列标签中创建命名范围。(还有行标签,一百万个。)
假设那个想要成为大师的人添加了他的工作表,然后需要几、三十列作为命名范围,对于像他这样的精明人来说,这工作量太大了,他录制了一个快速宏,或者更糟的是,编写了一个宏,可能遵循录制的宏的行,但很可能很久以前就录制了一个宏(你知道,当时 Excel 有 256 列,而不是 16,384 列),并简单地让它为所有列创建命名范围,并且再也没有考虑过宏。所以现在……这不仅仅是愚蠢和懒惰,这是一场噩梦。
注意图片中的其他列。如果添加了工作表、命名了每列,然后删除了工作表,那么它们就是人们所看到的内容。
如果他工作时从不存钱就好了。当然,他永远不会制造麻烦,对吧?那么他为什么不应该边工作边存钱呢?精明的人就是这样做的,你知道,停电是常有的事,20 年前,电脑会锁死你。
所以我的赌注是:
- 一个人。从上面你可能已经喃喃自语他的名字了。(如果是老板,那就只好喃喃自语了,但还是需要解决。)
- 可能根本不知道他在做什么。不过,只要你提到从列中创建命名范围,他的灯可能就会亮起来。
- 删除工作表(无论是添加的,还是从他为此设置的内容中移入的)并给出那些#REF!错误。
- 实际上不会停止。他会“解决问题...”所以,是的,也许吧。
- 实际上,确实会将信息植入某些地方,比如上面 600 列和下面 30,000 行,“这样即使他忘记删除,也不会有人看到它”,当他将文件返回给您或传递给下一个人时,这些页面会保留下来。有时(通常)这就是文件大小膨胀的原因,而不是名称本身。
在这个最有可能出现的情况下,唯一真正的解决办法是找到一种方法,强迫他用你的材料在自己的草稿电子表格上工作,而不是反过来。如果他必须费力地把材料抄回来,那么,他种树、采石、冶炼矿石,用斧头、锯子、锤子和钉子做成斧头、锯子、锤子和钉子,砍伐树木,建造这艘船。你已经花了足够多的时间来处理他的烂摊子,所以他现在可以代替你做这些困难的事情了。
因为显而易见的解决方案:停下来,伙计!不会发生。而且 Excel 并非为限制他而构建,根本不是。它需要人性化的解决方案(老板、不加薪、解雇……无论他要求哪个级别)。
除了某些人“忘乎所以”的不正当工作方法,没有其他原因会导致您遇到的问题。除非是故意恶作剧,我们不会讨论这个问题。您看到的所有事情都有其可能的原因,但它们结合在一起就构成了我所描述的动物。是时候穿上林肯橙色去打猎了。
如果有人不是因为自己懒惰编写宏而成为受害者,而是手工编写宏,那么他需要被解雇,而不是被斥责,因为他将这种“思维”应用到工作的每一部分……没有哪家公司需要这样。
(我确实知道这篇文章是七年前发表的(而且每分每秒都在变老),但需要正确阅读它,以帮助在搜索“现在”时遇到它的人。不过,如果发帖人仍在阅读回复,并且一直被困扰,也许它也会对他有所帮助。)
答案2
如果您使用模板,则可以通过宏来完成。请查看代码或在个人宏工作簿,以防它自动运行
您可以在每个 WB 中运行此操作以删除所有名称
Sub test()
Dim n As Name
For Each n In ThisWorkbook.Names
n.Delete
Next
End Sub