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.Number étrange sur Worksheets("MaFeuille").Activate


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2014
    Messages : 14
    Par défaut Err.Number étrange sur Worksheets("MaFeuille").Activate
    Bonjour à tous !

    Dans mon application, je souhaite afficher un message d'erreur à l'utilisateur si la feuille à ouvrir n'existe pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub TestActivate()
     
        On Error Resume Next
        ActiveWorkbook.Worksheets("Données").Activate    '[OU] Workbooks("MonCalsseur").Worksheets("Données").Activate [OU] Worksheets("Données").Activate [OU] Sheets("Données").Activate
     
        If Err <> 0 Then
            MsgBox Err.Number
            MsgBox " La Feuille ""Données"" est inexistante !", vbCritical, "Message d'erreur"
            End
        End If
     
    End Sub
    La feuille "Données" existe déjà dans mon classeur et pourtant la procédure me retourne le message erreur.

    Lorsque j’exécute cette procédure directement depuis la feuille "Données", tout se déroule correctement; mais si je l’exécute depuis une autre feuille du classeur, Err.number prend la valeur 9 et le message d'erreur s'affiche !

    De plus, si je met en commentaire la condition "If Err <> 0 then [...] End If", la procédure s'exécute correctement sans me retourner la moindre erreur...


    Pour info, je suis sur Excel version 2007, et les références actives sur mon projet sont :

    Nom : 777.jpg
Affichages : 206
Taille : 7,7 Ko

    J'ai trouvé un cas similaire au mien (voir http://www.developpez.net/forums/d84...me-err-number/); le problème venait du complément "EUROTOOLS" qui était activé mais ce n'est pas le cas dans mon projet.

    Je n'ai aucune idée d'où peut venir cette erreur et j’espère que vous aurez des pistes XD

    Merci d'avance,
    Yetman333

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Bonjour à toi,

    Déjà il aurait ete plus judicieux de posté ton problème dans la section VBA Excel.....
    Ensuite je te suggère plutôt de procéder comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
        Dim sht As Worksheet
     
        If wb Is Nothing Then Set wb = ThisWorkbook
        On Error Resume Next
        Set sht = wb.Sheets(shtName)
        Err.Clear
        On Error GoTo 0
     
        SheetExists = Not sht Is Nothing
     End Function
    Cette fonction renvoi Vrai si la feuille existe et faux sinon, donc dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub TestActivate()
        If SheetExists("Données") Then
            ActiveWorkbook.Worksheets("Données").Activate
        Else
            MsgBox " La Feuille ""Données"" est inexistante !", vbCritical, "Message d'erreur"
        End If
    End Sub

  3. #3
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Bonjour,

    pour vérifier si une feuille existe voir aussi cette discussion dans le bon forum

    ______________________________________________________________________________________________________

    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion …

    ______________________________________________________________________________________________________
    Je suis Paris, Charlie, Bruxelles, …

  4. #4
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    @Marc-L : Pour info ton code est extrêmement plus lent que celui que j'ai fournit ici.....
    Test effectué avec un boucle For de 1 à 10000
    Ton code => 117,48 secondes
    Mon code => 0,02 secondes

    Et sur 5 feuilles :
    Ton code => 0,05 secondes
    Mon code => 0 secondes

    Donc pour 5 feuilles ton code est déjà plus de 2 fois plus lent que le miens pour 10000 feuilles.......

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Franchement dans cette discussion il s'agit juste de vérifier une feuille ‼

    Et pour ceux ne connaissant pas le B-A-BA d'Excel mais désirant du "pur" VBA
    il y a bien plus simple : voir cette autre discussion toujours dans le bon forum, à bon entendeur …

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Heu...... C'est n'importe quoi la, tu propose un code équivalent à celui que j'ai posté !
    Et tu ne fait même pas d'Err.Clear !
    Certes il est plus court en lignes ok.
    Mais le mien aussi tiens en 3 lignes dans ce cas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
        If wb Is Nothing Then Set wb = ThisWorkbook
        On Error Resume NexT 
        SheetExists = Not wb.Sheets(shtName) Is Nothing
     End Function
    On est pas la pour faire un concours de.....

    Si je suis ré-intervenu c'est que je ne trouve pas correcte d'utiliser Evaluate pour aller vérifier si une feuille existe et que ce n'est absolument pas performant !

    C'est quoi cette réflexion de dire qu'il ne s'agit ici que d'une feuille ?
    Alors on peux utiliser un code lent ? On s'en fiche ?
    Donc le mec il va faire une macro avec que du code lent parce que comme il connait pas VBA ben on va lui donner des trucs comme ça.
    Donc ce qui se ferais de manière rapide normalement va prendre plusieurs secondes........

    Et le jour où il va réutiliser son code hein ! Pour aller tester plusieurs feuilles....

    Et si tu réfléchis un peu, tu crois que IsObject commence par tester quoi d'après toi ????

  7. #7
    Membre averti
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2014
    Messages : 14
    Par défaut
    Bonjour !

    Merci pour vos réponses et diverses solutions !

    Je ne m'attendais pas à tant de débat autour d'une telle discussion XD.
    Dans mon contexte, je préfère utiliser la première solution qui me convient parfaitement.

    Merci encore

  8. #8
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par cerede2000 Voir le message
    Heu...... C'est n'importe quoi la, tu propose un code équivalent à celui que j'ai posté !
    Et tu ne fait même pas d'Err.Clear !
    As-tu au moins vu la date de mon code au moins ? Trois ans ! Donc tu ne m'apprends rien …
    Et non il n'est pas équivalent au tien, il est plus simple et plus performant, vu que tu t'en vantais !

    Et quid de la "performance" pour ne tester qu'une seule feuille, purée ‼
    La méthode Evaluate fonctionnant est donc correcte et suffisante pour tester une feuille …

    Pour ta gouverne Err.Clear ne sert à rien ni dans mon code et encore moins dans le tien vu
    On Error Goto 0 réinitialisant automatiquement l'objet Err


    Citation Envoyé par cerede2000 Voir le message
    On est pas la pour faire un concours de.....
    C'est justement ce que tu as l'air de pratiquer ces derniers jours !
    Donc un peu de diplomatie dans ta manière de répondre ne serait pas superflue …

  9. #9
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Et non il n'est pas équivalent au tien, il est plus simple et plus performant, vu que tu t'en vantais !
    Facile à vérifier alors tiens vas y amuse toi !
    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
    Function ExistSheet(Ws$, Optional wb As Workbook) As Boolean
             If wb Is Nothing Then Set wb = ActiveWorkbook
             On Error Resume Next
             ExistSheet = IsObject(wb.Sheets(Ws))
    End Function
     
    Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
        If wb Is Nothing Then Set wb = ThisWorkbook
        On Error Resume Next
        SheetExists = Not wb.Sheets(shtName) Is Nothing
     End Function
     
     Sub testMARCL()
        Dim t As Single
        t = Timer
        For i = 1 To 10000
            ExistSheet "sheet" & i
        Next
        Debug.Print Timer - t
    End Sub
     
     
    Sub testCEREDE2000()
        Dim t As Single
        t = Timer
        For i = 1 To 10000
            SheetExists "sheet" & i
        Next
        Debug.Print Timer - t
    End Sub
    Bizarrement mon code est plus rapide que le tient.....
    Franchement je n'ai pas chercher à te montrer quoi que ce sois, c'est quand même toi qui est venu sur ce topic pour montrer quelque chose que je trouve totalement fou ! Tester l'existence d'une feuille avec Evaluate n'as aucun intérêt point.
    Après tu viens mettre un lien vers un de tes posts de 2013 !!
    Super tu crois que je t'es attendu pour faire ce code ????
    Et en plus tu te permet de critiquer le mien qui est identique sinon plus rapide !
    Sache que la version que j'utilise dans mes classeurs est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
        If wb Is Nothing Then Set wb = ThisWorkbook
        On Error Resume Next
        SheetExists = Not wb.Sheets(shtName) Is Nothing
     End Function
    J'ai rajouté les autres futilités pour que ce soit légèrement plus propre. On ne va pas débattre du Err.Clear, il n'est peut être pas nécessaire certes je te l'accorde sans problèmes.

  10. #10
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut

    Hé là, ce n'est plus ton code d'origine ‼
    Tiens c'est marrant tu corriges après coup !

    Évidemment si tu avais posté directement ce dernier code …

  11. #11
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    ..........................................................
    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
    Function SheetExists(shtName As String, Optional wb As Workbook) As Boolean
        Dim sht As Worksheet
     
        If wb Is Nothing Then Set wb = ThisWorkbook
        On Error Resume Next
        Set sht = wb.Sheets(shtName)
        Err.Clear
        On Error GoTo 0
     
        SheetExists = Not sht Is Nothing
     End Function
     
     Function ExistSheet(Ws$, Optional wb As Workbook) As Boolean
             If wb Is Nothing Then Set wb = ActiveWorkbook
             On Error Resume Next
             ExistSheet = IsObject(wb.Sheets(Ws))
    End Function
     
    Sub testMARCL()
        Dim t As Single
        t = Timer
        For i = 1 To 10000
            ExistSheet "sheet" & i
        Next
        Debug.Print Timer - t
    End Sub
     
     
    Sub testCEREDE2000()
        Dim t As Single
        t = Timer
        For i = 1 To 10000
            SheetExists "sheet" & i
        Next
        Debug.Print Timer - t
    End Sub
    Même avec mon code d'origine elle est plus rapide.......

  12. #12
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Ben voyons ‼

    En tout cas pas toujours de mon côté, et ce dès le premier test :



    Au pire elles sont équivalentes !
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent …

    ______________________________________________________________________________________________________
    Passer pour un idiot aux yeux d’un imbécile est une volupté de fin gourmet. (Georges Courteline)

  13. #13
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    Citation Envoyé par Marc-L
    C'est dommage que parfois tu sois aussi lourd que tu as l'air intelligent…
    Je valide ! Direct dans ma signature !

    Nos machine sont complaisante avec leur maître en fait !

  14. #14
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Citation Envoyé par cerede2000 Voir le message
    Nos machine sont complaisante avec leur maître en fait !


    J'ai demandé à Intel de me livrer des processeurs sur mesure !

    Franchement ta signature, c'est un peu osé ! J'espère ne pas avoir de problème en retour …

    Trêve de plaisanteries, à partir de la version 2010 il y a eu une optimisation et il peut y avoir de sacrés écarts
    avec des versions inférieures, je l'ai constaté par exemple avec l'objet QueryTable sur une source web …

  15. #15
    Membre Expert
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juillet 2004
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 725
    Par défaut
    De problèmes ?
    Ben pourquoi, franchement quand je l'ai lu ça m'as bien fait rire ! J'adore !

    Au boulot j'ai une VM XP-2003 je testerais demain pour voir tiens !

  16. #16
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour yetman333
    1) Ton code, tel qu'il était écrit (ton tout premier message) est bon.

    2) le placer (comme tu l'as fait) dans une routine dont tu sors en cas d'erreur ne nécessite nullement de "On Error goto 0", ni de "err.clear"). Aucune forme de nettoyage n'est dans ce cas nécessaire, puisque la gestion concernée ne "vit" que tant que vit la routine dans laquelle elle est faite.

    3) Venons-en à l'essentiel :
    Tu as écrit :

    La feuille "Données" existe déjà dans mon classeur et pourtant la procédure me retourne le message erreur.
    Cela indique très nettement que le nom de la feuille en cause n'est pas très exactement "Données". Il est probable qu'il contient un espace malencontreux après son dernier caractère.Renomme proprement cette feuille.

    EDIT :
    J'ajoute ceci (à toi d'écrire ensuite ce qu'il convient d'écrire) :
    Il n'est jamais très adroit de laisser l'utilisateur saisir (avec tous les risques d'erreur induits d'erreur de saisie) le nom de la feuille à traiter.
    Il est de très loin préférable de lui offrir, dans une liste déroulante, les seules feuilles présentes.
    Comment en connaître les noms ? ce sont tout simplement ceux (propriété Name) des feuilles de la collection Worksheets.
    On peut en profiter, le cas échéant, pour ne proposer ainsi, en plus, que les feuilles que l'on permet (on n'inclut pas les autres dans la liste déroulante).
    Voilà . C'est là mon avis. Fais-en maintenant ce que tu veux en faire ou non.

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

Discussions similaires

  1. Numéro d'erreur unique VB.NET ? comme err.number sur vb6
    Par moris7 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 02/07/2008, 15h25
  2. [Quote] DVP quoté sur Bashfr
    Par Skyounet dans le forum La taverne du Club : Humour et divers
    Réponses: 16
    Dernier message: 26/09/2006, 19h52
  3. Problème sur Request.ServerVariables("QUERY_STRING"
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 25/03/2005, 12h47

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