Connection wird nicht getrennt

05/11/2007 - 09:58 von Mark Sudau | Report spam
Hallo zusammen,

leider konnte mir bei dem folgenden Problem in der Datenbank Newsgroup
niemand weiterhelfen. Vielleicht hat hier jemand eine Idee.

Es soll aus den Daten der Access Datenbank eine Excel Tabelle mit
mehreren Tabellenblàttern erstellt werden. Der Einfachheit halber
wurde ein Template erstellt, in das die Daten an den entsprechenden
Stellen eingetragen werden und am Ende mit einem SaveAs gespeichert
werden.

Das befüllen des Templates funktioniert einwandfrei. Mein Problem ist
der Schluss. Es ist egal, ob ich Excel aus Access schließe, oder die
Excel Tabelle anzeige und durch den Benutzer schließen lasse. Wenn die
Tabelle geschlossen wird ist die Excel Instanz im Task Manager immer
noch vorhanden. Wenn ich Access schließe, verschwindet auch die Excel
Instanz im Taskmanager. Daraus folgere ich, dass Access immer noch
eine Verbindung zu der geöffneten Instanz hat.

Wàre toll wenn hier jemand eine Antwort hàtte.


Hier mal ein Code Auszug:

'
=' Es gibt mehrere createSheet Prozeduren, die sich im Inhalt des
Resultset der Abfragen unterscheiden und
' damit ebenfalls die Daten in unterschiedlichen Tabellenblàttern an
unterschiedlichen Zellen eintràgt. Das
' Handling mit dem Workbook und dem ActiveSheet ist überall identisch
'
=Public Sub createSheet1(ByRef workbook As Excel.workbook)

On Error GoTo error_handling

Const startRow = 9

Dim currentRow As Integer
currentRow = startRow

Dim rs As Recordset
Set rs = DBEngine(0)(SES_INPUT_STR).OpenRecordset("qry_test")
rs.filter = "consumer_protocol=" & p_id
Set rs = rs.OpenRecordset

Debug.Print rs.RecordCount


If rs.RecordCount = 0 Then
Exit Sub
End If

workbook.Sheets(TEST).activate


With rs
.MoveFirst

While Not .EOF

' Werte aus der Datenbank
ActiveSheet.Cells(currentRow, "D")
= .Fields("ill_count")
ActiveSheet.Cells(currentRow, "E")
= .Fields("location")
ActiveSheet.Cells(currentRow, "F")
= .Fields("location_name")

' Stunden
Dim period As Integer
period = .Fields("ill_period")

currentRow = currentRow + 1
.MoveNext

If Not .EOF Then
Dim rangeStr As String
rangeStr = "A" & currentRow - 1 & ":O" &
currentRow - 1
ActiveSheet.range(rangeStr).Select
Selection.Copy
ActiveSheet.range("A" & currentRow).Select
Selection.Insert Shift:=xlDown
End If
Wend

End With

Set ActiveSheet = Nothing
Set workbook = Nothing

Exit Sub

error_handling:
Debug.Print Err.Number & ": " & Err.Description
Resume Next

End Sub

... (weitere Subs, die àhnlich aufgebaut sind und sich nur in der Art
und Positionierung der Daten unterscheiden) ...

'
=' Wird aus der Oberflàche per On_Click und aus einer Test Funktion
aufgerufen !
'
=Public Sub xLSCreation()

Dim xlsObject As Object
Dim customerName As String

Set xlsObject = New Excel.Application

On Error GoTo error

' protokoll-ID für den Filter
p_id = getCurrentProtocol.getProtocolId

With xlsObject

.Workbooks.Open("c:\Auswertung.xls").activate
.Visible = True

Call createSheet1(.ActiveWorkbook)
Call createSheet2(.ActiveWorkbook)
Call createSheet3(.ActiveWorkbook)
Call createSheet4(.ActiveWorkbook)
Call createSheet5(.ActiveWorkbook)

Dim filename As String
filename = getCurrentProtocol.getCustomer.getId
filename = filename & "_" &
getCurrentProtocol.getCustomer.getName
filename = filename & "_" &
Year(getCurrentProtocol.getProtocolDate)
filename = filename & "-" &
Month(getCurrentProtocol.getProtocolDate)
filename = filename & "-" &
Day(getCurrentProtocol.getProtocolDate)

.ActiveWorkbook.Application.CutCopyMode = False
.ActiveWorkbook.SaveAs (filename & ".xls")

End With

Set xlsObject.ActiveWorkbook.ActiveSheet = Nothing
Set xlsObject.ActiveWindow = Nothing
Set xlsObject.ActiveWorkbook = Nothing
Set xlsObject = Nothing

Exit Sub

error:
Debug.Print Err.Number & ": " & Err.Description
Resume Next

End Sub

'
=' test prozedur in einem globalen Modul
'
=Public Sub test_Export()

setCurrentProtocol (2)
Dim export As SES_XLS_Export
Set export = New SES_XLS_Export
export.xLSCreation
Set export = Nothing

End Sub
 

Lesen sie die antworten

#1 Hartwig Constien
05/11/2007 - 17:44 | Warnen spam
Hallo Mark,

...
Das befüllen des Templates funktioniert einwandfrei. Mein Problem ist
der Schluss. Es ist egal, ob ich Excel aus Access schließe, oder die
Excel Tabelle anzeige und durch den Benutzer schließen lasse. Wenn die
Tabelle geschlossen wird ist die Excel Instanz im Task Manager immer
noch vorhanden. Wenn ich Access schließe, verschwindet auch die Excel
Instanz im Taskmanager. Daraus folgere ich, dass Access immer noch
eine Verbindung zu der geöffneten Instanz hat.


...
Public Sub createSheet1(ByRef workbook As Excel.workbook)


...
Set workbook = Nothing



Wenn Du der Sub ein Worksbook als Referenz übergibst, "gehört" es sich nicht,
dass die Sub dann von sich aus versucht, das Workbook an der Quelle zu
zerstören.
Das sollte schon der Aufrufer der Sub selber machen. (Hat aber nichts mit
Deinem Problem zu tun)

Public Sub xLSCreation()
Dim xlsObject As Object
Set xlsObject = New Excel.Application


...
Set xlsObject = Nothing



Wie wàre es denn, wenn Du vorher noch die Quit-Methode des Excel-Objektes
aufrufst?

Meines Wissen hàngen Excel-Instanzen nicht so sehr am Leben wie Word-Objekte,
denen man nur beikommen kann, in dem man das Objekt in eine Klasse kapselt
und
nach (vergeblichem) Quit die Klasse terminiert.

Hang loose, Hartwig

Ähnliche fragen