我办公室的 VBA 宏中的所有公共变量今天早上都停止工作了

Kaz*_*Kaz 7 windows-update microsoft-office microsoft-excel

事实证明,我是个白痴(或者,至少,对整个软件开发这件事毫无经验)。以下是我一整天都在恐慌的事情。我会写一个答案,详细说明我所看到的、所采取的行动以及实际发生的事情。

tl;dr:认为我的 IDE 是如何工作的以及它实际上是如何工作的,这是两件不同的事情。实际上,我的代码中有一个错误,但由于我如何解释我认为 IDE 告诉我的内容,我认为问题要大得多。我是个白痴,还没有实施版本控制。

我之前写的:

所以,我并不是真正的系统管理员,但我实际上是我公司的“IT 人员”(我们有 12 名员工)。

格林威治标准时间昨晚 2015 年 8 月 25 日晚上 7 点到格林威治标准时间 2015 年 8 月 26 日上午 11 点之间的某个时间,每台计算机上的所有 vba 宏(我们运行 Excel 2010 和 Excel 2013)开始表现出一种行为,即公开声明的变量(应该可用)给定工作簿中的所有子例程)仅在它们声明的模块中可用。

这使我们的许多宏无法运行。

我怀疑有一个 Microsoft 更新弄乱了 Excel,但我在网上找不到任何确认信息。此外,我们的远程桌面服务器(不会自动更新)也表现出相同的行为。任何建议将不胜感激。

更新:最近没有 Windows 更新。这真的是个坏消息,因为这意味着某处(可能是唯一的)错误。变量作用域应该是语言的基本组成部分。这不应该是可以改变的东西。然而,在整个网络上,它似乎是单独存在的。

Kaz*_*Kaz 5

发生什么:我今天早上打开了一个宏来扩展它。我运行它以检查它是否仍在工作。它引发了“自动化错误”。

[旁注](我一直习惯于能够在我的本地窗口中看到我的全局变量。在模块名称下的一个漂亮的下拉选项卡中。事实证明,只有当你在模块中公开声明它们时才会发生这种情况你正在查看。我不知道这一点,我的新宏在它们自己的单独模块中包含所有公共变量)[返回]

所以,我调试了我的代码,看看为什么这个工作表对象抛出错误并看到:<No Variables>在我的本地窗口中,我的公共变量总是过去的。自然而然的,我就慌了。我认为该程序必须停止引用其他模块中的公共变量。我检查了办公室里的所有其他电脑,同样的事情。我疯狂地在互联网上搜索。没有这方面的。无奈之下,我求助于 Stack Overflow 和 Server Fault 和 Super User 以及 Code Review 的聊天室。没运气。

然后我真的很恐慌。我很乐意给微软技术支持打电话。

不用说,这太糟糕了,我放弃了。离开了一会儿,用我的武士刀(LARP 安全,因此没有对建筑物造成实际损坏)在我们建筑物的空地板上消除了我的挫败感。

然后我回来,回去聊天,和更多的人交谈,尝试了更多的东西,终于找到了关于 locals 窗口的事情,这让我找到了我的代码的实际问题:

我的宏在我试图引用其工作表的代码点之前关闭工作簿。就是这样。

总而言之,我浪费了整个工作日试图解决一个不存在的问题。

所以,这里列出了我本可以做的/应该做的可以防止这种情况发生的事情:

版本控制:具体来说,能够将代码恢复到之前已知可以工作的时间点。这将立即证明我前一天的代码仍然按预期运行。

监视窗口:在 VBA IDE 中,这允许您指定变量并在整个宏中跟踪它们的状态。这会告诉我我的变量仍然存在,它仍然被引用,它只是在代码中的某个点突然被清空。

实际上运行旧的宏:因为我认为本地窗口也显示了公共变量,而它们并不存在。我在其他计算机上所做的只是进入一个宏,看到它们不在那里,然后假设最坏的情况。如果我实际上只是在一天前运行了我的任何宏,这个问题就会被避免。

TDD / 单元测试:几乎在我介绍它的那一刻就会发现我的错误,并且肯定会在编写它的几分钟内发现,这将提供一个关于出了什么问题的重要提示,并在它开始之前阻止了整个事情。

不恐慌:我忘记/没有尝试很多非常明显的事情,其中​​任何一项都会证明我的理论是错误的。相反,因为我认为我有问题,所以我只去寻找可以证实它的证据,而不是去反驳它的证据。

从好的方面来说,至少我现在比今天早上更聪明。