事实证明,我是个白痴(或者至少,对整个软件开发领域毫无经验)。以下是我一整天都惊慌失措的事情。我会写一个答案,详细说明我看到了什么、随后采取了什么行动以及实际发生了什么。
总结:我怎么想法我的 IDE 是如何工作的实际上工作是两件不同的事情。实际上我的代码中有一个错误,但由于我对 IDE 所告诉我的内容的解释,我认为问题要大得多。我真是个白痴,还没有实现版本控制。
我之前写过的内容:
所以,我并不是真正的系统管理员,但实际上我是公司的“IT 人员”(我们有 12 名员工)。
在昨晚 2015 年 8 月 25 日格林尼治标准时间晚上 7 点到今天早上 2015 年 8 月 26 日格林尼治标准时间上午 11 点之间的某个时间,每台计算机上的所有 vba 宏(我们运行 Excel 2010 和 Excel 2013)开始表现出一种行为,即公开声明的变量(应该对给定工作簿中的所有子例程可用)仅在声明它们的模块内可用。
这使得我们的许多宏无法运行。
我怀疑 Microsoft 的更新搞乱了 Excel,但我在网上找不到任何确认信息。此外,我们的远程桌面服务器(不会自动更新)也表现出同样的行为。任何建议都将不胜感激。
更新:最近没有 Windows 更新。这真是个坏消息,因为这意味着某些地方出了问题(可能是唯一的)。变量作用域应该是语言的一个基本组成部分。它不应该是能改变。然而,它似乎已经在整个网络上发生了改变。
答案1
发生了什么:今天早上我打开了一个宏来扩展它。我运行它来检查它是否仍然有效。它抛出了“自动化错误”。
[旁注](我始终习惯于在本地窗口中查看全局变量。在模块名称下的一个下拉选项卡中。事实证明,只有当您在查看的模块中公开声明它们时才会发生这种情况。我不知道这一点,我的新宏将所有公共变量都放在它们自己单独的模块中)[返回]
因此,我调试了代码,查看了此工作表对象抛出错误的原因,然后发现:<No Variables>
在我的本地窗口中,我的公共变量一直在那里。自然,我惊慌失措。我想该程序一定已经停止引用其他模块中的公共变量。我检查了办公室里的所有其他计算机,都是同样的情况。我疯狂地搜索互联网。没有找到任何相关信息。无奈之下,我求助于 Stack Overflow、Server Fault、Super User 和 Code Review 的聊天室。没有运气。
然后我真的慌了。我主动给微软技术支持打电话。
不用说,事情发展得如此糟糕,我放弃了。我离开了一会儿,拿着我的武士刀在我们大楼的空地板上发泄我的沮丧(实况角色扮演游戏是安全的,所以对大楼没有造成任何实际损坏)。
然后我回来,回去聊天,与更多的人交谈,尝试了更多的东西,最后发现了有关本地窗口的事情,这让我找到了代码的实际问题:
我的宏在代码中我试图引用其工作表之前关闭了一个工作簿。就是这样。
总而言之,我浪费了整整一天的工作时间来解决一个不存在的问题。
因此,下面列出了我可以做/应该做的事情,以防止这种情况发生:
版本控制:具体来说,能够将代码恢复到之前已知可以正常工作的时间点。这将立即证明我前一天的代码仍然按预期运行。
监视窗口:在 VBA IDE 中,这允许您指定变量并在整个宏中跟踪它们的状态。这会向我显示我的变量仍然存在,它仍然被引用,它只是突然在代码中的某个点被清空。
实际运行旧的宏:因为我认为本地窗口也显示了公共变量,但它们不在那里。我在其他计算机上所做的就是进入宏,看到它们不在那里,并假设最坏的情况。如果我实际上只是运行了前一天的任何宏,这个问题就可以避免了。
TDD/单元测试:几乎在我引入它的那一刻就能发现我的错误,而且肯定是在写完它的几分钟内,这就能对出了什么问题提供一个很大的提示,并在事情开始之前就阻止它。
不要惊慌:我忘记/没有尝试很多非常明显的事情,其中任何一个都会证明我的理论是错误的。相反,因为我认为我有问题,所以我只寻找可以证实它的证据,而不是寻找可以反驳它的证据。
从好的方面来看,至少我现在比今天早上聪明多了。