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.
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.
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
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
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
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
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
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