运行时错误3011,但不在调试模式下

时间:2019-10-11 15:09:39

标签: access-vba export runtime

我有正在从事的项目。我有一个导出表单代码行,可以将特定表单导出到刚创建的另一个数据库。这是导出的四件事之一:2个表,1个表单和1个按顺序排列的Autoexec宏。前两个都可以在运行时或调试模式下顺利完成。但是,表格是出现问题的地方。在调试模式下,它可以毫无问题地导出,在运行时,它会创建一个3011错误对象。

我认为这是一个时间问题,因为在导出之前,我将表单的记录源更改为我要导出的表之一,并且在两种模式下都没有问题地完成了,因此我将代码更改为我的程序开始时几乎都是出口。我更改了代码顺序,在表单编辑和导出命令之间放置了约2000行代码,但它仍然遇到问题,可以在调试中运行,而不能在运行时中运行。此后,我将代码移回了原始位置。由于接近,这不是时间问题。

这是适用的代码: 所有变量都是字符串。 CACID是一个11位数字的字符串,其中包含CAC卡的字母数字代码。

'''VBA
str_TestName - CACID & "_Test" 'Assigns a string variable to for the table created earlier-no issues
DoCmd.openForm "frm_Test", acDesign,,,, acHidden  'Opens the form hidden to modify design
Forms!frm_Test.RecordSource = str_TestName 'Sets the record source to the table created above
DoCmd.close acform, "frm_Test", acSaveYes  'Closes and saves the form edited-no issues
... SQL code to create table str_TblName, then SQL code to insert a record  'works
docmd.TransferDatabase acExport, "Microsoft Access", str_DBLocalPath, acTable, str_TableName, strTableName  'works
DoCmd.TransferDatabase acExport, "Microsoft Access", str_DBLocalPath, acTable, str_tblName, str_Tblname  'works
DoCmd.transferDatabase acExport, "Microsoft Access", str_DBLocalPath, acTable, "frm_Test", frm_test"   'works in Debug not runtime
DoCmd.TransferDatabase acExport, "Microsoft Access", str_DBLocalPath, acMacro, "Autoexec_Local", "Autoexec"

更麻烦的是,该系统是在离线系统上,因此发布代码是我重新输入该论坛的代码。

进行故障排除真的很困难,因为它可以在调试模式下编译并完美地工作,根本不引发任何错误,并且可以很好地完成整个过程。仅在运行时才会引发错误,并且该过程将在此时失败。

Internet研究表明,这是一个定时问题,因为系统很忙。他们建议在有问题的代码行之前添加DoEvents。当我这样做时,对于整个过程以及它调用的所有子过程都没有用。我删除了那些DoEvent。

其他互联网研究表明这是一个小故障,“压缩和修复”将纠正此问题。这不是紧凑和维修的问题,而是在关闭时压缩的。

我将不胜感激。 预先感谢您。 凯文

进一步测试完成。我注释掉了编辑形式为frm_Test的记录源的代码,并在调试模式下运行了它,并且工作正常(如预期的那样)。在运行时版本中运行它,并在相同的位置失败,出现相同的错误(不可预期)。我认为这是因为我在导出之前就对其进行了编辑,但事实并非如此。必须发生其他事情,但这仍然是问题。

跟进:进行了更多的测试,只要不在我的运行时环境中,打开或关闭VB窗口都不会产生任何错误。好的,我的运行时环境有: 允许禁用完整菜单, 允许禁用默认快捷菜单, 禁用Access专用键, 导航窗格已隐藏并锁定, AllowByPassKey已禁用, 显示状态栏已禁用, 启用布局视图已禁用, 在数据表中的表格中启用了设计更改

我在目标代码行的前面插入了一个MSgBox。然后出现最后一个msgBox,以指示任务已完成。因此我知道代码行何时触发并且整个过程在运行时环境中完成。

但是,在测试期间,AllowByPassKey当时未处于活动状态。 测试一重新启用“使用访问特殊键”-失败相同位置相同错误。 使用重新启用“允许默认快捷菜单”的上述行测试两个-失败相同位置相同错误。 使用上面的两行重新启用“测试三”,然后再显示状态栏-相同位置出现相同错误。 使用上面的三行测试四,重新启用“允许完整菜单”-失败相同位置相同错误。 在上面的四行重新启用“显示导航窗格”的情况下进行测试五-相同位置相同错误失败。 使用上面的五行测试六项,以重新启用数据表视图中的表的设计更改-失败相同位置相同错误。

但是,我注意到尽管我重新启用了完整菜单和导航窗格,但它们并未出现。我使用代码来防止这些东西也出现。我真的不希望导航窗格显示,我发现四个单独的命令无论如何都会触发。全部注释掉了。

DoCmd.ShowToolbar "Ribbon", acToolbarNo
DoCmd.NavigateTo "NavigationCategoryObjectType"
DoCmd.RunCommand acCmdWindowHide

用前六行测试七个,注释掉acToolbarNo行-在相同位置出现相同错误。 用前面的7行测试8个,注释掉这两行以隐藏导航窗格-相同位置失败,并出现相同错误。

好的,当我在调试模式之外测试数据库时,基本上已经重新创建了环境,并且在相同的位置出现了相同的问题。

所以现在我真的很困惑,这不是我用来运行所创建程序的运行时环境。 所以现在的问题是,在运行时模式和调试模式之间发生了什么?为什么它将在“调试”模式下运行,但在运行时无法运行。

测试9,最后八行测试,然后在后台打开VB窗口,它是打开的,但是没有提供密码来编辑代码-相同位置相同错误。 用上面的9条测试行测试10,再输入VB窗口的密码-该过程正常完成!

好的,现在我该如何解决? 10/13/2019-好的下一轮测试。我的理论是,要么该过程因该语句不正确而中断,要么不是,否则,或者理论上未记录的可运行代码行数上限。为了检验该理论,我将代码行移到SetWarnings True语句之前。我期待两个结果之一:代码继续原始语句,以某种方式证明它是语句;或者,它在代码的下一行中断,可能指向一个限制。我将所有先前的测试改回了运行时环境的原始设置。但是我不认为这是极限理论,因为我已经在其上方添加了诸如msgboxs和错误声明之类的代码行,用于我的错误处理程序,但仍然在同一位置失败。

测试11将有害的代码行向下移动。牛!有效。将代码行从字面上移6行可以使其正确完成。从字面上看是惊人的。我不知道这是如何工作的。这根本没有意义。现在,我明白了为什么这没有意义。我检查了输出数据库,那里没有frm_test表单,这次也没有引发错误。只是跳过执行?越过线,看起来就像。

测试12将有问题的代码行移动到记录源更新之后。同样,三个预期结果像以前一样执行和跳过,在此位置失败,在另一个位置失败。在此新记录记录源更改后,它以相同的错误代码3011未找到对象,就可以了。

测试13测试,以查看更改记录源是否以任何方式“锁定”或“隐藏”了表单。预期的三个结果:它在此位置失败,在另一位置失败或完成导出。确定在此位置失败,并显示相同的错误代码。因此,更改表单属性不是问题。

好的测试14我在新的外部数据库创建完成后立即将代码行移至代码执行的开始。表单属性已更新,但是该行的代码执行失败,未找到相同的错误3011对象。

测试15修复了在创建外部数据库后一切都将表单编辑和表单导出行移到开头的问题。奇怪的事情发生了,代码无法完全运行。没啥事儿。退出前忘记编译代码;我偶然创建了一个错误。

再次测试15。好吧,同样的结果,在新位置失败,并出现相同的错误3011对象。

我的检查选项用完了。显然,这是代码行,无论我将其放置在何处,都可以在运行时失败,但在调试模式下不会失败。它只能在打开和解锁VB窗口的情况下正确执行。从表面上看,打开VB窗口并提供密码只是为了将表单导出到新数据库。

好的,新策略。测试16-我将创建一个新的子程序,它所做的只是导出到外部数据库。我将在现有代码中调用该子程序。在同一位置以相同的错误代码失败。

测试17,这是一个说明,在Think中找到了问题的根源,我试图从新创建的数据库中手动导入表单。我收到一条错误消息,要求输入密码才能执行此操作。啊哈!我需要提供VBA密码,以允许导出带有vba代码的表单。

这是问题的根源,VBA拥有用于保护代码的密码,并且在不提供密码的情况下将不允许导出任何代码。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,但还没有解决,现在才完全明白为什么我不能做我想做的事情。您无法导出受密码保护的VBA程序中包含的表单。因此,我原来的问题的答案是你不能。查找其他解决方案。我的理解是该程序必须阅读该表单所附的代码,并且在有保护VBA的密码时不能这样做。