Excel volledig afsluiten

Status
Niet open voor verdere reacties.

ColdDeath

Gebruiker
Lid geworden
7 nov 2013
Berichten
63
Hallo,

Ik probeer vanuit een ander programma excel te openen en af te sluiten:

Code:
Application.Quit

Als ik taakbeheer open dan zie ik dat excel geopend onder processen.

Hoe sluit ik Excel volledig af?


Met vriendelijke groet,
Willie
 
Als je in je programma ook een Excel object aanmaakt zal je die ook moeten vrijgeven met:
Set ExcelOBJ = Nothing
 
Application.Quit is een Excel code gedraaid in Excel om Excel volledig af te sluiten .
Als dit in een ander programma wordt gedraaid (welke weet ik dus niet), zal Excel daar geen gehoor aan geven.
 
Application moet je lezen als "ThisApplication". Vergelijk met ThisWorkbook. Het verwijst naar de applicatie waar je de code op dat moment uitvoert. Zit je in Word en voer je Application.Quit uit dan beeindig je Word.
Als je in Word VBA een pointer ExcelObj hebt naar een Excel applicatie (instantie) dan beeindig je die met ExcelObj.Quit. Pas daarna maak je de pointer Nothing.
 
Ik heb de volgende code:

Code:
Private Sub CommandButton1_Click()
    Set xlApp = New Excel.Application
    xlApp.Visible = False
    Set xlWB = xlApp.Workbooks.Open("X:\PROJECTEN\WIJZIGINGEN BEHEER.xlsx")
   
    'Doe iets
    

    xlApp.Quit
    Set xlApp= Nothing
End sub

Klopt dat zo? Want excel32.exe blijft in de taskmanager open staan.
 
Test het zelf. Start excel nieuw op met een nieuw workbook en voer dan met F8 je eigen script uit (zonder die Set xlWB). Als het goed is zie je Excel als achtergrondproces verdwijnen op het moment dat je xlApp vrijgeeft (Set to Nothing).
Als dat bij je programma niet zo is dan doe je iets in "Doe iets" waardoor het proces niet vrijgegeven kan worden. Misschien een tweede referentie naar xlApp?
 
Dag ColdDeath !

Onderstaande macro uit een Word bestand werkt bij mij zonder problemen (Office 2003). Als je het Task Manager window tegelijkertijd opent met het Word window, dan zie je EXCEL.EXE *32 verdwijnen als je op de MsgBox klikt.

Code:
Option Explicit

Sub ImportValueFromExcel()

Dim myExcel As Object, myFile As Object

'Nieuwe instance van Excel maken.
Set myExcel = CreateObject("Excel.Application")

'Deze nieuwe instance hoeven we niet te zien.
myExcel.Visible = False

'Het Excel-document bevat misschien macro's, maar dat mag geen aanleiding geven
'tot een vraag aan de gebruiker.
myExcel.DisplayAlerts = False

'Het Excel-document als Read Only openen.
Set myFile = myExcel.workbooks.Open(FileName:=ThisDocument.Path & "\test1.xls", ReadOnly:=True)

'Hier komt de code om gegevens uit het Excel-bestand te importeren.
'Doe iets...

'Zolang deze Msgbox zichtbaar is zou men Excel moeten terugvinden in de Task Manager.
MsgBox "Excel nog in Task Manager ?"

'Excel hebben we niet meer nodig.
myExcel.Quit

'Volgens sommige bronnen is het op Nothing zetten van de objectvariabelen niet
'nuttig, zelfs belachelijk. Andere bronnen, ook de VBA-help-file van Microsoft
'zelf, vinden het nodig. We nemen dan maar de veiligste weg.
Set myExcel = Nothing
Set myFile = Nothing

End Sub
Grtz,
MDN111.
 
Hallo MDN111!

Ten eerste, mijn complimenten over jouw schrijfstijl, zeer duidelijk en overzichtelijk.

Taskmanager is een beetje wispelturig, de ééne keer heb ik 6 instanties van excel geopend, de andere keer is iedere excel applicatie afgesloten...

Dus ik ben 2 keer zo veilig te werk gegaan:

Code:
Private Sub UserForm_Initialize()

'Excel en MyFile als object dimensioneren
Dim myExcel As Object, myFile As Object

'Een instantie maken van Solidworks document dat nu actief is.
Set swModel = Application.SldWorks.ActiveDoc

'Onderdeel krijgt de naam van projectnummer van onderdeel.
Onderdeel = swModel.GetTitle

'Verander de title van de userform naar projectnummer
UserForm1.Caption = "WIJZIGINGENBEHEER: " & Onderdeel

'Controleer of excel al is geopend, zo nee, maak een nieuwe instantie aan.
If Excel.Application Is Nothing Then
Set myExcel = CreateObject("Excel.Application")
Else
'Zo ja, maak de geopende excel aan als instantie.
Set myExcel = Excel.Application
End If

'Deze nieuwe instance hoeven we niet te zien.
myExcel.Visible = False

'Het Excel-document bevat misschien macro's, maar dat mag geen aanleiding geven tot een vraag aan de gebruiker.
myExcel.DisplayAlerts = False

'Het Excel-document openen.
Set myFile = myExcel.Workbooks.Open("X:\PROJECTEN\WIJZIGINGEN BEHEER.xlsx")
    
   'Doe iets

'Wijzigingen opslaan
ActiveWorkbook.Save

'Excel is niet meer nodig.
myExcel.Quit

'Volgens sommige bronnen is het op Nothing zetten van de objectvariabelen niet nuttig, zelfs belachelijk. Andere bronnen,
'ok de VBA-help-file van Microsoft zelf, vinden het nodig. We nemen dan maar de veiligste weg.
Set myExcel = Nothing
Set myFile = Nothing
    
End Sub

Dit werkt ook uitstekend.

Bedankt voor alle berichten, ik ben hier echt een stuk wijzer van geworden.


Groet,
Willie
 
Laatst bewerkt:
Taskmanager is een beetje wispelturig
Lol. Maar ik hoop dat je dit bedoelt: "taskmanager geeft aan dat er 6 excel instanties open staan. Die heeft altijd gelijk, dus ik doe iets fout in mijn code."

Dus ik ben 2 keer zo veilig te werk gegaan:
Heb je je code ook getest door er met F8 doorheen te stappen? Heb je ooit gezien dat die CreateObject wordt uitgevoerd? Ik vermoed van niet...
Is Excel.Application een variabele? Waar en hoe heb je die gedeclareerd?
Als je gebruik wilt maken van een al bestaande excel instantie (zou ik overigens niet doen, je loopt de kans dat je jezelf in de weg gaat zitten) moet je de GetObject opdracht gebuiken.

Het is een goed gebruik om het opruimen volgens het last in first out principe te doen:
Code:
Set myExcel = CreateObject("Excel.Application")
Set myFile = myExcel.Workbooks.Open("X:\PROJECTEN\WIJZIGINGEN BEHEER.xlsx")

myFile.Save
myFile.close
Set myFile = Nothing

myExcel.Quit
Set myExcel = Nothing

Het feit dat jouw code zes instanties van excel kon achterlaten (=memory leak) bewijst overigens hoe nuttig het is om de "rommel" die je maakt ook weer op te ruimen.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan