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 :

récupération de l'object ribbon en cas de bug dans les macros [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 207
    Par défaut récupération de l'object ribbon en cas de bug dans les macros
    Bonjour à tous
    j'ai un petit soucis avec un code de récupération de l'object ruban
    le code me fait planter excel
    je joins un fichier excel exemple au cas ou
    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
    Option Explicit
     
    #If Mac Then
        Private Declare PtrSafe Function CopyMemory_byVar Lib "libc.dylib" Alias "memmove" (ByRef dest As Any, ByRef src As Any, ByVal size As Long) As LongPtr
        Dim lRibbonPointer As LongPtr
    #Else
        #If VBA7 Then
            Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef dest As Any, ByVal src As LongPtr, ByVal size As LongPtr)
            Dim lRibbonPointer As LongPtr
        #Else
            Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef dest As Any, ByVal src As Long, ByVal size As Long)
            Dim lRibbonPointer As Long
        #End If
    #End If
     
    #If VBA7 Then
    Function GetRibbon(ByVal lRibbonPointer As LongPtr) As IRibbonUI
    #Else
    Function GetRibbon(ByVal lRibbonPointer As Long) As IRibbonUI
    #End If
        Dim objRibbon As IRibbonUI
        If lRibbonPointer <> 0 Then
            #If Mac Then
                CopyMemory_byVar objRibbon, lRibbonPointer, LenB(lRibbonPointer)
            #Else
                CopyMemory objRibbon, lRibbonPointer, LenB(lRibbonPointer)
            #End If
        End If
        Set GetRibbon = objRibbon
    End Function
     
     
    Sub SafeRibbon()
        On Error GoTo ErrorHandler
        MsgBox "Tentative de récupération du ruban"
        lRibbonPointer = ThisWorkbook.Sheets(1).Range("a2").Value
        Set myRibbon = GetRibbon(lRibbonPointer)
        If Not myRibbon Is Nothing Then
            myRibbon.Invalidate
        Else
            MsgBox "Erreur : impossible de récupérer l'objet Ribbon."
        End If
        Exit Sub
     
    ErrorHandler:
        MsgBox "Erreur : " & Err.Description
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 536
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 536
    Par défaut
    Salut,

    J'ai déja essayé un truc comme ça, c'est extrêmement instable.
    Ce qui ne m'étonne pas, VBA est un langage haut niveau, qui n'a pas grand chose à carrer des pointeurs qui par définition sont bas niveau. Sans compter que la tambouille interne d'Excel doit également interférer (je pense aux transtypages automatiques).

    Rien ne vaut une appli bien architecturée et fail-proof.

    Quand au projet qui s'effondre lorsque tu édites quelque chose, je pense que c'est un mal pour un bien, car ca force a fermer / reouvrir le classeur (re-initialisation de l'application dans un état connu).

  3. #3
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 207
    Par défaut re
    Bonjour deedolith
    mon app est relativement bien structuré tu n'a pas compris le contexte
    je parle d'autres classeurs éventuellements ouvert qui bugueraient sur une macro ce qui entraine immédiatement le choix fin/deboguage
    en cas de deboguage toute variable est détruite et donc celle du ruban aussi

    donc il me faut une solution

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 536
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 536
    Par défaut
    Citation Envoyé par patmeziere Voir le message
    je parle d'autres classeurs éventuellements ouvert qui bugueraient sur une macro ce qui entraine immédiatement le choix fin/deboguage
    Heu ...

    La solution ne serait-elle pas de corriger les anomalies ?
    Si tu fais un contournement ou passage en force, les anomalies seront toujours la.
    Et (Loi de Murphy oblige), elle sauront te rappeler leur présence au "meilleur" moment.

  5. #5
    Membre chevronné
    Homme Profil pro
    CIP
    Inscrit en
    Avril 2024
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : CIP
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2024
    Messages : 207
    Par défaut re
    re
    corrigé ou pas là n'est pas la question
    quand il arrive une erreur je perd mon object ribbon
    c'est pas compliqué a comprendre
    j'ai besoins de ce sauve conduit c'est tout

    visiblement tu réponds sans comprendre le contexte
    donc je vais essayer d'expliquer
    j'ai un fichier avec un ruban perso avec des control dynamique donc utilisation de myrribon.invalidate
    d'autre fichiers sont ouverts qui viennent d'autres membre d'un forum
    c'est fichiers parfois contienent des erreurs
    la je choisi deboguage pour aller corriger
    sauf que le deboguage réinitialise toute variables public ou global module dans tout les classeur
    une fois corrigé je voudrais récupérer le ruban (mes outils)
    voilà j'espère avoir été plus clair

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 536
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 536
    Par défaut
    Après recherches approfondies, je n'ai pas mieux à proposer.

    Au risque de me répéter, j'ai déjà essayé cette technique, ca s'est révélé inutilisable tellement c'est instable.
    Avec en bonus le risque de corruption du classeur, ca ne vaut pas le coup.

    Tu es en train de dire qu'une erreur d'exécution dans 1 classeur fais tomber tous les projets ?
    Pas normal, 1 seul projet est supposé s'effondrer (ou alors, il y a des dépendances que tu ne nous dit pas).

    Sinon, les bases du debugging ?
    Points d'arrêts, instruction Stop, instruction Debug.Print, exécuter en pas à pas, espions ?
    Tracking des erreurs qui peut être fait avec une classe très simple ?
    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
    '// Module de classe: ErrorLogger
    Option Explicit
     
    Private mModuleName as String
    Private mFunctionName as String
     
    Friend Sub Create(ByVal ModuleName As String, ByValFunctionName As String)
        mModuleName = ModuleName
        mFunctionName = FunctionName
    End Sub
     
    Private Sub Class_Terminate()
        If(Err.Number <> 0) Then
            Debug.Print mModuleName & "." & mFunctionName & " : " & Err.Description
        End If
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    '// Module standard: Factory
    Option Explicit
     
        '// Fonction en charge d'instancier un objet de type ErrorLogger
    Public Function CreateErrorLogger(ByVal ModuleName As String, ByVal FunctionName As String) As ErrorLogger
        Dim Logger As ErrorLogger
        Set Logger = New ErrorLogger
     
        Logger.Create ModuleName, FunctionName
        Set CreateErrorLogger = Logger
    End Function
    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
    '// Module standard: TestModule
    Option Explicit
     
    Private Const ModuleName As String = "TestModule"
     
    Public Sub TestFunction()
    On Error Goto Error    '// Gestionnaire d'erreur à déclarer uniquement pour les fonctions de plus haut niveau
        Const FunctionName As String = "TestFunction"
        Dim Logger As ErrorLogger
        Set Logger = Factory.CreateErrorLogger(ModuleName, FunctionName)
     
        SubTest
    Exit Sub
    Error:
        Stop
    End Sub
     
    Private Sub SubTest()
        Const FunctionName As String = "SubTest"
        Dim Logger As ErrorLogger
        Set Logger = Factory.CreateErrorLogger(ModuleName, FunctionName)
     
        Dim i As Long
        i = 10 / 0
    End Sub
    Lors de la destruction de l'instance de la classe ErrorLogger, si une erreur d'exécution a été levée, cette dernière est affichée dans la fenêtre d'exécution. On a alors connaissance de toute la pile des appels.
    On sais quelle fonction à levé quelle erreur.
    On sais également si l'erreur se transforme (symptôme d'une seconde erreur d'execution levée sur une première).

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/02/2007, 22h38
  2. Inclusion d'un diagramme de cas d'utilisation dans un document LaTeX
    Par noussaENSI dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 14
    Dernier message: 15/08/2006, 22h03
  3. [vb.net] fermer l'application en cas de bug
    Par arnolem dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/06/2005, 15h48

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