64位Excel 365崩溃,32位Excel 365正常工作

64位Excel 365崩溃,32位Excel 365正常工作,excel,vba,32bit-64bit,Excel,Vba,32bit 64bit,我有一个问题与32位和64位版本的Excel和VBA之间的差异有关 我在64位的Office 365中工作。(我使用64位是因为我遇到了内存问题,作为测试,我想看看64位是否适用于我们公司)。我正在处理一个Excel文件,其中包含大量VBA代码,用于从SQL收集产品属性,从这些属性计算参数,并将所有内容输出到另一个SQL数据库。此外,Excel文件还输出PDF文件 Excel文件存储为模板,以便用户可以打开模板并将新文件保存到各自的工作区。目前,用户正在使用32位的Office 365 当我打开

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

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

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

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

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

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


你建议我到哪里去找问题?

你当然是绝对正确的。我回到了上一个工作版本,开始添加一个文本日志文件,它将记录每个过程的开始和结束。我很幸运,因为在我这么做的时候,文件崩溃了,日志文件向我指出了一个似乎正在运行的过程,直到满足崩溃的正确条件

过程本身访问未初始化的全局变量。我没有捕捉到可能正确发生的错误。出于某些原因,这在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

你当然是对的。我回到了上一个工作版本,开始添加一个文本日志文件,它将记录每个过程的开始和结束。我很幸运,因为在我这么做的时候,文件崩溃了,日志文件向我指出了一个似乎正在运行的过程,直到满足崩溃的正确条件

过程本身访问未初始化的全局变量。我没有捕捉到可能正确发生的错误。出于某些原因,这在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
“我很想把它排除在罪魁祸首之外”——为什么?若添加它导致Excel崩溃,那个么它可能是罪魁祸首(或者它与其他已经添加的模块发生冲突)。如果您在不同的Order中添加模块,并且在添加其他模块后发生崩溃,那么很可能表示该模块无罪。Re“我试图将其排除在罪魁祸首之外”-为什么?若添加它导致Excel崩溃,那个么它可能是罪魁祸首(或者它与其他已经添加的模块发生冲突)。若你们在不同的oreder中添加了模块,并且在添加了其他模块后发生了崩溃,那个么这个模块很可能是无罪的。