Supportnet / Forum / Datenbanken
Access Auflistung offener Tabellen
Frage
Wie kann ich mit VBA oder VB abfragen ob eine Tabelle in einer Access-DB (zum Lesen oder zum Entwurf) offen ist? Wie kann ich diese denn schliessen?
Vielen Dank im voraus
bguida
Antwort 1 von PotzBlitz
Hallo Lamingo,
der folgende Code durchläuft die Tabellenauflistung und prüft nach, ob eine Tabelle geöffnet ist. In diesem Fall wird sie automatisch geschlossen, Datenblattansicht und Tabellenentwurf spielen da keine Rolle.
Wird aber gerade ein Datensatz bearbeitet, dann gehen die Änderungen durch das Schliessen verloren.
Gruss
PotzBlitz
der folgende Code durchläuft die Tabellenauflistung und prüft nach, ob eine Tabelle geöffnet ist. In diesem Fall wird sie automatisch geschlossen, Datenblattansicht und Tabellenentwurf spielen da keine Rolle.
Public Sub CloseTables()
Dim dbCurrent As Database
Dim tdf As TableDef
Set dbCurrent = CurrentDb
For Each tdf In dbCurrent.TableDefs
If IsOpen(tdf.Name, acTable) = True Then
Debug.Print "Tabelle '" & tdf.Name & "' wird geschlossen."
DoCmd.Close acTable, tdf.Name
End If
Next
End Sub
Private Function IsOpen(strObjectName As String, intObjectType As Integer) As Boolean
IsOpen = (SysCmd(acSysCmdGetObjectState, intObjectType, strObjectName) And acObjStateOpen)
End Function
Wird aber gerade ein Datensatz bearbeitet, dann gehen die Änderungen durch das Schliessen verloren.
Gruss
PotzBlitz
Antwort 2 von PotzBlitz
Wenn ich den Code hier aus dem Supportnet herauskopiere, habe ich nach dem Einfügen nur eine einzige Zeile, völlig ohne Umbruch. Bin ich der einzige, der dieses Problem hat oder geht es euch auch so?
Antwort 3 von Marie
nö, das ist bei mir auch so, musst halt zeilenweise rauskopieren oder Potzblitz bitten, dass er in solchen Fällen die schöne blaue Umrandung lässt :-))
Gruß Marie
PS: aber das Beispiel existiert glaub ich auch in Deiner onlinehilfe, wenn Du es nicht unter dem Stichwort isOpen findest, dann schau mal unter ChildForm (ungeprüft, hab grade keine Zeit zum Nachsehen)
Gruß Marie
PS: aber das Beispiel existiert glaub ich auch in Deiner onlinehilfe, wenn Du es nicht unter dem Stichwort isOpen findest, dann schau mal unter ChildForm (ungeprüft, hab grade keine Zeit zum Nachsehen)
Antwort 4 von PotzBlitz
@Marie
Dann mache ich es wieder auf die altbewährte Weise. :-)
′----------------------
Public Sub CloseTables()
Dim dbCurrent As Database
Dim tdf As TableDef
Set dbCurrent = CurrentDb
For Each tdf In dbCurrent.TableDefs
If IsOpen(tdf.Name, acTable) = True Then
Debug.Print "Tabelle ′" & tdf.Name & "′ wird geschlossen."
DoCmd.Close acTable, tdf.Name
End If
Next
End Sub
Private Function IsOpen(strObjectName As String, intObjectType As Integer) As Boolean
IsOpen = (SysCmd(acSysCmdGetObjectState, intObjectType, strObjectName) And acObjStateOpen)
End Function
′----------------------
Bei dieser Kopiervorlage würde es mich brennend interessieren, ob die Hochkommas funktionieren, denn ich habe den Verdacht, dass sie nach Kopieren & Einfügen verschwinden. Davon müssten Windows NT/2000/XP-Rechnern betroffen sein, vielleicht wg. der dortigen Unicode-Schriftarten.
Der Begriff ChildForm kommt mir in Verbindung mit der Onlinehilfe auch noch irgendwie bekannt vor, da wurde vor dem Öffnen eines Formulars ja auch geprüft, ob das Formular offen ist, glaub ich. Im hiesigen Beispiel habe ich mich an acObjStateOpen erinnert, um zum gleichen Ende zu kommen.
Die SysCmd-Methode war eines der ersten VBA-Elemente, die ich kennengelernt habe. Damals hatte mein Chef mir ein Access-Projekt gezeigt, dessen Tabelleneinbindung beim Programmstart von einem Fortschrittsbalken in der Statusleiste begleitet wurde. :-)
Gruss
PotzBlitz
Dann mache ich es wieder auf die altbewährte Weise. :-)
′----------------------
Public Sub CloseTables()
Dim dbCurrent As Database
Dim tdf As TableDef
Set dbCurrent = CurrentDb
For Each tdf In dbCurrent.TableDefs
If IsOpen(tdf.Name, acTable) = True Then
Debug.Print "Tabelle ′" & tdf.Name & "′ wird geschlossen."
DoCmd.Close acTable, tdf.Name
End If
Next
End Sub
Private Function IsOpen(strObjectName As String, intObjectType As Integer) As Boolean
IsOpen = (SysCmd(acSysCmdGetObjectState, intObjectType, strObjectName) And acObjStateOpen)
End Function
′----------------------
Bei dieser Kopiervorlage würde es mich brennend interessieren, ob die Hochkommas funktionieren, denn ich habe den Verdacht, dass sie nach Kopieren & Einfügen verschwinden. Davon müssten Windows NT/2000/XP-Rechnern betroffen sein, vielleicht wg. der dortigen Unicode-Schriftarten.
Der Begriff ChildForm kommt mir in Verbindung mit der Onlinehilfe auch noch irgendwie bekannt vor, da wurde vor dem Öffnen eines Formulars ja auch geprüft, ob das Formular offen ist, glaub ich. Im hiesigen Beispiel habe ich mich an acObjStateOpen erinnert, um zum gleichen Ende zu kommen.
Die SysCmd-Methode war eines der ersten VBA-Elemente, die ich kennengelernt habe. Damals hatte mein Chef mir ein Access-Projekt gezeigt, dessen Tabelleneinbindung beim Programmstart von einem Fortschrittsbalken in der Statusleiste begleitet wurde. :-)
Gruss
PotzBlitz
Antwort 5 von Koebi
@PotzBlitz
Es ist anscheinend eine der Neuerung im SN, dass auch das Hochkomma jetzt funktioniert. Wenigstens bei mir klappt das jetzt mit dem Kopieren und Einfügen in ein Modul.
Ich frage mich jetzt auch, was eigentlich die Möglichkeit mit dem Format (Code) jetzt noch soll, ausser natürlich, dass man vom Schiff aus sieht, aha! blau! das ist jetzt ein Code.
Besten Dank totzdem für Deinen 'blauen' Code. Ich habe ihn kopiert und nach dem Einfügen an der vorgesehenen Stelle 'leer-geschlagt'.
Gruss
Köbi
Es ist anscheinend eine der Neuerung im SN, dass auch das Hochkomma jetzt funktioniert. Wenigstens bei mir klappt das jetzt mit dem Kopieren und Einfügen in ein Modul.
Ich frage mich jetzt auch, was eigentlich die Möglichkeit mit dem Format (Code) jetzt noch soll, ausser natürlich, dass man vom Schiff aus sieht, aha! blau! das ist jetzt ein Code.
Besten Dank totzdem für Deinen 'blauen' Code. Ich habe ihn kopiert und nach dem Einfügen an der vorgesehenen Stelle 'leer-geschlagt'.
Gruss
Köbi
Antwort 6 von Lamingo
Vielen Dank an alle