如何防止Excel VBA错误:Excel.EXE[14756]中发生未处理的win32异常



我工作的客户端最近将所有笔记本电脑升级到运行windows 10(版本10.0.16299)和Office 2016的Microsoft Surface:Microsoft Excel 2016 MSO(16.0.9126.2295)64位Microsoft Office 365 ProPlus

我正在开发一个Excel VBA应用程序,该应用程序在旧笔记本电脑下运行良好,但现在开始崩溃Excel,并出现以下错误:EXCEL.EXE[14756]中发生未处理的win32异常

Excel崩溃时会显示不同的对话框消息:Microsoft Excel已停止工作Windows错误报告已停止工作

另一个论坛帖子建议查看Windows事件查看器以获取错误崩溃报告的日志。这给了我以下细节:

出现故障的应用程序名称:EXCEL.EXE,版本:16.0.9126.2295,时间戳:0x5bafc794故障模块名称:MSCOMCTL.OCX,版本:0.0.0.0,时间戳:0x5984a51c异常代码:0xc0000005故障偏移量:0x0000000000021f8f出现故障的进程ID:0x42c8故障应用程序启动时间:0x01d47124a3a41f4c出现故障的应用程序路径:C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE故障模块路径:C:\windows\system32\MSCOMCTL.OCX报告ID:74d9c093-61f0-4616-b20b-dc7f2acda9a5出现故障的程序包全名:出现故障的程序包相关应用程序ID:

我一直在使用我收集的信息搜索许多论坛以寻找解决方案,但到目前为止,这些信息都是空的。

我已经将问题隔离到一个特定的用户操作,即单击ListView控件。此控件被添加到应用程序中,以取代表单上以前的Listbox控件,从而允许在选择项目的位置将字体颜色设置为红色。由于移动到Surface笔记本电脑,此ListView控件似乎导致了冲突,从而导致Excel崩溃。我再也不能确定了。禁用ListView控件并将应用程序设置为使用ListBox控件似乎解决了此问题。

我希望这对其他人有帮助。如果有人能解释为什么Excel真的崩溃了,我会很感激,因为我只觉得我有一个变通方法,而不是修复方法。

我想知道64位v 32位驱动程序/dll文件是否存在冲突。正在使用的VBA引用包括:VBA参考标记

感谢@jkpieterse和@Cominternan的建议。

问题的原因被确定为在使用32位控件和VBA代码时迁移到Excel 2016 64位。

最后,为了防止Excel崩溃,我们不得不做出一些更改。

1) 正在删除对ListView对象的所有代码和对象引用。

2) 以下是Microsoft文章中有关确保VBA与Office 2016 64位兼容的指导原则:https://learn.microsoft.com/en-us/office/client-developer/shared/compatibility-between-the-32-bit-and-64-bit-versions-of-office

3) 我们最终联系了微软的支持人员,他们建议为了避免Excel崩溃的问题,我们在中安装一个新的注册表项

HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Excel\Options\

名称:ForceVBLoadFromSource类型:DWORD
值=1

(请参阅知识库文章:https://support.microsoft.com/en-gb/help/4011597/december-5-2017-update-for-excel-2013-kb4011597)他们解释说,这是微软推出的一个修复方案,旨在迫使Excel在64位系统上完全编译VBA,从而防止32位代码部分编译时出现问题。

显然,在应用此修复程序之前,您应该备份您的注册表并创建一个恢复点(如果您有,请与技术部门联系!)

在接到支持电话之前,我已经将崩溃点缩小到调用特定表单的时候。在此之前,VBA代码运行良好,ADODB已成功连接到SQL Server数据库并返回数据。调用该表单时,应用程序崩溃。如果我加载了不同的表单,应用程序不会崩溃,这意味着还有其他控件或代码导致编译错误或冲突。

此外,我发现如果Visual Studio编辑器窗口已经打开,则应用程序不会崩溃。我能够添加一行代码以编程方式打开VBE窗口(加上一些调整大小的代码,这样它就不会隐藏表单):

Application.VBE.MainWindow.Visible = True
With Application.VBE.MainWindow
.Width = 500
.Height = 500
End With

添加此代码后,应用程序也没有崩溃。

问题表单过于复杂,无法在没有大量开发成本的情况下重新创建。幸运的是,微软的修复程序已经解决了这个问题。

当从外接程序调用子例程时,我最近遇到了类似的崩溃问题。手动调试时,代码运行良好。我们使用的是Excel 2016,32位版本。我发现这个问题与外接程序中的未编译代码有关。在使用Debug重新编译所有代码之后->从VBA编辑器编译VBAProj,错误消失。

相关内容

  • 没有找到相关文章

最新更新