PDA

Vollständige Version anzeigen : Excel Workbook in einer Funktion übergeben


mindhunter
19.09.2016, 09:49
Hallo,

ich möchte ein Workbook mit einem bestimmten Blatt in einer Function öffnen und, wenn vorhanden das Workbook zurückgeben. Das WKB soll unsichtbar im Hintergrnd geöffnet werden. Leider wird in dem Beispiel das Workbook nicht übergeben.



Sub GetWorkbook
Dim myWkb As Workbook
Dim sPath AsString

sPath="...xls"
myWkb = OpenWorkbook(sPath)
End Sub

Function OpenWorkbook(path As String) As Workbook
Dim objExcel As New Excel.Application
Dim objWorkbook As Workbook

Set objExcel = New Excel.Application
Set objWorkbook = objExcel.Workbooks.Open(path)

OpenWorkbook = objWorkbook

End Function

EarlFred
19.09.2016, 09:54
Hallo,

warum nutzt Du Set nicht bei allen Objektvariablen?
Option Explicit
Sub GetWorkbook()
Dim myWkb As Workbook
Dim sPath As String

sPath = "...xls"
Set myWkb = OpenWorkbook(sPath)
End Sub

Function OpenWorkbook(path As String) As Workbook
Dim objExcel As New Excel.Application
Dim objWorkbook As Workbook

Set objExcel = New Excel.Application
Set objWorkbook = objExcel.Workbooks.Open(path)

Set OpenWorkbook = objWorkbook

End Function

Denk dran, die zusätzliche Instanz auch wieder zu schließen.

Grüße
EarlFred

mindhunter
19.09.2016, 10:00
Richtig, es lag an der Set-Anweisung.

EarlFred
19.09.2016, 10:07
Denk dran, die zusätzliche Instanz auch wieder zu schließen.
...sonst hast Du bald einen ganzen Sack voll Instanzen offen.

Grüße
EarlFred

mindhunter
19.09.2016, 11:30
Okay, dann bitte noch eine Frage. Wie kann ich die Excel Instanzen schließen, wenn ich das Workbook übergebe? Muss die Instanz mit übergeben werden und dann spatter zusammen mit den WK geschlossen werden?

EarlFred
19.09.2016, 11:38
Hallo,

die Instanz ist über die Mappe bekannt (Parent der Mappe).

Option Explicit

Sub GetWorkbook()

Dim myWkb As Workbook
Dim sPath As String
Dim appTemp As Excel.Application

sPath = "C:\temp\kt.xls" '"...xls"
Set myWkb = OpenWorkbook(sPath)


'weiterer Code


Set appTemp = myWkb.Parent
myWkb.Close savechanges:=False
appTemp.Quit
Set myWkb = Nothing
Set appTemp = Nothing

End Sub

Function OpenWorkbook(path As String) As Workbook
Dim objExcel As New Excel.Application
Dim objWorkbook As Workbook

Set objExcel = New Excel.Application
Set objWorkbook = objExcel.Workbooks.Open(path)

Set OpenWorkbook = objWorkbook

End Function

Solange die Mappe die einzige offene in der Instanz ist, kannst Du die Instanz bedenkenlos schließen.

Grüße
EarlFred

mindhunter
19.09.2016, 13:11
Danke, leider bleibt die Mappe, bzw. die Tabelle offen stehen. Nach einigen Sekunden kommt die Meldung, dass das Dokument nicht mehrverfügbar ist? Die Mappe muss ich dann von Hand schließen.