Supportnet Computer
Planet of Tech

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.


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)

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

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







Antwort 6 von Lamingo

Vielen Dank an alle