Benutzer mit den meisten Antworten
Excelprozess aus VB beenden . funktioniert nicht

Frage
-
Hallo NG,
ich hole aus einer Excel-Datei einzelne Werte in eine VB 2010-Form, dort werden Änderungen an anderen Zahlen vorgenommen, die in die Excel-Datei zurückgeschrieben werden. Funktioniert alles reibungslos. nur kriege ich den Prozess nicht wieder zu. D. h. wenn ich die Form 10x aufrufe, habe ich hinterher 10 Excel-Prozesse laufen.
mein Code:
Public myExcel as new Microsoft.Office.Interop.Excel.Application
...
Sub ExcelBeenden
with myExcel
.Workbooks.Close()
.Application.Quit()
end WithmyExcel=Nothing
End Sub
Ich bekomme nicht einmal die Excel-Datei zu, d. h. der gesamte Code wird nicht ausgeführt (hab die Sub natürlich auf einen Button gelegt). Was mache ich da falsch? Vielen Dank schon mal!
Gruß aus Stuttgart
Susanne
- Typ geändert Robert BreitenhoferModerator Mittwoch, 19. Dezember 2012 10:10 Keine Rückmeldung des Fragenstellender
- Typ geändert Robert BreitenhoferModerator Freitag, 28. Dezember 2012 08:17 Rückmeldung des Fragenstellender
Antworten
-
So, jetzt funktioniert es, ich bin wirklich Schritt für Schritt vorgegangen und habe zuerst nur den Excel-Start und das Beenden getestet, letztendlich sieht mein Code für den Beenden-Button so aus:
Sub ExcelBeenden()
Clipboard.Clear()
With myExcel
.Application.DisplayAlerts = False
.ActiveWorkbook.Close()
.Application.DisplayAlerts = True
.Application.Quit()
End With
myExcel = Nothing 'Freigabe des Speichers
End
End SubUnd so wird der Speicher endlich wieder freigegeben. Vielen Dank für Eure Hilfe!
Gruß aus München
Susanne
- Als Antwort markiert SIH007 Montag, 11. Februar 2013 13:29
Alle Antworten
-
Hi Susanne,
ich würde vermuten, dass das Workbook in welches du deine Daten zurückgeschrieben hast, noch nicht gespeichert ist, und deswegen Excel die Datei nicht schließt.
Ich würde das geändert Workbook mit "Workbook.save" speichern und dann mit "Workbook.Close" schließen.
Bei "Workbooks.Close" kann man nicht sagen, ob die geänderten Dateioen gespeichert werden sollen.
Gruß aus Erfurt
George
-
Hi,wenn Du vor dem Schließen Objekte nutzt, die nicht entsorgt wurden, dann kann das Quit erfolglos bleiben. Kandidaten für solches Verhalten können aus der Nutzung der Oberfläche resultieren. Wenn beispielsweise “Select” und “Activate” genutzt wird, kann das System nicht erkennen, ob der Bediener mit den selektierten und aktivierten Oberflächenbestandteilen fertig ist, auch, wenn Visible=False gesetzt wurde. Wenn die Anwendung ohne Excel-Oberfläche laufen soll, dann sollte ÜBERALL auf Select und Activate verzichtet werden und es sollten nur Range-Objekte genutzt werden.--
Viele Gruesse
Peter -
****************************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
****************************************************************************************************************Robert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
-
Sorry, hat eine Weile gedauert, der Grund für das Problem war, dass im Hintergrund die Excel-Kompatibilitätsabfrage erschien, die, weil sie auch nicht im Vordergrund war, nicht beantwortet wurde. Und damit ging es dann nicht mehr weiter. Kann ich irgendwie per VB auf diese Kompatibiltätsabfrage zugreifen, um sie entweder für meine Anwendung auszuschalten oder aber die Rückfrage automatisch mit ja zu beantworten?
-
Ich habe jetzt versucht, die Datei zu schließen, ich möchte sie eigentlich nicht beim Schließen speichern. Dabei bekomme ich die Fehlermeldung
Ausnahme von HRESULT: 0x800A03EC
WithmyExcel
.ThisWorkbook.Saved = True
.Application.DisplayAlerts = False
.ActiveWorkbook.Close()
.Application.DisplayAlerts = True
.Application.Quit()
EndWith
myExcel = NothingDie Fehlermeldung erscheint bei .ThisWorkbook.Saved = True
Danke für jeden Tipp
Susanne
-
Hallo Susanne,
Probiere doch mal folgendes - schließen ohne Speichern, das hattest Du allerdings in deinem Eingangspost schon so stehen. Peter schrieb dazu das einen hängende Referenz dafür sorgt das das Speichern nicht geht. Wenn Das nicht läuft versuche dein Vorgehen zu minimieren und den Programmteil zu ermitteln welcher ein Object erzeugt/nutzt und nicht mit =nothing wieder entfernt/freigegeben wird.
With myExcel
.Application.DisplayAlerts =False
.Application.Quit()
EndWith
myExcel =NothingGrüße Alexander
-
Bei Excel handelt sich um nicht verwaltete Objekt. Da kann ein einfaches Setzen auf Nothing u.U. nicht ausreichend sein und es kann ein Dispose angebracht sein. Das muss man aber von Objekt zu Objekt entscheiden. Anzufangen wäre mit dem Entfernen von Activate und Select. Diese beiden Methoden sind für die Arbeit mit der Oberfläche bestimmt und haben in einem Programm ohne besonderen Grund nichts zu suchen. Ein Select kann z.B. zur Auswahl einer Zelle in der Oberfläche führen, die mit einem Nothing oder Dispose nicht deselektiert und damit freigegeben werden kann. Da hilft meist nur eine Info an den Bediener, dass er diesen Prozess vollendet. Danach klappt sollte dann auch das Schließen per Programm funktionieren.--
Peter Fleischer -
So, jetzt funktioniert es, ich bin wirklich Schritt für Schritt vorgegangen und habe zuerst nur den Excel-Start und das Beenden getestet, letztendlich sieht mein Code für den Beenden-Button so aus:
Sub ExcelBeenden()
Clipboard.Clear()
With myExcel
.Application.DisplayAlerts = False
.ActiveWorkbook.Close()
.Application.DisplayAlerts = True
.Application.Quit()
End With
myExcel = Nothing 'Freigabe des Speichers
End
End SubUnd so wird der Speicher endlich wieder freigegeben. Vielen Dank für Eure Hilfe!
Gruß aus München
Susanne
- Als Antwort markiert SIH007 Montag, 11. Februar 2013 13:29