如何防止旧版访问代码中的“ OpenForm操作被取消”

问题描述 投票:2回答:4

我最近接管了一个非常旧的Access数据库。该数据库具有大量的宏,用户可以利用这些宏来帮助他们导航和输入数据。因此,尽管这些宏是用Access 97编写的,但放弃代码并不是第1步。...

我已经设法通过用新的函数删除不推荐使用的函数调用来使大多数代码正常工作,但是有两种形式仍然无法正常工作。如果我能解决一个问题,那么我肯定可以解决其他问题。

主宏具有一个带有多个按钮的菜单。每当我单击一个按钮时,都会出现“ OpenForm操作被取消”错误。该按钮的代码如下:

Option Compare Database   'Use database order for string comparisons

Private Sub Form_Open(Cancel As Integer)
    If IsLoaded("ServiceCircuit") Then
        Me![PropBtn].Visible = True
    Else
        Me![PropBtn].Visible = False
    End If

End Sub

Private Sub Form_Unload(Cancel As Integer)
    If IsLoaded("ServiceCircuit") Then
        Forms![ServiceCircuit].Visible = True
        Forms![ServiceCircuit]![CircuitPrefix].Requery
        Forms![ServiceCircuit]![CircuitPrefix] = Forms![Circuit]![CircuitPrefix]
        Forms![ServiceCircuit]![CircuitBase].Requery
        Forms![ServiceCircuit]![CircuitBase] = Forms![Circuit]![CircuitBase]
        'Forms!ServiceCircuit.Refresh
        Exit Sub
    Else
        If IsLoaded("DedicatedService") Then
            Forms![DedicatedService].Visible = True
            Forms!DedicatedService.Refresh
            Exit Sub
        End If

        If IsLoaded("Property") Then
            Forms![Property].Visible = True
            Forms!Property.Refresh
            Exit Sub
        End If
    End If
End Sub

Private Sub GRC_GotFocus()
    Me![GRC].Requery

End Sub

Private Sub PropBtn_Click()
    DoCmd.Close

    If IsLoaded("ServiceCircuit") Then
        Forms![ServiceCircuit].Visible = True
        DoCmd.Close
        'Forms![ServiceCircuit]![CircuitPrefix].Requery
        'Forms![ServiceCircuit]![CircuitPrefix] = Forms![Circuit]![CircuitPrefix]
        'Forms![ServiceCircuit]![CircuitBase].Requery
        'Forms![ServiceCircuit]![CircuitBase] = Forms![Circuit]![CircuitBase]
        'Forms!ServiceCircuit.Refresh
        Exit Sub
    Else
        If IsLoaded("DedicatedService") Then
            Forms![DedicatedService].Visible = True
            DoCmd.Close
            'Forms!DedicatedService.Refresh
            Exit Sub
        End If

        If IsLoaded("Property") Then
            Forms![Property].Visible = True
            Forms!Property.Refresh
            Exit Sub
        End If
    End If

End Sub

Private Sub Tariff_NotInList(NewData As String, Response As Integer)
    dumbvar = AddRecFromCombo(NewData, "Tariff")

    '  Continue without displaying default error message.
    Response = DATA_ERRCONTINUE

End Sub

我对VB还是很陌生,并且一直在设法解决成功问题,但是我对如何解决这个问题或问题可能会感到困惑。

UPDATE:

我在主菜单表单中设置了一个断点。实际按钮的代码为:

Private Sub CircuitBtn_Click()
On Error GoTo Err_CircuitBtn_Click

    Dim DocName As String
    Dim LinkCriteria As String

    DocName = "Circuit"
    DoCmd.OpenForm DocName, , , LinkCriteria

Exit_CircuitBtn_Click:
    Exit Sub

Err_CircuitBtn_Click:
    MsgBox Err.description
    Resume Exit_CircuitBtn_Click

逐步执行DoCmd.OpenForm DocName, , , LinkCriteria代码,然后跳至Err_CircuitBtn_Click。我不相信我可以在其他地方设置断点。不确定为什么会跳转到错误,主窗体上的其他按钮以相同的方式编码(在主窗体上)。我尝试在代码的第一块中设置一些断点(一旦弹出该窗体的代码),但是断点从未被捕获。我猜应该永远都不会到达断点,因为如果我点击该表单上的按钮,那将执行脚本,对吗?

vba ms-access access-vba
4个回答
1
投票

“ OpenForm操作被取消”是当表单(“电路”)无法正确打开时出现的错误。

该代码是由向导生成的,“ Docname”和“ LinkCriteria”都是多余的。通过输入

在立即窗口中尝试
`DoCmd.OpenForm "Circuit"`

1
投票

刚刚遇到了相同的问题并设法解决。

问题是,我最初是通过复制另一个表格[B]来创建表格[A]的。因此,[B]recordsource具有相同的recordsource(即使它不需要[A])。

我已将查询重命名为表单的[A and B] recordsource。我对[A](需要一个记录源的那个)进行了更新,但是没有意识到[B]也需要一个更新。

(对于我来说,解决方法是从recordsource中删除[B],因为不需要绑定表格)。也就是说,针对他人的解决方案可能是纠正他们在开发过程中可能已更改的recordsource或其他属性值。


0
投票

我认为表格处于模式模式。在这种情况下,也许它需要先关闭表单再尝试调用它。


-1
投票

我想您不再需要答案了(自您提出以来已经有一段时间了,但是我为其他人写了一个解决方案:

出现错误时转到ToErrorHandler

'在此处插入可能会产生错误的代码

DoCmd.OpenQuery“ query_name”

退出子

的ErrorHandler:

'在此处插入代码以处理错误

MsgBox“查询未运行”

继续下一个

© www.soinside.com 2019 - 2024. All rights reserved.