代码之家  ›  专栏  ›  技术社区  ›  Nathan

使用Windows Server 2012时,VBA崩溃,但没有神奇的停止

  •  0
  • Nathan  · 技术社区  · 7 年前

    我有一个带VBA的XLSM文件,是在Windows 7 Pro上用Excel 2010制作的,它在那里工作得很好,但在Windows Server 2012中运行同一个文件,它会使Excel 2010在那里崩溃,并显示一条通用错误消息

    “Microsoft Excel已停止工作”。

    但它变得更奇怪。。。

    到目前为止我试过:

    • 已验证的Excel引用在计算机之间是相同的,没有一个标记为缺失。

    • 验证没有数据库调用——有多个工作簿(一个XLSM,两个XLSX)和大量代码,但每个项目都是静态的、自包含的。

    • 用了无数次。我会解释的。

    我使用Stop来找出代码执行在哪里起作用,以及它在哪里崩溃,一次又一次地,评论起作用的和没有起作用的停止,添加新的停止,保存,直到我缩小了导致它崩溃的代码行。

    它在中断模式下崩溃在那条线上,然后它没有,然后它在运行模式下没有崩溃在那条线上。神奇的是,这些变化完全没有改变这条线。我唯一改变的是在之前和之后停下来,然后评论停下来。

    显然,我添加或删除了这行代码,而不是意外地开始执行。代码执行一直在进行,后来崩溃了,所以我又一次煞费苦心地把它缩小到了一行,然后又一次,它神奇地开始正确执行这一行,一直运行到最后。现在没有崩溃,只是因为添加和评论停止。后续运行也可以。原始Excel的备份副本仍会崩溃。

    尽管很神秘,但这会解决问题,除了。。。

    Windows Server上有大量类似的XLSM文件和它们的静态项目文件夹,每一个都不同,我不能为每一个都这样做,即使它确实说明了幽灵是如何被驱除的。

    所以我想知道,我能用VBA做些什么,这样它就不会遇到问题了吗?

    到目前为止,我为此所做的努力:

    • 添加并注释掉了在几个任意位置停留的站点(而不是花费一小时来缩小代码的精确行)。

    • 添加了一个新的空类模块。

    • 编译。

    所有这些都没有阻止它崩溃。就好像我的两个眼球集中在冒犯的那条线上是唯一的解决办法,但这毫无意义。

    设计于。。。

    Windows 7专业版 Service Pack 1 64位 微软Office Professional Plus 2010 Excel版本:14.0.7192.5000(32位)

    关于…的问题。。。

    Windows Server 2012标准 微软办公标准2010 Excel版本14.0.7128.5000(32位)

    1 回复  |  直到 4 年前
        1
  •  0
  •   Nathan    5 年前

    我在同一台服务器上已经多次遇到这种情况,更重要的是,我在另一台服务器上也多次遇到这种情况,因此这似乎完全符合运行MS Excel的服务器“喜怒无常”的已知概念。

    解决方案:

    1. 在某个任意函数的任意行中添加任意字符。
    2. 单击同一函数中的任何其他行。(如果跳过此步骤,此解决方案将失败,问题将保持不变。)
    3. 删除你添加的角色。
    4. 对需要的任意函数重复该过程。

    如何知道函数是否需要它?要想弄明白这一点很费劲,也很容易出错,但在我的情况下,我可以通过我的主潜艇,一直到它崩溃。然后,我可以重新启动Excel,进入该函数,重复跳转和崩溃,每次都深入到当前函数调用的函数,直到崩溃不再发生在该函数调用分支中。

    在我的例子中,没有一个幽灵般的错误出现在main Sub中,只出现在调用的函数中。它多种多样,但在数千行代码中,可能有5到10个幽灵点。

    在一台不同的服务器上,多年来每天都有大量用户使用,但这种情况从未发生过一次,但没有人能发现服务器之间的差异可能会首先阻止这种情况发生。