# Verwirrung bei GetObject und CreateObject



## pglw (31. August 2006)

Hallo,

ich muß zugeben ich bin gerade etwas verwirrt: Vielleicht schildere ich Euch mal kurz was ich mit VBA mache.

Ich habe in Powerpoint ein Makro, das ich von einem Formular aus starte. Das Makro öffnet dann aus Powerpoint heraus ein Excel-Datei, dort kopiert es ein paar Werte aus Zellen und schreibt diese in eine zweite Excel-Datei. Die Werte werden dann von der zweiten Excel in die Powerpoint-Präsentation eingefügt.

Der Weg ist also folgender: PPT - XLS- XLS- PPT

Jetzt zu meinem Problem: Teilweise läuft mein Makro tadellos, dann ist es aber wieder so, daß die Excel-Dateien nicht geöffnet bzw. angesprochen werden. Ab und zu kommt es auch vor, daß die zweite Excel zwar nach dem Makro noch existiert, aber keinerlei Worksheets mehr drin sind!

Bisher arbeite ich ausschließlich mit GetObject um an die Daten der Excel-Dateien zu kommen.

Habt ihr Erfahrung mit GetObject und Create-Object? Kommt Euch mein Problem vielleicht bekannt vor?

Bin für jede Hilfe dankbar

Grüsse
pglw


----------



## Shakie (2. September 2006)

CreateObject musst du verwenden, wenn Excel noch nicht gestartet ist. Mit GetObject kannst du auf Excel zugreifen, wenn Excel bereits läuft.
Da du nicht wissen kannst, ob Excel bereits läuft oder nicht, sollte man folgendermaßen vorgehen: zuerst GetObject ausprobieren, sollte hier der Fehler kommen, dann CreateObject verwenden:

```
Dim ExcelObjekt As Excel.Application
On Error Resume Next
        Set ExcelObjekt = GetObject(, "Excel.Application")
        If Err.Number = 429 Then
            '-->Fehler bei ActiveX-Erstellung, vermutlich ist Excel nicht gestartet!
            Err.Clear
            Set ExcelObjekt = CreateObject("Excel.Application")
            If Err.Number = 429 Then
                Err.Clear
                MsgBox "Es konnte nicht auf 'Microsoft Excel' zugegriffen werden! Vielleicht ist Excel nicht installiert!", vbExclamation, "Fehler beim Zugriff auf MS Excel"
            End If
        End If
```


----------



## pglw (2. September 2006)

Ok, den Weg finde ich echt gut. Was mir aber noch nicht ganz klar ist: 

Angenommen ich würde komplett neu anfangen, d.h. in Powerpoint den Verweis auf Excel setzen und dann Deinen Code in ein Modul einfügen. 

1.)Wo soll ich den Pfad meiner Excel-Datei eingeben?
2.)Wo muß dann der Code hin der mir den Wert einer Zelle kopiert?


Dim ExcelObjekt As Excel.Application
On Error Resume Next
        Set ExcelObjekt = GetObject(Hier?, "Excel.Application")
        If Err.Number = 429 Then
            '-->Fehler bei ActiveX-Erstellung, vermutlich ist Excel nicht gestartet!
            Err.Clear
            'Und wie ist es bei CreateObject?
            Set ExcelObjekt = CreateObject("Excel.Application")
            If Err.Number = 429 Then
                Err.Clear
                MsgBox "Es konnte nicht auf 'Microsoft Excel' zugegriffen werden! Vielleicht ist Excel nicht installiert!", vbExclamation, "Fehler beim Zugriff auf MS Excel"
            End If
        End If 
 
Danke im voraus

Grüsse
pglw


----------



## Shakie (3. September 2006)

Nachdem du dir das Excel-Application-Objekt geholt hast, brauchst du noch deine Arbeitsmappe:

```
Dim ExcelWorkbook As Excel.Workbook
Dim strPfad As String
strPfad = "C:\blabla\blubbi.xls"
Set ExcelWorkbook = ExcelObjekt.Workbooks.Open(strPfad)
```
Von dem Workbook aus kannst du auf die einzelnen Arbeitsblätter (Worksheets) zugreifen, und von dort aus auf die einzelnen Zellen.


			
				pglw hat gesagt.:
			
		

> Und wie ist es bei CreateObject?


Was meinst du damit?


----------



## pglw (3. September 2006)

Hi Shakie,

die Frage "Und wie ist es bei CreateObject?" kannst Du vergessen. Mir war nicht klar, daß der Prozess zweistufig abläuft:
Erst Excel als Application holen (je nachdem mit GetObject oder CreateObject) und dann in einem zweiten Schritt die Mappe mit WorkbookOpen.

Der Code sieht dann also so aus:

_Sub Excel()

Dim ExcelObjekt As Excel.Application
Dim ExcelWorkbook As Excel.Workbook
Dim strPfad As String

On Error Resume Next
        Set ExcelObjekt = GetObject(, "Excel.Application")
        If Err.Number = 429 Then
            '-->Fehler bei ActiveX-Erstellung, vermutlich ist Excel nicht gestartet!
            Err.Clear
            Set ExcelObjekt = CreateObject("Excel.Application")
            If Err.Number = 429 Then
                Err.Clear
                MsgBox "Es konnte nicht auf 'Microsoft Excel' zugegriffen werden! Vielleicht ist Excel nicht installiert!", vbExclamation, "Fehler beim Zugriff auf MS Excel"
            End If
        End If


strPfad = "C:\Dokumente und Einstellungen\User\Desktop\Mappe1.xls"
Set ExcelWorkbook = ExcelObjekt.Workbooks.Open(strPfad)

Zelle = ExcelWorkbook.Worksheets(1).Cells(1, 1).Value

MsgBox Zelle

End Sub

_Eine kleine Frage hätte ich aber noch für Dich: Wenn das Makro so abgelaufen ist und ich schließe manuell meine Präsentation und versuche dann manuell die Excel-Datei zu öffnen, geht das nicht. Im Taskmanager läuft Excel.exe dann auch noch als Prozess. Wenn ich ExcelWorkbook.Close einbaue, ist das Problem zwar halbwegs gelöst, doch wenn die Mappe1 vor Auslösen des Makros geöffnet war, bleibt Excel offen, nur die Mappe1 wird geschlossen. Andererseits kann man wahrscheinlich Excel als Application auch nicht schließen, da dann alle vom User geöffneten Excel-Dateien geschlossen würden oder?

Wäre nett, wenn Du mir da noch Deine Meinung dazu sagen könntest. Danke aber schonmal für die anderen Hinweise.

Grüsse
pglw


----------



## Shakie (3. September 2006)

*Wenn Excel nicht gestartet war und du es per Code startest,*
dann läuft Excel im Hintergrund, das heißt es ist nicht sichtbar.
Das Excel-Objekt hat aber die Eigenschaft "Visible", mit welcher du die Sichtbarkeit umschalten kannst:
	
	
	



```
ExcelObjekt.Visible = True / False
```

*Wenn Excel bereits gestartet und sichtbar war*,
dann sollte es auch sichtbar bleiben, wenn du per Code darauf zugreifst. Du kannst aber trotzdem nach Lust und Laune die Visible-Eigenschaft verändern.

*Warum konntest du die Excel-Datei nicht mehr manuell öffnen?*
Ganz einfach: Excel war noch am Laufen, aber eben unsichtbar. Wenn du deine Datei nun manuell öffnest, dann passiert das auch, allerdings siehst du es nicht.

Mit ExcelWorkbook.Close schließt du nur die Arbeitsmappe, nicht Excel! Excel schließt du über das Excel-Objekt mit der Quit-Methode:
	
	
	



```
Excelobjekt.Quit
```
 Sollten in irgendwelchen geöffneten Arbeitsmappen Änderungen seit dem letzten Speichern vorgenommen worden sein, so kommt die bekannte Frage "Änderungen Speichern? Ja/Nein/Abbrechen". Der User kann also noch entscheiden, ob Excel wirklich geschlossen werden soll.
Am sinnvollsten ist vermutlich, zuerst nur die Arbeitsmappen zu schließen, die dein Programm geöffnet hat. Sollten dann keine weiteren Arbeitsmappen offen sein, beendest du auch Excel.


----------



## pglw (3. September 2006)

So sehe ich das auch: Ich denke ich werde die Mappen einfach speichern und dann schließen. Dann dürfte es auch keine Probleme geben, wenn das Makro mehrfach hintereinander ausgeführt wird.

@Shakie: Vielen Dank für Deine qualifizierte Hilfe.

Beste Grüsse
pglw

PS: Du weisst nicht zufällig wie man den User im Pfad
C:\Dokumente und Einstellungen\User\Desktop\Mappe1.xls
ermitteln kann?


----------



## Shakie (4. September 2006)

Willst du den User der Windowssitzung auslesen? Das kannst du so machen:

```
AktuellerUsername = Environ("username")
```
Oder willst du den Text zwischen dem 2 und 3 Backslash aus dem Pfad ermitteln? Das kannst mit den Stringbearbeitungsfunktionen "InStr" und "Mid" machen. Einfach mal danach suchen, gibt reichlich Threads dazu.


----------



## pglw (4. September 2006)

Hey Shakie,

genau: ich wollte den User-Namen von Windows auslesen Mir war klar, daß ich den User der Office-Anwendung mit UserName auslesen kann, aber nicht wie ich den von Windows bekomme.

Danke also nochmals

Beste Grüsse
pglw


----------

