Announcement

Collapse
No announcement yet.

Speicherverwaltung in With Blöcken

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Speicherverwaltung in With Blöcken

    Hallo,

    mir ist bei der Verwendung von With Blöcken ein unschönes VBA Verhalten aufgefallen. Vermutlich ein konzeptionelles Problem mit der Speicherverwaltung. Vielleicht kennt Ihr ja die genaue Ursache und habt eine praktikable Lösung...

    Situation:

    Ich öffne in einem Excel Makro eine Access Datenbank, führe eine Anfügeabfrage aus und beende die Datenbank anschließend. Die Abfrage wird innerhalb eins With Blocks initialisiert und ausgeführt.

    Sub AddValues()
    Dim objAccessApplication
    Dim objDatabase

    Set objAccessApplication = CreateObject("Access.Application")
    Set objDatabase = objAccessApplication.DBEngine.Workspaces(0).OpenDa tabase("c:\temp\Reports.mdb")

    With objDatabase.QueryDefs("qryAddValues")
    .Parameters(0).Value = CDate("1.1.2000")
    .Parameters(1).Value = Date

    .Execute
    End With

    objDatabase.Close
    Set objDatabase = Nothing

    objAccessApplication.Quit
    Set objDatabase = Nothing
    End Sub
    Wenn man das ganze nun schrittweise durch den Debugger laufen läst, fällt auf, daß nach "objAccessApplication.Quit" ein leeres Access Fenster erschienen ist.
    Im Normalbetrieb (ohne Debugger) verliert Excel dadurch den Fokus.
    Das Access Fenster schließt sich automatisch wenn die Prozedur durchgelaufen ist.

    Löst man das ganze ohne With Block erscheint das leere Access Fenster nicht.

    Sub AddValues2()
    Dim objAccessApplication
    Dim objDatabase
    Dim objQuery

    Set objAccessApplication = CreateObject("Access.Application")
    Set objDatabase = objAccessApplication.DBEngine.Workspaces(0).OpenDa tabase("c:\temp\Reports.mdb")

    Set objQuery = objDatabase.QueryDefs("qryAddValues")

    objQuery.Parameters(0).Value = CDate("1.1.2000")
    objQuery.Parameters(1).Value = Date
    objQuery.Execute

    Set objQuery = Nothing


    objDatabase.Close
    Set objDatabase = Nothing

    objAccessApplication.Quit
    Set objDatabase = Nothing
    End Sub
    Vermutung:

    Bei Verwendung des With Blocks speichert VBA intern eine Referenz auf die Query und gibt diese bei End With nicht wieder frei. Access kann nun mit "objAccessApplication.Quit" nicht beendet werden, da noch eine Referenz auf ein Access Objekt (die Query) im Programm gehalten wird. Die Referenz wird erst freigegeben wenn die aktuelle Prozedur verlassen wird (der Gültigkeitsbereich endet).

    Habt Ihr eine Idee, wie ich dieses Problem beseitige. Die With Blocks sind doch so praktisch
Working...
X