DoCmd.DeleteObject acTable-在此表单或报表上指定的记录不存在

时间:2018-08-01 20:56:08

标签: ms-access if-statement access-vba startup public

首先让我说我对Access或VBA一点都不熟悉。但是,我是IT专家,在某个时候,有人创建了一个可以做某事的MS Access数据库,现在我必须予以支持。

我们有一个数据库,该数据库在打开时会删除任何旧数据并重新运行使该应用程序正常工作的外部查询。有时,该表中退出的程序的任何状态都不存在。这导致MS Access挂在删除行上,我必须运行调试器,注释掉DoCmd.DeleteObject行,重新运行,然后取消注释该行以使用户继续他们的一天。

我想添加某种条件语句,但是根据If ... Then语句或'TableExist'类型函数,我能够在Google上执行的所有操作始终会引发我没有抛出的错误定义功能。我最好的猜测是我嵌套错误,或者我没有正确调用某种外部函数,但是正如我所说,我的VBA知识非常有限。

此代码在启动时执行:

Public Function Startup() As Integer

    DoCmd.Close acForm, "soLookup"
    DoCmd.DeleteObject acTable, "sales_order"
    DoCmd.RunSavedImportExport "Import-sales_order"
    DoCmd.OpenForm "soLookup"

End Function

它是

DoCmd.DeleteObject acTable, "sales_order"

导致故障的行。

我已经根据发现的几个例子尝试进行了几次重组,但是下面只涉及一个

Public Function Startup() As Integer

    DoCmd.Close acForm, "soLookup"
    If TableExists("sales_orders") Then
      DoCmd.DeleteObject acTable, "sales_orders"
    Else    
      'Do nothing
    End If 
    DoCmd.RunSavedImportExport "Import-sales_order"
    DoCmd.OpenForm "soLookup"

End Function

除了某种错误外,我似乎没有尝试给出任何结果。我要做的就是在此“启动”位中添加条件语句,该条件语句检查“ sales_order”表是否存在(如果不存在),然后检查下一条注释并忘记DoCmd.DeleteObject 。如何实现此功能?谢谢!

2 个答案:

答案 0 :(得分:2)

TableExists函数不是Access中的标准函数。您需要自己定义。

定义此类功能的主要方法有两种,一种是尝试捕获错误,另一种是遍历所有表并检查名称。

方法1(错误捕获):

Public Function TableExists(TableName As String) As Boolean
    On Error Resume Next
    TableExists = CurrentDb.TableDefs(TableName).Name = TableName
End Function

方法2(重复收集):

Public Function TableExists(TableName As String) As Boolean
    Dim td As DAO.TableDef
    For Each td In CurrentDb.TableDefs
        If td.Name = TableName Then
            TableExists = True
            Exit Function
        End If
    Next
End Function

在公共模块中定义这两个功能之一,您的最后一种方法应该可以工作

答案 1 :(得分:0)

我将改为修改查询以将源数据导入到新表中(sales_orders),该表将在查询运行时覆盖现有数据,因此我不必删除表并进行{{1 }}

enter image description here