Hallo. Ich möchte beim Starten meiner DB prüfen, ob alle notwendigen Tabellen vorhanden sind.
Nach sehr langer Suche habe ich für mein Problem folgende Funktion entdeckt :
Function fctTableExists(strTableSearch, strTableDelete As String) As Boolean
On Error GoTo fctTableExists_Error
Dim db As DAO.Database
Dim tdf As DAO.TableDef
Set db = CurrentDb
For Each tdf In db.TableDefs
If tdf.Name = strTableSearch Then fctTableExists = True: strTableDelete = strTableSearch: Exit For
Next
fctTableExists_Exit:
Exit Function
fctTableExists_Error:
DoCmd.SetWarnings True
MsgBox Error$
Resume fctTableExists_Exit
End Function
Diese Funktion rufe ich nun mit
If fctTableExists("PREISE01", strTableDelete) = False Then
DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12, "PREISE01", "C:\EXPORT\PREISE\PREISE01.xlsx", True
Else
If MsgBox("Es ist ein Fehler aufgetreten. Bitte überprüfen Sie, ob die Tabelle PREISE01.xlsx in C:\EXPORT vorhanden sind.", vbOKOnly, "Warnung") = vbOK Then
DoCmd.Quit
End If
End If
auf. Nun meine Frage. Gibt es eine Möglichkeit bei der Zeile :
If fctTableExists("PREISE01", strTableDelete) = False Then
Mehrere Tabellen abzufragen? Habe im Netz dazu leider nichts gefunden. Aktuell habe ich diesen Abruf 5x im Code stehen, da ich nach 5 Tabellen abfrage. Ist an sich nicht schlimm (funktioniert ja genau wie es soll). Mich interessiert nur, ob es geht.
Grundsätzlich kannst du das auch über eine Abfrage auf die Tabelle MSysObjects machen.
Da steht alles zur Tabelle drin. Ist einfacher und viel effizienter.
Um die Tabelle zu sehen, kannst du sie über Navigationsoptionen - Systemobjekte anzeigen einblenden.
LG Markus
Es gibt schon seltsame Anforderungen. Tabellen verschwinden doch nicht einfach so in einer Datenbank. Oder sind da Schelme am Werk, die unbemerkt im Backend Tabellen löschen?
Ich habe auch schon viel Müll im Internet gefunden - mit dem Unterschied, dass ich ihn nicht verwende. Systemtabellen sind halt nicht dokumentiert und könnten sich ohne Ankündigung von Version zu Version ändern. Eine Abfrage via Recordset oder DLookup dürfte auch kaum schneller als eine kleine Funktion sein. Z.B.
Function TableExists(TblName As String, _ Optional ByVal ForceDbInitialization As Boolean) As Boolean
Static db As DAO.Database
Dim tdf As DAO.TableDef
On Error Resume Next
If db Is Nothing Or ForceDbInitialization Then Set db = CurrentDb
Set tdf = db.TableDefs("TechCrunchContinentalUS")
TableExists = CBool(Err.Number = 0)
End Function
Soll so eine Funktion mehrmals hintereinander aufgerufen werden, müssen ja die Tabellennamen irgendwo hinterlegt sein und entscheiden, wie mit dem Ergebnis umgegangen wird. Eine Möglichkeit wäre:
Sub Foo() Static vTables As Variant
Dim v As Variant
If Not IsArray(vTables) Then
vTables = Array("tblA", "tblB", "tblC")
End If
For Each v In vTables
If Not TableExists(v) Then MsgBox "Tabelle '" & v & "' existiert nicht."
Next
End Sub
@Lachtaube,
ich vermute, dass der Zugriff über die Collection sogar schneller ist, als über das Recordset.
Und mit einer ziemlich hohen Wahrscheinlichkeit finden sich die Objekte in der MSysObjects in Zukunft und X statt unter Name. :-\