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 :

Err.Raise provoque une erreur Automation "Il n'y a pas de connexion pour cet identificateur de connexion" [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Points : 127
    Points
    127
    Par défaut Err.Raise provoque une erreur Automation "Il n'y a pas de connexion pour cet identificateur de connexion"
    Bonjour,

    je programme un objet personnel. Dans cet objet, j'ai besoin de faire remonter des erreurs au code appelant dans certaines conditions. Du coup, j'utilise le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Err.Raise Number:=vbObjectError + 4, Description:="Description de mon problème perso"
    L'idée étant de traiter ce type d'erreur dans le code appelant. Problème : le fait de soulever une erreur me provoque une erreur :

    Erreur d'exécution '-2147221500 (80040004)':

    Erreur Automation
    Il n'y a pas de connexion pour cet identificateur de connexion


    Qu'est ce qui pose problème dans mon code ? Comment le régler ?

    NB : a priori, ce ne serait pas lié au +4 que j'applique au vbObjectError. J'ai testé avec 40 et j'ai le même problème.
    NB 2 : si j'utilise + 4, c'est que j'ai un +1, +2, +3.

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Et en traitant l'erreur dans le code appelé ?
    Peux-tu poster le code afin que l'on puisse faire des tests ?

    Hervé.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Salut,

    Il ne faut pas utiliser VbObjectError.

    J'ai fais quelques tests et voici ce que j'ai conclu (en espérant ne pas faire de mauvaise conclusion ):


    Lorsque au moins un des appel (à travers toute la chaine des appels) passe par un module de type objet, la gestion d'erreur n'est pas interprété de la même façon que lorsqu' aucun des appelant n'est de type objet.
    Un module de classe ne doit pas être considéré comme étant objet.

    Exemple:
    Appel1 : Module1.Sub() => Appel2
    Appel2 : ThisWorkbook.Sub() => Appel3
    Appel3 : Classe1.Sub() => Erreur déclenché ici

    Ici, sur ce schéma, c'est une procédure placé dans un module objet (l'objet ThisWorkbook) qui appel la classe déclencheuse de l'erreur. L'un des appel passe par un module objet.
    Si l'err.Number utilise vbObjectError, le numéro d'erreur semble empiéter sur d'autres erreurs (en fonction du nombre qui est additionné avec cette constante).


    Il faut que ton Err.Number utilise un numéro compris entre 513 et 65535 (inclus pour tous les 2). En revanche, il y a toujours ce bogue qui fais que la description de l'erreur n'est pas bonne si l'un des appelant est un module objet.


    Je donne un exemple (certe pas très bien fait):
    Il faut 4 Module pour le test dans un project nommé VBAProject:
    • 1 Module standard : Module1
    • 1 Module object : ThisWorkbook (mais avec d'autre, ça devrai aussi fonctionner)
    • 2 Modules de classes, mais 1 seule peut suffire) : Classe1, Classe2



    Module1 :
    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
     
    Option Explicit
    Option Private Module
     
    Private Enum Choix
        SansPassageParModuleObject = 0
        AvecPassageParModuleObject
    End Enum
     
    Public Sub MainTest()
     
        Dim mChoix As Choix
        Dim Choix As VBAProject.Choix
        Dim ex As VBA.ErrObject
     
        ' Pour la fenêtre de "variables locales" (sinon,
        '  passer par la fenêtre "espions")
        Set ex = Err
        ' Choisir l'un des 2 choix
        mChoix = AvecPassageParModuleObject
        ' Choisir l'un des 4 choix disponible
        Choix = Choix1
     
        On Error GoTo GestErr
     
        If mChoix = AvecPassageParModuleObject Then
            Feuil1.TestFromModuleObject Choix
        End If
        With New Classe1
            .TestErreur Choix
        End With
     
    Exit Sub
    GestErr:
        MsgBox "Numéro : " & Err & vbCrLf & _
               "Description : " & Err.Description & vbCrLf & _
               "Source : " & Err.Source
    End Sub
    ThisWorkbook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Sub TestFromModuleObject(Optional Arg As Choix = None)
        With New Classe1
            .TestErreur Arg
        End With
    End Sub
    Classe1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Public Sub TestErreur(Optional Arg As Choix = None)
        With New Classe2
            .TestErreur Arg
        End With
    End Sub
    Classe2 :
    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
     
    Public Enum Choix
        None = 0
        Choix1
        Choix2
        Choix3
        Choix4
    End Enum
     
    Public Sub TestErreur(Optional Arg As Choix = None)
     
        Dim n As Long
        Dim Selection As Choix
     
        ' Ici, au besoin, essayer différentes valeur manuellement:
        Selection = Arg
     
        Select Case Selection
            Case None: Exit Sub
            Case Choix1: n = vbObjectError + 4 'Non Ok si l'un des appels passe par un module object
                                               'Ok si aucun des appelant à travers toute la chaine des appels est un module object
            Case Choix2: n = 9 'Non Ok car dans la plage 0~512, alors conflit
            Case Choix3: n = 512 + 1 'Ok car dans la plage 513~65535
            Case Choix4: n = 65535 + 1 'Non Ok car > 65535. Erreur code 5
        End Select
     
        Err.Raise Number:=n, Description:="Description de mon problème perso"
     
    End Sub
    Dans le VBAProject.Module1.MainTest(), tu peux modifier mChoix et Choix, et c'est tout.
    Voilà.

    P.S.: Il y a plus simple comme exemple, je dis pas .

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Points : 127
    Points
    127
    Par défaut
    Merci à tous les deux.

    Nouveau2 : je n'ai pas compris ton exemple, j'ai tenté de le reproduire à l'identique, mais lorsque je lance la sub maintest(), j'ai un message d'erreur.

    Mais c'est pas grave, j'ai lu ton explication et effectivement quand je mets exactement le même code dans un module (et avec des numéros d'erreur fixes), tout fonctionne parfaitement. Du coup, je vais utiliser ça, même si pour être franc, je n'ai pas compris pourquoi un appel depuis une feuille ne fonctionne pas (d'un point de vue logique, mais je crois qu'il n'y en a pas...)

    Le problème est résolu pour moi, si jamais quelqu'un a une explication logique à donner à ce mystère de VBA, ça m'intéresse malgré tout.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut,

    Oui, effectivement, j'ai oublier de dire que les 2 classes doivent être déclaré en Public, et il faut remplacer Feuil1.TestFromModuleObject Choix par Thisworkbook.TestFromModuleObject Choix en ligne 27 du Module1.

    Mais de toute façon, c'était juste pour montrer qu'une différence d'interprétation de l'erreur avait lieu lorsqu'un appel était effectué depuis un objet et cela même si l'appel initial (le 1er appel) n'est pas un objet.

    Dans l'exemple, l'appel initial (1er appel) est un module standard, puis le 2ème appel est un module objet (Thisworkbook), puis le 3ème appel est un module de classe, puis ce dernier appel un module de classe (Classe2). Dans Classe2, Une erreur est déclenché avec Err.Raise.

    L'énumération (Enum) dans le module standard permet de faire la même chaine d'appel à l'exception que ca ne passe plus par un module objet (Thisworkbook).

    Citation Envoyé par ANOVA Voir le message
    Le problème est résolu pour moi, si jamais quelqu'un a une explication logique à donner à ce mystère de VBA, ça m'intéresse malgré tout.
    Oui, ça pourrai être intéressant de connaitre la raison.
    Dernière modification par AlainTech ; 20/07/2014 à 13h05. Motif: Fusion de 2 messages

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

Discussions similaires

  1. [Threads] Savoir si un thread a provoqué une erreur
    Par anykeyh dans le forum Windows
    Réponses: 6
    Dernier message: 26/04/2006, 15h12
  2. msaccess a provoqué une erreur dans KERNEL32.dll
    Par massol joel dans le forum Access
    Réponses: 12
    Dernier message: 03/04/2006, 14h32
  3. Cells (1,1) provoque une erreur
    Par Opo dans le forum Access
    Réponses: 9
    Dernier message: 07/03/2006, 16h29
  4. [SGBD] mysql_fetch_array provoque une erreur
    Par nicerico dans le forum Requêtes
    Réponses: 6
    Dernier message: 06/10/2005, 14h20
  5. Select Case provoque une erreur
    Par defluc dans le forum SQL
    Réponses: 6
    Dernier message: 14/08/2005, 23h59

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