我支持过去3年运行的应用程序。它完全在MS Access中开发并用VBA编写。
突然,应用程序面临上述错误:
DoCmd.OpenForm FormName:="frmNewPeerGroup", View:=acNormal, windowmode:=acWindowNormal, OpenArgs:=5
FrmNewPeerGroup代码
Private Sub Form_Open(Cancel As Integer) Dim lDept As Long, lDiv As Long lType = OpenArgs 'Supplied by caller lAssmtVer = 1 'Current sName = "" sDescription = "" dtCreatedDate = Format(Now(), "dd/mm/yyyy") sCreatedBy = UCase(userPerms.NTLoginName) lSupervisorID = userPerms.userID lTeam = 0 With cmbBxType .RowSourceType = "Value List" .RowSource = GetValueListDict(pgType) .Value = lType .Enabled = (OpenArgs = 1) End With With cmbBxVersion .RowSourceType = "Value List" .RowSource = GetValueListDict(pgAssmtType) .Value = lAssmtVer End With mgLogoDesc.Visible = False txtBxCreatedDate.Value = dtCreatedDate txtBxCreatedBy.Value = sCreatedBy If OpenArgs = 5 Then lTeam = oActiveAssmt.TeamID lDept = GetParentID(aTeams(), CInt(lTeam)) lDiv = GetParentID(aDepts(), CInt(lDept)) With cmbBxDivision .RowSourceType = "Value List" .RowSource = GetValueListArray(aDivs()) .Value = lDiv .Enabled = False End With With cmbBxDepartment .RowSourceType = "Value List" .RowSource = GetValueListArray(aDepts()) .Value = lDept .Enabled = False End With With cmbBxTeam .RowSourceType = "Value List" .RowSource = GetValueListArray(aTeams()) .Value = lTeam .Enabled = False End With Else With cmbBxDivision .RowSourceType = "Value List" .RowSource = GetValueListArray(aDivs()) .Enabled = False End With cmbBxDepartment.Enabled = False cmbBxTeam.Enabled = False End If End Sub
DoCmd.OpenForm
命令的许多实例都在消息框中显示错误:
The expression On Click you entered as the event property setting produced the following error: The OpenForm action was canceled. - The expression may not result in the name of macro, the name of a user-defined function, or [Event procedure]. - There may have been an error evaluating the function, event, or macro.
这是我收到的错误消息。
我的问题是,相同的代码运行了大约3年,但突然对Microsoft或Office的一些更新可能会给这段代码带来麻烦。
过去几周有没有人遇到过这个错误?请让我知道我们还能做些什么才能让这项工作重新开始。
答案 0 :(得分:2)
这个帖子很老但我遇到了同样的错误,花了几个小时寻找答案。我能够在一段时间后找到原因并想到发布我的答案,因为它可能会帮助处于类似情况的人。使用Access Forms创建应用程序对我来说是新的,因此错误消息不直接直观。
我的表单是主表数据输入表单,并使用按钮({{1}配置为Pop-up
和Modal
Me.Form.Name
作为DoCmd.OpenForm
命令中的参数发送放置在事务表单上的Combo控件旁边,以允许用户快速添加新记录。此参数值在OnClick
事件中被选中,并在稍后使用弹出窗体将数据提交到主表时刷新组合框(Form_Open(Cancel As Integer)
)。
当您激活已经打开的表单时,似乎不会发生Open事件(参考:https://msdn.microsoft.com/en-us/library/office/aa211439(v=office.11).aspx)。每次收到错误时,我的数据输入表单都在Access的“设计”视图中打开。所以我在设计模式中关闭了表单,并重复了这些步骤。还有瞧!没错!
由于我将打开多个表单,因此我现在需要测试并尝试按照上述MSDN参考链接中的建议使用Forms!<formname>.Controls!<controlname>.Requery
。
答案 1 :(得分:0)
可能是安全设置是Access吗?所有最新版本的Access都有一个安全设置对话框,您可以在其中启用(或禁用)应用程序中的宏。如果禁用宏,我认为你会得到这个错误。
答案 2 :(得分:0)
frmNewPeerGroup表单上的代码是什么?您使用的是什么版本的Access?如果是2003,则sp3会导致存在修补程序的问题。您是否尝试过反编译和/或压缩并修复?
如果您有原始mdb,请检查引用以确保它们都没有标记为MISSING。这是一个很可能的问题,因为它突然发生了。
要检查参考文献,请查看代码窗口菜单上的工具 - &gt;参考文献。
如果没有遗漏任何引用,您可以尝试单步执行表单代码,以更准确地了解错误发生的位置。
答案 3 :(得分:0)
您确定其中一个必需的引用(VBA IDE&gt; Option&gt; References)没有丢失吗?
如果您正在引用Excel / Word或外部对象,您确定对类型库的引用是正确的(如果您使用的是特定版本而不是late binding)< / p>
您是否在64位计算机上构建MDE?
答案 4 :(得分:0)
我不知道这是否有资格作为答案,但OnOpen事件中的代码依赖于许多外部函数。具体来说,代码为一堆组合框的RowSource分配值列表。我发生的直接红旗是非SQL Rowsources有一个有限的长度,在Access 97中,该限制是2048个字符(在Access 2003中,它是32,750 - 不要问我为什么它那个< / em>数字!)。
因此,我看到的直接事实是,或许数据驱动创建这些值列表的函数的长度开始超过2048个字符。
如果这是实际答案,那么你可以编写一个回调函数来返回数组中的值,它不会对返回的长度有限制。您将RowsourceType设置为回调函数的名称,并将Rowsource属性保留为空。
回调函数的一个例子可以在A97帮助中找到(虽然我在A2K3帮助中找不到相同的例子)。在A97帮助中,您通过搜索RowsourceType到达那里,然后在帮助窗口中,单击句子中的链接“您还可以使用____用户定义的函数____设置RowSourceType属性。”
要检查这一点,您只需要找出OnOpen事件中引用的每个数组从GetValueListArray()返回的字符串的长度。
向OnOpen事件添加错误处理程序可能会有所帮助,特别是考虑到该特定子代码中有很多外部依赖项。
最后,让我说它看起来像可怕的编程。在我看来,大多数应该可以使用默认属性进行设置。我还怀疑具有这种未记录的输入值对OpenArgs的这种依赖性。 “5”是什么意思? “1”是什么意思?这是在某处记录的吗?在我看来,这只是可怕的,可怕的代码。
我可能会使用独立的类模块来做这件事,因为这将根据什么做出自我记录。您将特定的命名属性设置为5,这将控制表单从类模块方法获取的内容以填充组合框。它将全部位于一个地方,您可以使用有意义的属性名称来清楚值5和1代表什么。如果在多个表单的OnOpen事件中使用相同类型的代码,则执行此操作特别有用。在这种情况下,将它移出表单模块是明智的选择,唯一的问题是你是将它放在常规模块中还是在独立的类模块中(正如我所建议的那样)。
无论如何,也许这一点都没有,但它可能会给你一些想法。