[vb6 sp5 & excel 2000] Excel proces sluit niet af

Pagina: 1
Acties:
  • 113 views sinds 30-01-2008
  • Reageer

  • DPLuS
  • Registratie: April 2000
  • Niet online
Hoi,

Ik heb al eerder op GOT gezocht en ik kwam een aantal posts tegen met hetzelfde probleem. Ik heb alle advies uit die posts toegepast op mijn code, alleen blijf ik het probleem houden dat op het moment dat ik een excel object sluit (xlApp=nothing) het proces blijft bestaan totdat ik de vb-applicatie sluit.
Kan ik dit proces niet eerder afsluiten of doe ik iets fout?
Ik heb in VB de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Private Sub Command1_Click()

    CommonDialog1.ShowOpen
    
    Dim xlApp As excel.Application
    Dim xlBook As excel.Workbook
    Dim xlSheet As excel.Worksheet
    
    Screen.MousePointer = vbHourglass
    DoEvents
    
    'Set xlApp = New excel.Application
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
    xlApp.DisplayAlerts = False
    xlApp.ScreenUpdating = False
    
    
    Set xlBook = xlApp.Workbooks.Open(CommonDialog1.FileName)
    Set xlSheet = xlBook.ActiveSheet

    Dim intCurrentRow As Integer
    Dim intLastRow As Integer
                
    Dim strColumnName As String
    Dim strColumnTelnr As String
    Dim strColumnVKnr As String
    
    strColumnName = "A"
    strColumnTelnr = "B"
    strColumnVKnr = "C"
    
    intLastRow = ActiveCell.SpecialCells(xlLastCell).Row
        
    StatusBar1.SimpleText = intLastRow & " records in totaal"
        
    Range(strColumnName & "1").Select
    intCurrentRow = ActiveCell.Row
    
    Do Until intCurrentRow > intLastRow
    
        StatusBar1.SimpleText = "Bezig met importeren van record " & intCurrentRow & " van " & intLastRow
        
        'Text1.Text = ActiveCell.Value ' Kolom Naam
        'hier code om te itereren door kolommen
        'Text2.Text = Range(strColumnTelnr & ActiveCell.Row).Value ' Kolom Telnr
        'Text3.Text = Range(strColumnVKnr & ActiveCell.Row).Value ' Kolom VKnr
        
        ActiveCell.Offset(1, 0).Activate
        intCurrentRow = ActiveCell.Row
    Loop
        
    Screen.MousePointer = vbDefault
    StatusBar1.SimpleText = "Gereed met het importeren van " & intLastRow & " records"
    
    'MsgBox "Importeren voltooid!"
    
    xlBook.Close
    xlApp.Quit
        
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    If xlApp Is Nothing Then
        MsgBox "niets"
    End If
    
End Sub


Het rare is dat de messagebox op het einde gewoon "niets" aangeeft, ofwel xlApp = Nothing = true?! Terwijl Excel proces wel in de lijst blijft staan...

Verwijderd

Kill alle deze processen en run je code nogmaals, in jouw code is namenlijk niets mis het is waarschijnlijk een oud proces wat tijdens jouw experimenten is ontstaan.

  • DPLuS
  • Registratie: April 2000
  • Niet online
Nee, want als ik de applicatie sluit, verdwijnt het Excel-proces ook gewoon.
Ik heb de pc al eens gereboot, maar ik blijf hetzelfde probleem houden:
Excel proces sluit pas als ik mijn app unload.

Verwijderd

Wordt er in de rest van de code van jouw app geen excell gebruikt ?

  • DPLuS
  • Registratie: April 2000
  • Niet online
Nee, dit is het enige form en de enige sub.

Misschien dat wat andere mensen deze code eens kunnen pasten in hun vb-IDE en ondertussen in de taskmanager eens kunnen kijken of het process Excel blijft bestaan...

[ Voor 67% gewijzigd door DPLuS op 23-12-2003 15:54 ]


Verwijderd

Heb je het probleem ook bij het uitvoeren vanuit de gecompileerde app (de uiteindelijke EXE dus, niet vanuit de VB IDE)?

  • DPLuS
  • Registratie: April 2000
  • Niet online
Ja, ook als ik 'm gecompileerd uitvoer blijf ik dit probleem houden.
Ik snap er niets van...

Verwijderd

voeg de volgende regel toe
xlapp.workbooks.close

  • DPLuS
  • Registratie: April 2000
  • Niet online
Werkt ook niet, ik heb ook al False bij xlApp.Workbook.Close gezet, maar helpt ook niet.
Heeft iemand anders deze code al eens geprobeerd (kan gewoon met een leeg excel-sheet)...
Hoort dat proces normaal ook afgesloten te worden, of is het normaal dat dit proces blijft bestaan??

Verwijderd

Als ik dit uitvoer wordt EXCEL.EXE wel afgesloten. Zijn al je workbooks gesloten?

code:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Command1_Click()

    Dim xlApp As Excel.Application
    
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False
    xlApp.DisplayAlerts = False
    xlApp.ScreenUpdating = False
    xlApp.Quit
    Set xlApp = Nothing

End Sub

  • DPLuS
  • Registratie: April 2000
  • Niet online
Bij mij sluit 'ie met bovenstaande code WEL af...hmm, dit vraagt om wat uitzoekwerk...

Verwijderd

Je moet die intCurrentRow en intLastRow objecten ook vrijgeven, Excel sluit nooit af als niet alle toegewezen objecten zijn vrijgegeven. Dus alles wat een handle teruggeeft moet je expliciet vrijgeven.

  • DPLuS
  • Registratie: April 2000
  • Niet online
Hoe moet ik dat dan definiëren? Want als ik
set intLastRow = nothing en set intCurrentRow = nothing doe, zegt 'ie: object required..

Verwijderd

DPLuS schreef op 23 december 2003 @ 16:53:
Hoe moet ik dat dan definiëren? Want als ik
set intLastRow = nothing en set intCurrentRow = nothing doe, zegt 'ie: object required..
hm, ik geen VB niet zo goed (doe Delphi & Progress), maar probeer eens iets van NILL, NULL of 0 toe te wijzen.

  • DPLuS
  • Registratie: April 2000
  • Niet online
intCurrentRow = vbNull
intCurrentRow = 0
intLastRow = vbNull
intLastRow = 0

Alle bovenstaande varianten werken NIET!
Kan ik die variabelen niet destroyen of unsetten zoals in php??

Verwijderd

Verwijderd schreef op 23 december 2003 @ 16:45:
Je moet die intCurrentRow en intLastRow objecten ook vrijgeven, Excel sluit nooit af als niet alle toegewezen objecten zijn vrijgegeven. Dus alles wat een handle teruggeeft moet je expliciet vrijgeven.
Geldt inderdaad voor objecten, maar een Integer is geen object, en heeft dus ook geen referenties naar Excel. Om even alles uit te sluiten, in je module heb je Option Explicit aanstaan?

Verwijderd

Zie deze link:
http://groups.google.com/....2672%40tkmsftngp04#link4

Voeg dus overal xlApp toe waar deze niet expliciet door je neergezet is
bijv.
.Range(strColumnName & "1").Select
moet worden
xlApp.Range(strColumnName & "1").Select

Ik heb kort getest met jouw code en dit helpt bij mij.

Ik paste hier even de gewijzigde code:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
Private Sub Command1_Click()
    CommonDialog1.ShowOpen
    
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    
    Screen.MousePointer = vbHourglass
    DoEvents
    
'   Set xlApp = CreateObject("Excel.Application")
    Set xlApp = New Excel.Application
    
    xlApp.Visible = False
    xlApp.DisplayAlerts = False
    xlApp.ScreenUpdating = False
    
    Set xlBook = xlApp.Workbooks.Open(CommonDialog1.FileName)
    Set xlSheet = xlBook.ActiveSheet

    Dim intCurrentRow As Integer
    Dim intLastRow As Integer
                
    Dim strColumnName As String
    Dim strColumnTelnr As String
    Dim strColumnVKnr As String
    
    strColumnName = "A"
    strColumnTelnr = "B"
    strColumnVKnr = "C"
    
    intLastRow = xlApp.ActiveCell.SpecialCells(xlLastCell).Row
    StatusBar1.SimpleText = intLastRow & " records in totaal"
    xlApp.Range(strColumnName & "1").Select
    intCurrentRow = xlApp.ActiveCell.Row
    
    Do Until intCurrentRow > intLastRow
        StatusBar1.SimpleText = "Bezig met importeren van record " _
             & intCurrentRow & " van " & intLastRow
        xlApp.ActiveCell.Offset(1, 0).Activate
        intCurrentRow = xlApp.ActiveCell.Row
    Loop
        
    Screen.MousePointer = vbDefault
    StatusBar1.SimpleText = "Gereed met het importeren van " _
         & intLastRow & " records"
    
    MsgBox "Importeren voltooid!"
    
    xlBook.Close
    xlApp.Quit
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    If xlApp Is Nothing Then
        MsgBox "niets"
    End If
    
End Sub

Verwijderd

Sorry, was even weg maar het volgende moet ook werken:

Set xlSheet = Nothing
Set xlBook = Nothing
xlapp.workbooks.close
Set xlApp = Nothing

de xlapp.workbooks.close zorgt ervoor dat de workbook instantie naar het object gesloten word en dan pas kan het object opgeruimd worden en ja dan moet het proces verdwenen zijn.

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 12-03 16:55
Heb 'm al eerder in het topic gezien, maar volgens mij zou het volgende wonderen moeten doen:

code:
1
xlApp.Quit

Als je andere office applicaties wilt sluiten moet je ook .Quit aanroepen dacht ik.

Verwijderd

@Stalknecht: er staat al xlBook.Close in de code, ook jouw variant daarop helpt helaas niet
@Elissen: ook xlApp.Quit staat al in de code, helpt dus ook niet.

Het toevoegen van de verwijzing naar de in de code zelf aangemaakte object variable xlApp (zoals ik hierboven schreef) heeft volgens mij (en volgens de Google link) echter wel het gewenste effect. Het is alleen nog even wachten of het bij de TS ook werkt.

  • DPLuS
  • Registratie: April 2000
  • Niet online
@ Remark:
Voeg dus overal xlApp toe waar deze niet expliciet door je neergezet is
bijv.
.Range(strColumnName & "1").Select
moet worden
xlApp.Range(strColumnName & "1").Select
Geweldig!!
Dit helpt inderdaad!
Gewoon overal xlApp voor zetten!
Merci beaucoup en prettige feestdagen toegewenst!
Pagina: 1