Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Bestimmte Daten vom Formular an bestimmte Zellen an Excel übergeben

Begonnen von Lemmy2902, Mai 20, 2025, 14:03:56

⏪ vorheriges - nächstes ⏩

Knobbi38

@Hondo

ZitatAch ja, und an diejenigen gerichtet die meinen die Zeile:
If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
sei überflüssig, sollten diese doch einfach weglassen und es ausprobieren.
Den Fehler 429 könnt ihr ja dann selbst abfangen.

Schau dir doch mal selber den ganzen Quellcode an. Wenn in der Zeile davor CreateObject() einen Fehler 429 bringt, dann kann wird in dieser Zeile mit großer Wahrscheinlichkeit CreateObject() wieder den gleichen Fehler melden, oder?

Möglicherweise sollte man es erst mit GetObject() probieren und im Fehlerfall mit CreateObject() alternativ einer neue Instanz erzeugen? Aber auch nach CreateObject() sollte man die Referenz auf Nothing prüfen.

Beim Beenden der Automation kann man dann noch checken, ob eine neue Instanz erzeugt worden ist, oder eine vorhandene genutzt wird. Ich glaube der Anwender wäre nicht erbaut davon, wenn der Export die aktuelle Excel Instanz jedes mal schließt. Am Schluß ist es zudem wirklich wichtig, alle benötigten Referenzen in der umgekehrten Reihenfolge auf Nothing zu setzen, damit es mit der Automation keine sporadischen Probleme gibt.

Nur mal so ...

Gruß Knobbi38

Hondo

Zitat von: knobbi38 am Mai 27, 2025, 11:57:41dann kann wird in dieser Zeile mit großer Wahrscheinlichkeit CreateObject() wieder den gleichen Fehler melden, oder?
Nein. Probier es aus.

Zitat von: knobbi38 am Mai 27, 2025, 11:57:41Beim Beenden der Automation kann man dann noch checken, ob eine neue Instanz erzeugt worden ist, oder eine vorhandene genutzt wird
Nicht nötig, es wird immer eine neue Instanz erstellt und diese wieder geschlossen.

Gruß Andi

Knobbi38

@Hondo

die Logik ist m.E. nicht richtig.

Bei mir wird immer schon bei ersten Aufruf von CreateObject() erfolgreich eine Objektreferenz zurückgegeben und wenn das bei dir so ist, daß ein erst ein zweiter Aufruf von CreateObject() notwendig bzw. erfolgreich ist, dürfte etwas mit deinem COM-System nicht ganz i.O. sein.

Zitat von: Hondo am Mai 27, 2025, 13:19:24
ZitatBeim Beenden der Automation kann man dann noch checken, ob eine neue Instanz erzeugt worden ist, oder eine vorhandene genutzt wird
Nicht nötig, es wird immer eine neue Instanz erstellt und diese wieder geschlossen.
Anscheinend hast du nicht ganz verstanden, worauf ich eigentlich hinaus wollte. Das mit CreateObject() immer eine neue Instanz erzeugt wird, ist klar. Hier ging es aber darum, wenn eine vorhandene Instanz verwendet wird, diese nicht einfach blindlings zu schließen.

Gruß Knobbi38




Hondo

Zitat von: knobbi38 am Mai 27, 2025, 15:03:15diese nicht einfach blindlings zu schließen.
Die wird doch gar nicht geschlossen, sondern nur die neu erzeugte.
Hast du es ausprobiert?

Hondo

Der Orginal-Code stammt übrigends von Reinhard Kraasch (ehemals DBWiki.de)
Dort schreibt er:
  On Error Resume Next
  Err.Clear
  Set oExcel = GetObject(, "Excel.Application ")
  If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
  On Error GoTo 0

Und das Speichern/Ausstieg hat er wie folgt gemacht:
  With oExcel
    ...
    If MsgBox("Speichern?", vbYesNo + vbQuestion) = vbYes Then
      .ActiveWorkbook.SaveAs Me!FName
    Else
      .ActiveWorkbook.Close SaveChanges:=False
    End If
    .Quit
  End With

Gruß Andreas

Hondo

By the Way
Ich finde es total Schade dass solche wertvollen Quellen wie DBWiki nicht mehr online sind.
Weiß jemand was Reinhard Kraasch macht?

Gruß Andi

Knobbi38

Hallo Andy,

anscheinend reden wir aneinander vorbei. Schau dir den Code von Reinhard nochmal genauer an, dann erkennst du vielleicht, was du anders gemacht hast


On Error Resume Next
  Err.Clear
  Set oExcel = GetObject(, "Excel.Application ")
  If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
  On Error GoTo 0


und warum das bei dir doppelt gemoppelt ist.

Gruß Knobbi38

PS:
Du kannst das DBWiki hier noch einsehen:
https://web.archive.org/web/20191028003208/http://dbwiki.net/

Hondo

Zitat von: knobbi38 am Mai 27, 2025, 21:59:51dann erkennst du vielleicht, was du anders gemacht hast

hab ich doch unten geschrieben?
Außerdem ist das nicht doppelt gemoppelt, bei mir (Office 2010) zumindest geht der Interpreter in den 2. Aufruf des Excel-Opjektes weil beim ersten Fehler 429 kommt.

Knobbi38

Von welchem Code redest du, dem von dir oder dem von Reinhard?
Und ja, dein Code ist doppelt gemoppelt!

Hondo

nehm ich die Zeile: If Err.Number <> 0 Then Set oExcel = CreateObject("Excel.Application")
heraus ist das Objekt nicht instanziert, und in Folge bekome ich Fehler 91 "Objektvariable oder With-Blockvariable nicht festgelegt".

Also ist die Zeile nicht überflüssig sondern notwendig.
Das Verhalten siehst du an der beigehängten gezippten mp4-Datei.

Bitsqueezer

Hallo Andreas,

Ulrich meinte, daß es im Originalcode zuerst "GetObject" heißt und wenn das erfolglos war, "CreateObject" aufgerufen wird. Es macht halt keinen Sinn, zuerst "CreateObject" und dann nochmal "CreateObject" aufzurufen.

Aber diese Variante stammt hier im Thread von Lemmy, wenn ich das richtig gesehen habe, nicht von Dir.

Gruß

Christian