【问题标题】:64-bit Excel 365 crashes, 32-bit Excel 365 works fine64 位 Excel 365 崩溃,32 位 Excel 365 工作正常
【发布时间】:2020-09-11 22:37:01
【问题描述】:

我有一个关于 32 位和 64 位版本的 Excel 和 VBA 之间的差异的问题。

我正在使用 64 位 Office 365。 (我使用 64 位是因为我遇到了内存问题,并且作为测试,看看 64 位是否适用于我们公司)。我正在处理一个 Excel 文件,该文件有很多 VBA 代码,用于从 SQL 收集产品属性,从这些属性计算参数,并将所有内容输出到另一个 SQL 数据库。另外,Excel文件输出PDF文件。

Excel 文件存储为模板,以便用户可以打开模板并将新文件保存到各自的工作区。目前,用户正在使用 Office 365,32 位。

当我打开 Excel 模板时,Excel 会自行关闭。在计算新文件的参数之前似乎崩溃了。没有错误信息;在右下角的消息框中,我可以看到 Excel 没有进入计算阶段。

但是,当其他用户在 32 位 Excel 中打开文件时,一切正常。

我没有使用指针(没有 PtrSafe),也没有使用 LongLong 变量。 我也没有编译错误。 我目前正在重建 Excel 文件,方法是将其保存为没有宏的文件,然后复制 VBA 模块 - 另一个站点提到 VBA 代码可能已损坏。我在添加宏的过程中,再次弹出错误;我上次添加的 VBA 代码已经使用了大约一年,所以我很想将它排除为罪魁祸首。

你会建议我从哪里寻找问题?

【问题讨论】:

  • 关于“我很想将其排除为罪魁祸首”-为什么?如果添加它会导致 Excel 崩溃,那么它可能是罪魁祸首(或者它与其他一些已添加的模块发生冲突)。如果您以不同的顺序添加模块并且在添加其他模块后发生崩溃,那么可能该模块是无罪的。

标签: excel vba 32bit-64bit


【解决方案1】:

你当然是完全正确的。我已经回到上一个工作版本并开始添加一个文本日志文件,该文件将记录每个过程的开始和结束。我很幸运,因为文件在我执行此操作时崩溃了,并且日志文件将我指向一个似乎正在运行的程序,直到满足正确的条件使其崩溃为止。

过程本身访问未初始化的全局变量。我没有发现可能正确发生的错误。出于某种原因,这在 x86 Excel 中运行良好,不会在编译器或调试期间触发任何问题,但在使用足够内存时会在 x64 Excel 中崩溃。

Gekozen_Assen 是一个全局变量的名称。它是一本包含信息的字典。我曾尝试使用 .Exists 作为测试字典中所需项是否存在的方法,但如果字典根本没有初始化,这将不起作用。

错误代码:

    GetFromGlobal = ""
    If Global_Dictionary.Exists(Answer_Type) Then
        GetFromGlobal = Global_Dictionary.Item(Answer_Type)
    Else
        GetFromGlobal = "Error!"
    End If

我应该一直使用“Is Nothing”,下面的固定代码:

    If Global_Dictionary Is Nothing Then
        GetFromGlobal = "Error: Dictionary not initialized"
    Else
        If Global_Dictionary.Exists(Answer_Type) Then
            GetFromGlobal = Global_Dictionary.Item(Answer_Type)
        Else
            GetFromGlobal = "Error: Dictionary item not found"
        End If
    End If

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 2014-07-28
    • 2012-04-17
    • 1970-01-01
    • 2022-06-24
    • 2011-08-22
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多