| 

.NET C# Java Javascript Exception

0
Führe ich folgendes stark vereinfachtes Programm aus, bleibt der Excel-Prozess anschließend aktiv, d.h. er wird weiterhin im Taskmanager angezeigt:

Dim oExcel As Object
Dim oBook As Object

Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Open(App.Path & "\Exceltest.xlsx")
oBook.Worksheets(1).Cells(1, 1) = "Exceltest"
oBook.Save
oExcel.quit

Kurz zum Ablauf: Das Programm öffnet eine vorhandene Excel-Datei, schreibt in die 1. Zelle einen Text, speichert die Änderung und beendet dann Excel und sich selbst. Eigentlich ganz einfach. Dieses Problem scheinen (nach fleißigem Googlen) viele zu haben, ohne dass ich eine funktionierende Antwort gefunden habe. Für einen hilfreichen Tip bedanke ich mich im Voraus.

Inzwischen habe ich festgestellt, dass obiger Code bis Excel 2003 einschließlich wie gewünscht funktioniert, nur ab Excel 2007 tritt der genannte Effekt auf. Noch ein Hinweis: Ich muss Excel aus Access heraus starten, so dass mir die Möglichkeiten von NET leider nicht zur Verfügung stehen.
News:
28.04.2011
RKleensang 1 1 1
redest do von excel interop aus vb.net oder von einer vba anwendung?
nabuchodonossor 28.04.2011
redest du von vb.net/interop oder von einer vba anwendung?
nabuchodonossor 28.04.2011
sorry für doppelpost, ich bekam eine fehlermeldung und habs ein zweites mal probiert.
nabuchodonossor 28.04.2011
2 Antworten
0
Ich hatte das Problem auch und habe damals lange erfolglos nach den Gründen für das Excel-Verhalten gesucht. Habe es dann so gelöst, dass ich bei Beenden meines Programms (also bei mir im FormClose) auch die Excel-Applikation beendet habe. Die Excel-Applikation hatte ich mir nämlich bei Starten gemerkt.

private Microsoft.Office.Interop.Excel.Application m_oExcelApplication;
public bool StartExcel()
{
if ( m_oExcelApplication == null )
{
try
{
m_oExcelApplication = new Microsoft.Office.Interop.Excel.Application();
m_oExcelApplication.Visible = IsDebugVersion; // es ist super, wenn man Excel beim Debuggen sehen kann!
m_oExcelApplication.WorkbookBeforeClose += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeCloseEventHandler ( ExcelWorkbookBeforeClose ); // brauchst du für dein Problem nicht unbedingt
}
catch ( Exception)
{
return false;
}
return true;
}

public void CloseExcel( bool bAlsoQuit )
{
if ( m_oExcelApplication != null )
{
object oSaveChanges = false;
m_oExcelApplication.Visible = false;
foreach ( Microsoft.Office.Interop.Excel.Workbook owb in m_oExcelApplication.Workbooks )
{
owb.Close( oSaveChanges, owb.Name, null );
}
if ( bAlsoQuit)
{
m_oExcelApplication.Quit();
}
}
m_oExcelApplication = null;
}
28.04.2011
KN 1,7k 1 8
KN 1,7k 1 8
Danke für deinen Beitrag, aber ich muss das Problem per VBA in Access lösen. Das Closen aller Workbooks brachte keinen Erfolg. Übrigens funktioniert mein Code bis Excel 2003 einschließlich, ab Excel 2007 nicht mehr.
RKleensang 28.04.2011
Danke für deinen Beitrag, aber ich muss das Problem per VBA in Access lösen. Das Closen aller Workbooks brachte keinen Erfolg. Übrigens funktioniert mein Code bis Excel 2003 einschließlich, ab Excel 2007 nicht mehr.
RKleensang 28.04.2011
Danke für deinen Beitrag, aber ich muss das Problem per VBA in Access lösen. Das Closen aller Workbooks brachte keinen Erfolg.
RKleensang 28.04.2011
Sorry, dass mein Text so oft wiederholt wurde, aber ich bekam nach jedem Absenden eine Fehlermeldung.
RKleensang 28.04.2011
Die zentrale Zeile ist "m_oExcel-Application.Quit". Also ich beende auch die Excel-Applkation, achdem ich alle Workbooks geschlossen habe. Wenn ich die Workbooks nicht vorher schließe, kommen Nachfragen, ob ich die Änderungen speichern will. Das verhindere ich mit dem Schließen der Workbooks mit dem Parameter "Änderungen nicht speichern". Ich habe einfach meinen c#-Code kopiert. Du kannst ihn ohne Probleme in VBA übertragen. Das ist sehr ähnlich.
KN 28.04.2011
0
Bekanntes Problem! Habe auch ständig Excel Prozesse als Speicherleichen vorliegen.

In den meisten Fällen sind es noch Referenzen auf die COM Objekte. In deinem Fall oExcel und oBook. Versuche mal die am Ende auf Nothing oder in C# null zuzuweisen. Wir haben uns in C# folgenden Aufräumer geschrieben :

public static void NAR(ref object o)
{
if(o != null)
{
try
{
while(Marshal.ReleaseComObject(o) > 0)
{ }
}
catch { }
finally
{
o = null;
}
}


Nach application.Quit rufen wir dann immer noch Util.NAR( ref oBook ) und Util.NAR( ref oApplication ) auf.
28.04.2011
stefc 268 1 6
Danke für deinen Beitrag, aber ich muss das Problem per VBA in Access lösen. Das Closen aller Workbooks brachte keinen Erfolg. Übrigens funktioniert mein Code bis Excel 2003 einschließlich, ab Excel 2007 nicht mehr.
RKleensang 28.04.2011
Danke für deinen Beitrag, aber ich muss das Problem per VBA in Access lösen. Das Closen aller Workbooks brachte keinen Erfolg.
RKleensang 28.04.2011
Sorry für den doppelten Text, aber ich bekam nach dem Absenden eine Fehlermeldung.
RKleensang 28.04.2011

Stelle deine Excel-Frage jetzt!