我工作的客户端最近将所有笔记本电脑升级到运行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,错误消失。