如果存在,如何删除一个表?

9

我使用MS Access的宏和查询构建我的应用程序。我使用一些临时导入文件,需要运行一个宏或一些VBA来测试它们是否存在,如果存在,就需要删除它们。

我的表名是“TempImport1”

我通过谷歌搜索研究了一些可能有效的VBA代码。过去,我曾将VBA代码剪切/复制到按钮下面,它可以工作,但这次不行。如何将代码放入模块或单击子按钮中?

Function IsTable(sTblName As String) As Boolean
    'does table exists and work ?
    'note: finding the name in the TableDefs collection is not enough,
    '      since the backend might be invalid or missing

    On Error GoTo TrapError
    Dim x
    x = DCount("*", sTblName)
    IsTable = True
    Exit Function
TrapError:
    Debug.Print Now, sTblName, Err.Number, Err.Description
    IsTable = False

End Function

该函数只是尝试检查表是否存在。您可以这样调用它:myTest = IsTable("table_name"),此函数会尝试计算该表中记录的数量。如果该表存在,则该函数将能够进行计数,因此将返回 IsTable = True。如果不存在,则上面的错误处理将捕获错误并设置 IsTable = False。因此,您应该在代码中使用它进行测试:If isTable("yourTable") Then... do something.... Else.... do something else - Matteo NNZ
4个回答

12

首先,您应该检查表是否存在,然后尝试关闭它(如果存在)。然后,您应将警告设置为False,以便不会询问您是否确定要删除表。

在下面的示例中,您将删除 Table3If Not IsNull 的示例正在检查表是否存在:

Option Compare Database
Option Explicit

Public Sub DeleteIfExists()

    Dim tableName As String
    tableName = "Table3"

    If Not IsNull(DLookup("Name", "MSysObjects", "Name='" & tableName & "'")) Then
        DoCmd.SetWarnings False
        DoCmd.Close acTable, tableName, acSaveYes
        DoCmd.DeleteObject acTable = acDefault, tableName
        Debug.Print "Table" & tableName & "deleted..."
        DoCmd.SetWarnings True
    End If

End Sub

代码应该基本上可以运行。


我会将其分成两个函数:TableExists 和 DeleteTable。如果表不存在,DeleteTable 就没有工作要做,因此在名称中指出这一点是没有价值的。 - HackSlash
已删除带有“在DLookup中添加标准“Type = 1”。否则,即使存在仅具有相同名称的其他对象(而非表格),if子句也可能为真。”的编辑,因为如果我错误地删除了我认为是表格的对象,那么由于相同的名称,这可能是一件好事。不过,还是感谢您的编辑。 - Vityata
@HackSlash - 这可能是个品味问题,我猜(或者听了太多 Uncle Bob 的话)。无论如何,如果删除不存在的内容并关闭可能会导致错误,因此我将保持原样。 - Vityata
两者一起工作。DeleteTable会说“如果TableExists(tableName)则”。如果你的叔叔鲍勃将他的问题分解成原子部分,我会听他说的。 - HackSlash
@HackSlash - Uncle Bob就是这个人 - “Robert Cecil Martin”。正如我所说,这是一个品味问题 - 在大型项目中过度破坏代码可能不太好。这取决于最资深的开发人员和他/她读过的最后一本书。 :) 在我的情况下,我宁愿保持现状。将表名放入参数中是一个更好的想法,但那样答案的说明目的就会消失。 - Vityata

8
如果存在的话,只需使用以下函数来删除 TempImport1 表。
Function DeleteTables()

    If Not IsNull(DLookup("Name", "MSysObjects", "Name='TempImport1' AND Type = 1")) Then
    DoCmd.DeleteObject acTable, "TempImport1"
    End If

End Function

创建函数后,创建一个宏,添加运行代码的操作,然后在函数名称中键入DeleteTables()
这样,您就拥有了一个用于删除表格(如果存在)的宏。


0

检查MSysObjects(在其他答案中使用)会错误地将最近删除的表报告为存在。我发现以下测试更可靠。

Option Compare Database
Option Explicit

Public Sub DeleteIfExists()

    Dim tableName As String
    tableName = "Table3"

    On Error Resume Next
    Set td = db.TableDefs(tableName)
    If Err.Number <> 0 Then
        DoCmd.SetWarnings False
        DoCmd.Close acTable, tableName, acSaveYes
        DoCmd.DeleteObject acTable = acDefault, tableName
        Debug.Print "Table" & tableName & "deleted..."
        DoCmd.SetWarnings True
    End If

End Sub

0

这是我创建的版本,用于消除导入错误表。Err. Number 必须为0才能真正删除表格。TRACE 是我的内部标志。

Public Function RemoveImportErrorTables(Optional strTableBaseName As String = "rngExportDaily_ImportErrors") As Integer
'Purpose:
'  Remove ImportError Tables
'In:
'  Tables base Name
'Out:
'  number of tables flushed
'History:
'  Created 2021-12-06 16:10 Anton Sachs; Last modified 2021-12-06 16:15 Anton Sachs
'
  Dim intResult As Integer
  Dim strTableName As String
  Dim dbCur As Database
  Dim tdfTableDef  As TableDef
  Dim intTableIndex As Integer

  On Error GoTo RemoveImportErrorTables_Err
  
  Set dbCur = CurrentDb()
  
  For intTableIndex = 0 To 100
    If intTableIndex = 0 Then
      strTableName = strTableBaseName
    Else
      strTableName = strTableBaseName & CStr(intTableIndex)
    End If
  
    On Error Resume Next
    
    Set tdfTableDef = dbCur.TableDefs(strTableName)
    
    If Err.Number = 0 Then
      DoCmd.SetWarnings False
      DoCmd.Close acTable, strTableName, acSaveYes
      DoCmd.DeleteObject acTable = acDefault, strTableName
      DoCmd.SetWarnings True
      intResult = intResult + 1
    Else
      On Error GoTo RemoveImportErrorTables_Err
      Exit For
    End If
  
  Next intTableIndex

RemoveImportErrorTables_Exit:
  RemoveImportErrorTables = intResult
  If Not tdfTableDef Is Nothing Then
    Set tdfTableDef = Nothing
  End If
  If Not dbCur Is Nothing Then
    Set dbCur = Nothing
  End If
  Exit Function

RemoveImportErrorTables_Err:
  If TRACE = 0 Then TRACE = GetStandard("Trace")

If TRACE <> False Then
  Debug.Print "Error " & Err.Number & " " & Err.Description & " in RemoveImportErrorTables"
  Err.Clear
  If TRACE = CTR±Stop Then
    Stop
    Resume Next
  End If
Else
  Err.Clear
    Resume Next
End If

RemoveImportErrorTables_Fail:
  intResult = False
  GoTo RemoveImportErrorTables_Exit
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接