[VBScript] Error handling: 3x zelfde error?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 22-09 20:01
Bij het bedrijf waar ik momenteel werk, maakt men gebruik van een ERP pakket. In dat pakket zit een Product Configurator, die we zelf kunnen programmeren.

Nu heb ik een class geschreven waarin de volgende functie staat.

VBScript:
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
    Public Function Openen(varExcelDocumentIn, varWerkbladIn)
        Set ExcelApp = Nothing
        Set ExcelBook = Nothing
        Set ExcelSheet = Nothing
        Openen = True
        
        ' De Applicatie starten
        On Error Resume Next
            Set ExcelApp = CreateObject("Excel.Application")
            If Err = 0 Then 
                ExcelApp.Visible = False
                Set ExcelBook = ExcelApp.Workbooks.open(varExcelDocumentIn)
                If Err = 0 Then
                    Set ExcelSheet = ExcelBook.Worksheets(varWerkBladIn)
                    If Err = 0 Then
                        ExcelSheet.Activate
                    Else
                        MsgBox "ExcelSheet bestaat niet"
                        Openen = False
                        Err.Clear
                    End If
                Else
                    MsgBox "ExcelBook bestaat niet"
                    Openen = False
                    Err.Clear
                End If
            Else
                MsgBox "ExcelApp bestaat niet"
                Openen = False
                Err.Clear
            End If
    End Function


In de code van de Product Configurator vind er een aanroep naar deze functie plaats. Dit gaat allemaal goed. Als het opgegeven werkblad niet bestaat, geeft ie netjes 1x voor het opstarten de foutmelding "ExcelSheet bestaat niet". Echter als ExcelBook niet bestaat, verschijnt de "ExcelBook" bestaat niet 3x (2x voor opstarten van de Product Configurator en 1x bij afsluiten ervan) in plaats van maar 1x voor het opstarten.

Ik vermoed dat er in de code van de functie iets fout zit, maar aangezien ik pas sinds deze week bezig ben met VBScript, heb ik geen idee waar het nu daadwerkelijk fout gaat.

Hopelijk ziet iemand van jullie het.

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Nou heb ik geen verstand van vbscript hoor, maar haal dat regeltje on error resume next eens weg :?

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 22-09 13:54

sopsop

[v] [;,,;] [v]

Die on error resume next moet blijven staan. Hij checkt direct erna of er een error is opgetreden.

Maar het lijkt erop dat hij de functie toch echt drie keer aanroept.

Probeer dit eens:
Visual Basic:
1
2
3
4
    Public Function Openen(varExcelDocumentIn, varWerkbladIn) 
              MsgBox "ExcelApp bestaat niet" 
              Openen = False 
    End Function

Probeer deze functie eens. Hoevaak zie je dan een msgbox "ExcelApp bestaat niet"?

[ Voor 46% gewijzigd door sopsop op 18-07-2007 15:44 ]


Acties:
  • 0 Henk 'm!

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 18-09 08:20
Waarom 'On Error Resume Next'?

Je kan toch met normale foutafhandeling werken?

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 22-09 20:01
sopsop schreef op woensdag 18 juli 2007 @ 15:42:
Probeer deze functie eens. Hoevaak zie je dan een msgbox "ExcelApp bestaat niet"?
Die verschijnt maar 1 keer.

Het valt me overigens op als ik, voordat ik de class declaratie doe, er een Msgbox "test" neer zet en ik zorg dat de fout optreed die Msgbox "ExcelBook bestaat niet" aanroept, die Msgbox "test" ook drie keer verschijnt.

Terwijl dat bij de andere foutmeldingen niet gebeurd.
Phenomenon schreef op woensdag 18 juli 2007 @ 15:48:
Waarom 'On Error Resume Next'?

Je kan toch met normale foutafhandeling werken?
Wat versta je hier precies onder?

[ Voor 18% gewijzigd door Crazybyte op 18-07-2007 15:55 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik zou gewoon je errormessage een keer uitbreiden.
Hierdoor krijg je misschien een duidelijkere foutmelding te zien.
Verder zie ik echt niets mis met je functie hoor...

VBScript:
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
    Public Function Openen(varExcelDocumentIn, varWerkbladIn) 
        Set ExcelApp = Nothing 
        Set ExcelBook = Nothing 
        Set ExcelSheet = Nothing 
        Openen = True 
         
        ' De Applicatie starten 
        On Error Resume Next 
            Set ExcelApp = CreateObject("Excel.Application") 
            If Err = 0 Then  
                ExcelApp.Visible = False 
                Set    ExcelBook = ExcelApp.Workbooks.open(varExcelDocumentIn) 
                If Err = 0 Then 
                    Set ExcelSheet = ExcelBook.Worksheets(varWerkBladIn) 
                    If Err = 0 Then 
                        ExcelSheet.Activate 
                    Else 
                        MsgBox "ExcelSheet bestaat niet"  & vbcrlf & err.code & " - " & err.description
                        Openen = False 
                        Err.Clear 
                    End If 
                Else 
                    MsgBox "ExcelBook bestaat niet"   & vbcrlf & err.code & " - " & err.description
                    Openen = False 
                    Err.Clear 
                End If 
            Else 
                MsgBox "ExcelApp bestaat niet"   & vbcrlf & err.code & " - " & err.description
                Openen = False 
                Err.Clear 
            End If 
    End Function


Succes...

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 22-09 20:01
Verwijderd schreef op woensdag 18 juli 2007 @ 15:58:
Ik zou gewoon je errormessage een keer uitbreiden.
Hierdoor krijg je misschien een duidelijkere foutmelding te zien.
Verder zie ik echt niets mis met je functie hoor...
Dit haalt ook niets uit, melding is 3x exact hetzelfde.

Met wat uitproberen in de tussentijd, lijkt de functie Sluiten voor het probleem te zorgen.

Even de class er volledig bijnemen:
VBScript:
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
class ExcelFuncties
    ' Variabelen declareren
    Private ExcelApp
    Private ExcelBook
    Private ExcelSheet
    
    Public Function Openen(varExcelDocumentIn, varWerkbladIn)  
        Set ExcelApp = Nothing  
        Set ExcelBook = Nothing  
        Set ExcelSheet = Nothing  
        Openen = True  
        
        ' De Applicatie starten  
        On Error Resume Next  
        Set ExcelApp = CreateObject("Excel.Application")  
        If Err = 0 Then   
            ExcelApp.Visible = False  
            Set    ExcelBook = ExcelApp.Workbooks.open(varExcelDocumentIn)  
            If Err = 0 Then  
                Set ExcelSheet = ExcelBook.Worksheets(varWerkBladIn)  
                If Err = 0 Then  
                    ExcelSheet.Activate  
                Else  
                    MsgBox "ExcelSheet bestaat niet" & err.number & " - " & err.description 
                    Openen = False  
                    Err.Clear  
                End If  
            Else  
                MsgBox "ExcelBook bestaat niet" &  err.number & " - " & err.description 
                Openen = False  
                Err.Clear  
            End If  
        Else  
            MsgBox "ExcelApp bestaat niet" & err.number & " - " & err.description 
            Openen = False  
            Err.Clear  
        End If  
    End Function
        
    Public Function Lees(varRijIn, varKolomIn)
        Lees = ExcelSheet.Cells(varRijIn, varKolomIn).value
    End Function
    
    Public Function Sluiten()
        If IsObject(ExcelApp) Then
            If IsObject(ExcelBook) Then
                ExcelApp.DisplayAlerts = False
                ExcelBook.close
                ExcelApp.quit   
                
                Set ExcelSheet = Nothing
                Set ExcelBook = Nothing
                Set ExcelApp = Nothing  
            End If
        End If  
    End Function
End Class


De aanroep gebeurt als volgt:
VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
Include clsExcelFuncties

Dim objExcel
Set objExcel = New ExcelFuncties

If objExcel.Openen(HuidigBedrijfDir + "excelbestand.xls", "Blad1") = false then
   Msgbox "Het document is niet geopend"
Else
   MsgBox "De eerste keuze is: " & objExcel.Lees(1,2)
End If

objExcel.Sluiten


Zodra ik "objExcel.Sluiten" weghaal (uit-comment), dan geeft ie de melding maar 1x

Acties:
  • 0 Henk 'm!

  • Phenomenon
  • Registratie: December 2000
  • Laatst online: 18-09 08:20
Crazybyte schreef op woensdag 18 juli 2007 @ 15:54:
[...]

Wat versta je hier precies onder?
Visual Basic:
1
2
3
4
5
On error goto ErrHandler

Exit sub
:ErrHandler
bla bla

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 22-09 20:01
Kijk eens goed wat ik voor taal gebruik ;)
Dat wat jij voorstelt is in VBScript niet mogelijk, helaas.

Acties:
  • 0 Henk 'm!

Verwijderd

Dat ziet er eigenlijk allemaal vrij goed uit volgens mij.
ik heb niet dadelijk een idee waar het verkeerd zit.
Succes...

PS. als er hier niet dadelijk iemand kan helpen kan je ook altijd je vraag eens laten vallen op het vbscript forum van TEK-TIPS. daar zitten een paar echte vbscript guru's (PHV, Tsuji, marcdmac...)
www.tek-tips.com

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 22-09 20:01
Zoals ik toen straks al gepost heb, leek de functie Sluiten te zorgen voor het probleem. Ik heb dan ook dit:

VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Function Sluiten()
        If IsObject(ExcelApp) Then
            If IsObject(ExcelBook) Then
                ExcelApp.DisplayAlerts = False
                ExcelBook.close
                ExcelApp.quit    
                
                Set ExcelSheet = Nothing
                Set ExcelBook = Nothing
                Set ExcelApp = Nothing    
            End If
        End If    
    End Function 


Veranderd in:
VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
Public Function Sluiten()
        On Error Resume Next
        ExcelApp.DisplayAlerts = False
        On Error Resume Next
        ExcelBook.close
        On Error Resume Next
        ExcelApp.quit    
                
         Set ExcelSheet = Nothing
         Set ExcelBook = Nothing
         Set ExcelApp = Nothing    
    End Function 


Vervolgens was het probleem verholpen en verscheen de melding dat het bestand niet correct is, nog maar 1 keer.

Ik vraag me echter wel af of dit de juiste manier is om het probleem af te handelen.

Acties:
  • 0 Henk 'm!

  • SKiLLa
  • Registratie: Februari 2002
  • Niet online

SKiLLa

Byte or nibble a bit ?

Die "On Error Resume Next" is toch maar echt 1x nodig en blijft actief totdat je 'm weer uitschakeld met "On Error Goto 0", maar de functie sluiten:


VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Function Sluiten() 
    If IsObject(ExcelApp) Then 
        If IsObject(ExcelBook) Then
            ExcelApp.DisplayAlerts = False 
            ExcelBook.close 
            ExcelApp.quit     
                 
            Set ExcelSheet = Nothing 
            Set ExcelBook = Nothing 
            Set ExcelApp = Nothing     
        End If 
    End If     
End Function 


Moet volgens mij zijn:


VBScript:
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
Public Sub Sluiten() 

    On Error Resume Next

    If IsObject(ExcelApp) Then 
        ExcelApp.DisplayAlerts = False 

        If IsObject(ExcelBook) Then

            If IsObject(ExcelSheet) Then
                ExcelSheet.Close
                Set ExcelSheet = Nothing
            End If

            ExcelBook.Close 
            Set ExcelBook = Nothing
        End If

        ExcelApp.quit     
        Set ExcelApp = Nothing     
    End If

    Err.Clear
    On Error Goto 0
End Sub


Ook zet je in de functie Openen de return waarde "Openen = True" in het begin van de routine, terwijl het beter is om deze by default op False te zetten en pas op True te zetten wanneer dat ook daadwerkelijk gelukt is. Nu kan (eventuele) foutieve logica/errorhandling in die functie ervoor zorgen dat je onterecht True terugkrijgt ...

'Political Correctness is fascism pretending to be good manners.' - George Carlin

Pagina: 1