IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Gestion d'erreur et récursivité


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut Gestion d'erreur et récursivité
    Bonjour,

    J'ai fait un petit programme qui met des valeurs par défaut dans des cellules à partir d'autres. Les dépendances de cellules sont définies dans un fichier de config.
    J'essaye de gérer les erreurs notamment en essayant de détecter les boucles infinies (ex. cellule A prend sa valeur par défaut dans la cellule B qui elle même prend sa valeur par défaut dans la cellule A).
    Le code est donne à peu près ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Private Const INFINITE_LOOP_ERROR = 15662
    Private ChampsEnCoursDeMiseAJour As Scripting.Dictionary
     
    Public Sub MettreValeursParDefaut()
        Dim vChamps As Variant, i&, sNomDuChamps$
        Set ChampsEnCoursDeMiseAJour = New Scripting.Dictionary
        On Error GoTo DEFAULT_VALUES_ERROR
        vChamps = RecupererChampsRequis()
        For i = LBound(vChamps) To UBound(vChamps)
            sNomDuChamps = CStr(vChamps(i))
            MettreValeurParDefautSpecifique sNomDuChamps
        Next i
        Exit Sub
    DEFAULT_VALUES_ERROR:
        If Err.Number = INFINITE_LOOP_ERROR Then
            MsgBox "Une boucle infinie a été détectée. Vérifier le fichier de configuration!", vbCritical
        End If
    End Sub
     
    Private Sub MettreValeurParDefautSpecifique(ByVal NomDuChamps As String)
        If ChampsEnCoursDeMiseAJour.exists(NomDuChamps) Then
            Err.Raise INFINITE_LOOP_ERROR
        End If
        On Error GoTo DEFAULT_VALUE_ERROR
        If IsEmpty(Range(NomDuChamps)) Then
            ChampsEnCoursDeMiseAJour.Add NomDuChamps, NomDuChamps
            Range(NomDuChamps).value = RecupererValeurParDefaut(NomDuChamps)
            ChampsEnCoursDeMiseAJour.Remove NomDuChamps
        End If
        Exit Sub
    DEFAULT_VALUE_ERROR:
        If Err.Number = INFINITE_LOOP_ERROR Then
            Err.Raise INFINITE_LOOP_ERROR
        End If
    End Sub
     
    Private Function RecupererValeurParDefaut(ByVal NomDuChamps As String) as string
        Dim sDependance$, i&
        sDependance = RecupererDependance(NomDuChamps)
        On Error GoTo DEFAULT_VALUE_ERROR
        MettreValeurParDefautSpecifique sDependance 'sorte de récursivité
        RecupererValeurParDefaut = Range(sDependance).value
        Exit Function
    DEFAULT_VALUE_ERROR:
        RecupererValeurParDefaut = ""
        If Err.Number = INFINITE_LOOP_ERROR Then
            Err.Raise INFINITE_LOOP_ERROR
        End If
    End Function
    Le problème c'est que le message d'erreur n'est jamais affiché. En débuggant, j'ai même l'impression qu'il ne rentre jamais dans les if des gestions d'erreur...
    Je m'y prends surement très mal pour gérer cette erreur et je veux bien quelques conseils.

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    SAlut,
    Un peu compliqué ton code !!

    Et si tu testais avant, la propriété address de ta cellule avec la valeur de la cellule "par defaut" ?
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut
    Effectivement c'est pas le code le plus simple que j'ai écrit (et encore j'ai essayé de simplifier au maximum pour rester compréhensible).

    Et si tu testais avant, la propriété address de ta cellule avec la valeur de la cellule "par defaut" ?
    Le problème vient du fait que cette cellule peut elle même avoir besoin de se remplir à partir d'une autre cellule...

    En gros mon problème ne vient pas de ce que fait concretement la fonction (je ne pense pas que ça ait beaucoup d'importance ici) mais de la manière de catcher des exceptions lorsqu'on a une forme de recursivité dans une fonction.
    En résumé j'ai une fonction f1 qui appelle une fonction f2 récursive et je veux que f1 puisse catcher l'exception produite par f2 quelle que soit le degré de récursivité dans lequel on se trouve.

  4. #4
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    Et ma proposition n'est pas faisable ? combien as tu de "récursivité " ?
    as tu des messages de références circulaires ?
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  5. #5
    Expert confirmé
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 093
    Billets dans le blog
    20
    Par défaut
    Il existe une propriété CircularReference

    que tu peux peut être tester avant l'opération suivante annuler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set oSht = ActiveSheet
     
    If oSht.CircularReference Is Nothing Then
    Have a nice day. Oliv'
    Votre réponse est peut être dans mon blog !
    https://www.developpez.net/forums/blogs/191381-oliv-/

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut
    Merci pour ton aide.

    J'ai finalement décidé de simplifier la structure de catch pour ne récupérer l'erreur que dans le point d'entrée de mon programme... Cela fonctionne désormais

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. gestion d'erreur et de transactions....
    Par Dge dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/02/2006, 22h20
  2. [Struts-Validator] Gestion d'erreurs
    Par sylvain_neus dans le forum Struts 1
    Réponses: 14
    Dernier message: 09/04/2004, 15h15
  3. [XSLT]Est ce qu'il y'a la gestion des erreur en xslt ?
    Par miloud dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/02/2004, 17h19
  4. [LG]tests pour la gestion d'erreur
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2003, 20h44
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo