none
Access 2003: impossible d'obtenir un message d'erreur explicite hors mode debug RRS feed

  • Question

  • Bonjour,

     

    J'utilise access 2003, et la fonction transferspreadsheet en VB pour importer une feuille excel.

    J'utilise la première ligne comme nom de champ.

    Les gens qui créent ce fichier excel ont le mauvais gout de changer ces noms ou d'en ajouter.

     

    je veux pouvoir afficher le nom des champs qui ne se trouvent pas dans la table cible access.

    j'utilise une procédure VB appelée par une macro.

     

    j'utilise une instruction "on error resume next" pour récupérer les erreurs

    - Quand le debugger est actif ou qu'on est en mode création de macro,

    je récupère un message d'erreur 2391 avec un texte

    indiquant que le champ machin n'est pas trouvé dans la table cible access.

    - dans le cas normal j'obtiens: error 3270, "property not found".

    comment puis-je obtenir un message d'erreur détaillé type erreur 2391 hors du mode debug ?

     

    d'avance merci


     

    lundi 5 mai 2008 10:30

Toutes les réponses

  • Bonjour,

     

    1/ Si effectivement le classeur change de structure et que les noms des champs ne sont pas figés, il est difficile d'envisager un automatisme sans le préparer au préalable....

    Il vous d'abord avec un Objet Excel via OLE ouvrir le classeur et capturer les noms des champs de la ligne où il sont posés (la première en général) grâce a un objet Range et une propriété Offset.

    De là, vous créez dynamiquement la table avec un TableDefs et y ajoutant les champs (nettoyés de leurs espaces et des leur caractères non supportés).

    Vous avez alors une table qui correspond à vos champs et pouvez donc utiliser le TransfertSpreadSheet.

     

    2/ Vous pouvez aussi en partant du même principe capturer les noms des champ et comparer avec ceux existant dans votre table. Vous pourrez alors différencier ceux présents et ceux absents...

     

    Mais dans l'idéal, il faudrait que vous envisagiez une interdiction de modification de la feuille de calcul au niveau de la structure des champs. Celui ou celle qui veux en ajouter ou en modifier un doit passer par vous.

     

     

     

    lundi 5 mai 2008 12:09
    Modérateur
  • Bonjour,

    Merci de cette réponse, mais je risque de manquer de temps pour la mettre en place et au point.

     

    Je quitte mon job et je veux passer la main sur ce que je faisais de menière artisanale.

    Je voudrais simplement récupérer le message d'erreur le plus complet possible par access.

     

    Est-ce possible à votre avis ?

     

    PS: l'idéal mentionné n'est hélas pas envisageable, et la table ne peut être recréée (liée et optimisée)

    - gg

    vendredi 9 mai 2008 05:42
  • Bonjour,

     

    Les erreurs OLE dans ce contexte sont aussi difficiles à interpréter qu'à pister.

    Dans ce genre de cas, il n'y a pas d'autres solution que de blinder la procédure d'import et la greffer d'une gestion d'erreur musclée.

    Le risque de plantage étant souvent rencontré sans que l'utilisateur y soit pour quelque chose, il est évident que si ce dernier bricole la source, il devient inévitable...

     

    Le fait de passer la main doit justement vous permettre d'expliquer ce qu'il est bon de mettre en place pour que...

    L'artisanale est incompatibilble avec le binaire. (Err 13) ;o)

     

    Que vous apportera la message d'erreur ?

    Jamais il ne vous dira un truc du style "Mon cher développeur, sauf erreur de ma part, je crois que le classeur source ne possède pas les mêmes champs que la dernière fois lorsque vous m'avez exécuté, aussi, je refuse catégoriquement de fonctionner dans ce cas, je boude et j'appelle le vilain message d'erreur !!!"

    Donc vous n'avez guère d'autres choix...

     

     

     

     

    vendredi 9 mai 2008 08:38
    Modérateur
  • Bonjour,

     

    le message d'erreur il me dit: le champ machin n'existe pas dans la table truc, ça me suffit et j'aimerais simplement pouvoir l'afficher dans tous les cas. Je ne sais pas pourquoi en mode debug j'obtiens ce message avec le "on error" et pas hors de ce mode.

     

    Pour le reste, j'ai très peu de temps à consacrer au developpement avant de partir et encore moins à la mise au point. La table est liée à d'autres tables, indexée. Changer le mode de génération du fichier excel est une tâche impossible dans une entreprise comme la mienne. Je souhaite simplement aller au plus simple: "property not found" ne sert à rien, "champ machin non trouvé" me suffit largement. y a-t-il un moyen de l'obtenir en fonctionnement normal, ou est-ce un ensemble de routines supplémentaires exécutées en mode debug qu'il faudrait réécrire ? 

    dimanche 11 mai 2008 09:27
  • Bonsoir,

     

    Pouvez-vous poster votre code pour voir ?

     

     

    dimanche 11 mai 2008 21:43
    Modérateur
  • et voilou... le même code renvoie deux messages d'erreur différents selon qu'on est en mode debug ou non.

    '

    '   transférer les données
    '
        On Error Resume Next
       
        If sheetname <> "" Then
            DoCmd.TransferSpreadsheet _
                                    tablename:=tablename, _
                                    filename:=filename, _
                                    HasFieldNames:=True, _
                                    Range:=sheetname + "!"
        Else
            DoCmd.TransferSpreadsheet _
                                    tablename:=tablename, _
                                    filename:=filename, _
                                    HasFieldNames:=True
        End If
       
        If err.Number <> 0 Then
          
            ya1err = True
            msgerr = err.Source + ": Erreur #" + CStr(err.Number) + " -- " + err.Description
            MsgBox (msgerr)
            
            err.Clear
               
        Else
            ya1err = False
    '
    '   mettre à jour l'indicateur d'update
    ...

    '
        End If

    '
        On Error GoTo 0

    '
    mardi 13 mai 2008 09:43
  • Re,

     

    Bon, que je sois en mode DEBUG ou non, ce code renvoie bien l'erreur 2391 à partir du moment où je m'amuse à modifier un nom de champ dans ma feuille de calcul :

    Code Snippet

    Option Compare Database

    Sub Test()
        On Error GoTo Test_Error
        ImportXL "MaTable", "C:\_Test\MaSource.xls"
        On Error GoTo 0
    Test_Exit:
        Exit Sub

    Test_Error:
        MsgBox "Une erreur est survenue pendant l'exécution de la procédure 'Test()'" & vbCrLf & vbCrLf & Err.Description, vbExclamation, "Error #" & Err.Number
        Resume Test_Exit
    End Sub

    Private Sub ImportXL(TableName As String, Filename As String)
        DoCmd.TransferSpreadsheet TableName:=TableName, Filename:=Filename, HasFieldNames:=True
    End Sub

     

     

    Il faut éviter le On Error Resume Next tant que vous ne maîtrisez pas sa portée. On utilise cette instruction lorsque l'on sait qu'une erreur va ou risque d'être levée et que l'on est en mesure de contrôler le code pour ne pas perdre la main...

    Par exemple, on peut l'utiliser pour supprimer une feuille Excel dans un classeur alors qu'il est possible que celle-ci ait déjà été supprimée mais il faut dans ce cas réinitialiser le gestionnaire d'erreur et détruire l'objet Err avec un Clear.

    P.S. Bien cela ait rien à voir, évitez aussi d'utiliser le + pour la concaténation de chaînes

     

    mardi 13 mai 2008 13:25
    Modérateur
  • Merci de ta réponse, mais... même problème.

     

    quand je clique sur l'onglet macros, double clic sur la macro test (changé le sub en fonction) , j'obtiens l'erreur "propriété non trouvée".

    un comportement qui dépend de la version et/ ou de l'environnement ? je suis en access 2003 SP3

     

    jeudi 15 mai 2008 09:47
  • Re,

     

    Changer en fonction ne sert strictement à rien.

    Bon, prenons le taureau par les cornes avec un peu d'huile de coude et allons-y...

     

    Créez une base avec une table à 3 champs Nom, Prénom, Age avec les bons types - Cette table est nommée MaTable.

    Dans un classeur Excel, ajouter 4 lignes avec des valeurs quelconques en considérant que la ligne 1 contient les valeurs Nom, Prénom, Age...

     

    Nom Prénom Age
    DURANT Jean 22
    DUPONT Pierre 32
    FAVIO Cécile 28
    GIRARD Jeanne 27

     

    Enregsitrez ce classeur dans C:\Test\MaSource.xls  puis fermez le classeur...

    Dans un module de la BDD Access où vous avez créé la table, copiez ce bloc de code :

    Code Snippet

    Option Compare Database

    Sub Test()
        On Error GoTo Test_Error
        ImportXL "MaTable", "C:\Test\MaSource.xls"
        On Error GoTo 0
    Test_Exit:
        Exit Sub

    Test_Error:
        MsgBox "Une erreur est survenue pendant l'exécution de la procédure 'Test()'" & vbCrLf & vbCrLf & Err.Description, 16, "Error #" & Err.Number
        Resume Test_Exit
    End Sub

    Private Sub ImportXL(TableName As String, Filename As String)
        DoCmd.TransferSpreadsheet TableName:=TableName, Filename:=Filename, HasFieldNames:=True
    End Sub

     

     

    Enregistrez le tout.

    Mettez votre curseur dans la procédure Test et appuyez sur F5.

    Retournez dans la table MaTable et voyez, les données sont importées.

    Réouvrez le classeur Excel et changez la valeur de cellule B1 (où il y a Prénom) en Prenom, donc, vous supprimez l'accent.

    Fermez et enregistrez le classeur de nouveau puis retournez dans votre module au niveau de la procédure Test().

    Appuyez sur F5...

    Quelle erreur affichez-vous cette fois ?


     

     

    jeudi 15 mai 2008 16:08
    Modérateur
  • Merci, J'avais fait ce genre d'essai, sans changement. Je viens de le refaire, avec les mêmes résultats.

     

    J'ai une macro access "test" qui fait: ExecuterCode Test() ' la raison pour laquelle j'ai fait une fonction

    quand j'ouvre l'onglet "macros" de access et que je double clique sur la macro "test" j'ai le message "propriété non trouvée". dans tous les autres cas notamment quand j'exécute la procédure directement à partir du debugger j'ai le bon message d'erreur.

    vendredi 16 mai 2008 13:14
  • Re,

     

     

    Ce que vous êtes en train de préciser, c'est que si vous lancez la macro Test, vous n'avez pas l'erreur et si vous passer par le module, vous l'avez ?

    Mais pourquoi donc passez-vous par une macro ?

     

    samedi 17 mai 2008 12:42
    Modérateur
  • la macro appelle le module, cela me semblait le plus rapide à développer pour proposer une action aux utilisateurs.

    reproduisez-vous le problème en utilisant la macro ?
    lundi 19 mai 2008 10:15
  • Re,

     

    Non, avec la macro, cela fonctionne tout aussi bien : Je lève bien l'erreur 2391 avec un message explicite, ce qui est somme toute normal.

    Le souci, dans votre cas, vient d'ailleurs.

    Vous me dite avoir essayé l'exemple que je vous ai expédié dans mon avant-avant dernier message où vous n'arriviez pas à obtenir satisfaction. Mais l'avez-vous fait tel que je l'ai proposé sans modifier quoi que ce soit et en en partant du début (en fait, là, on est sûr que vous avec une source faible) ?

     

     

     

     

     

    lundi 19 mai 2008 12:17
    Modérateur
  • Ah, on progresse:

     

    j'ai créé un module spécifique test2391, et J'ai rajouté une fonction

     

    Function testabc()

     

        test
       
    End Function

    pour pouvoir être appelé d'une macro (je ne sais pas appeler une sub directement par une macro)

     

    quand j'exécute la macro dans mon référentiel existant, le pb subsiste.

    quand je crée une base vide, en important la macro et le module du référentiel, le pb disparaît.

     

    quand je vire tous les autres modules de la base initiale le pb subsiste

    quand je vire toutes les requetes, formulaires, etats, macros autres que test, le pb subsiste.

     

    quand il me reste deux bases avec un contenu identique l'une marche l'autre pas. Je ne sais plus où chercher.

    elles sont toutes deux en format 2002/2003.
    mardi 20 mai 2008 08:49
  • Ca y est, j'ai trouvé. Essayez de passer votre affichage en "détails" et non en "liste" :-) .

    pour moi ca marche normalement si on affiche en "liste" et ca ne marche pas si j'affiche en "détails".
    mardi 20 mai 2008 09:15
  • Eh bien c'est parfait...
    Bonne journée.

    mardi 20 mai 2008 10:30
    Modérateur