在MS-Access VBA代码中取消了Openform操作

时间:2009-02-24 10:20:23

标签: ms-access vba access-vba

我支持过去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的一些更新可能会给这段代码带来麻烦。

过去几周有没有人遇到过这个错误?请让我知道我们还能做些什么才能让这项工作重新开始。

5 个答案:

答案 0 :(得分:2)

这个帖子很老但我遇到了同样的错误,花了几个小时寻找答案。我能够在一段时间后找到原因并想到发布我的答案,因为它可能会帮助处于类似情况的人。使用Access Forms创建应用程序对我来说是新的,因此错误消息不直接直观。

我的表单是主表数据输入表单,并使用按钮({{1}配置为Pop-upModal 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事件中使用相同类型的代码,则执行此操作特别有用。在这种情况下,将它移出表单模块是明智的选择,唯一的问题是你是将它放在常规模块中还是在独立的类模块中(正如我所建议的那样)。

无论如何,也许这一点都没有,但它可能会给你一些想法。