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

时间:2013-01-02 21:53:13

标签: vba ms-access access-vba

我最近接手了一个非常古老的Access数据库。该数据库具有写入的TON宏,用户可以使用它来帮助他们导航和输入数据。因此,抛弃代码不是第1步,尽管这些宏是用Access 97编写的....

我已经设法通过删除已弃用的函数调用来使大部分代码工作,但是有一些表单仍然无法正常工作。如果我能弄清楚如何解决问题,我相信我可以解决其他问题。

主宏有一个带有几个按钮的菜单。每当我点击一个按钮,我就会收到“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非常陌生并且已经成功地摸索了我的方式,但我很难过如何解决这个问题或者问题是什么。

更新:

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

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。我不相信我可以在别处设置断点。不确定为什么会跳到错误,主窗体上的其他按钮以相同的方式编码(在主窗体上)。我尝试在第一块代码中设置一些断点(一旦假设弹出窗口的代码),但断点永远不会被捕获。我猜测永远不应该达到断点,因为如果我按下那个窗体上的一个按钮就会执行该脚本,对吗?

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

刚刚遇到同样的问题并设法修复它。

问题在于我最初通过复制另一个表单[B]来创建表单[A]。出于这个原因,[B]具有相同的recordsource(即使它不需要recordsource[A]

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

修复(对我而言)是从recordsource删除[B],因为表单不需要绑定。也就是说,对其他人的修正可能是纠正他们在开发过程中可能已经改变的recordsource或其他属性值。

答案 2 :(得分:0)

我只是在访问365上遇到了这个问题。我将数据库设置为要安装在我的客户位置。这包括删除链接表,以便可以在其网络上的客户端位置重新链接它们。

在测试accde文件时,它说OpenForm操作已取消。挠头之后,我回到了制作配件的文件。我有同样的问题。我以为这可能是我自定义的功能区,但是没有。

然后我反编译了该文件的VBA,希望得到答案,不。然后,我一起消除了功能区,并尝试直接打开表格。它说记录源不存在。我当时想,“哦,是的,我正在看它。”

然后我尝试打开记录源(在这种情况下为查询),并说找不到表。

当然。我删除了所有到数据表的链接。

答案 3 :(得分:-1)

我想你不再需要答案了(自从你问过它已经有一段时间了),但我为别人写了一个解决方案:

错误GoTo ErrorHandler

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

DoCmd.OpenQuery" query_name"

退出子

的ErrorHandler:

'插入代码来处理错误

MsgBox"查询没有运行"

继续下一步