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 :

Procédure qui s'éxécute une seconde fois à partir de la moitié [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Procédure qui s'éxécute une seconde fois à partir de la moitié
    Bonjour,

    Je souhaite vérifier dans une plage de cellules (définie en début de procédure) si la valeur saisie dans chaque cellule n'est pas supérieure à un nombre situé en tête de colonne. Si une erreur est détectée au moment de la validation de la cellule, un message apparait puis la cellule est vidée (chaine vide).
    Mon problème, c'est que je dois valider 2 fois le message, cela signifie que la procédure se déroule une seconde fois. Certes ma procédure est une Worksheet_SelectionChange, je conçois donc que remplacer le contenu d'une case contenant un nombre par une chaine vide constitue un changement qui nécessite que la procédure se relance, mais avec ma condition if isnumeric(cell), je ne comprends pas pourquoi je rentre une seconde fois dans cette partie de la procédure.

    Pour info : le "for each" en bas me sert à vérifier si il reste des cases non remplies. Si oui, un bouton de validation reste inactif.

    Voici la procédure

    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     Dim maplage As Range, note, x As Byte
     
        Set maplage = Sheets("saisie").Range(Cells(3, 2), Cells(Range("A50").End(xlUp).Row, Range("Z1").End(xlToLeft).Column))
        If Not Application.Intersect(Target, maplage) Is Nothing Then
            For Each cell In maplage
              note = Val(Right(Cells(2, cell.Column), Len(Cells(2, cell.Column)) - 2))
              If IsNumeric(cell) Then
               x = cell
                If (cell > note) Or (cell < 0) Then
                  Cells(cell.Row, cell.Column).Select
                  MsgBox ("Valeur incorrecte")
                  Selection.Value = ""
                  Exit For
                End If
              End If
            Next
     
            For Each cell In maplage
             If cell = "" Then
               CommandButton1.Enabled = False
               Exit For
             Else: CommandButton1.Enabled = True
             End If
            Next
        End If
    End Sub
    Merci pour votre aide

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Tu as en ligne 11 machin.select

    C'est normal que l'évènement est appelé au sein de la Sub

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Oui, mais je suis obligé de la faire cette sélection pour pouvoir en vider le contenu !
    Je viens essayer d'enlever cette ligne 11, du coup la procédure me vide la cellule suivante donc ça ne va pas !

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    bonjour,

    tu n'as pas besoin de sélectionner une cellule pour y accéder ..

    tu peu remplacer ton code par



    En général mieux vaut éviter d'utiliser les instruction Select, Selection , ActiveCell , ActiveSheet .... et autre dans un code VBA ..

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Effectivement cela fonctionne et ne répète pas l'événement. Cependant, je ne suis pas entièrement satisfait car quand la cellule est incorrecte, certes elle est effacée mais désormais la cellule active est celle du dessous. Je souhaiterais pouvoir laisser à l'utilisateur la possibilité d'immédiatement saisir une nouvelle valeur sans avoir à recliquer sur la cellule désormais vide.

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Points : 3 666
    Points
    3 666
    Par défaut
    Bonjour,

    dans ce cas avant ton .select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.enabledEvents = false
    Remettre à True juste après.

    eric

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Bonjour eriic...

    le .select inutile à été supprimé ..


    stepel , le curseur ne change pas de cellule, tu utilise l'événement "Selection_Change" pour exécuter ton code et donc si tu saisie une valeur la sélection est automatiquement modifiée par excel puis ton code est lancé..


    Il semble que tu n'utilise pas le bon événement, peu-être devrais tu utiliser l'événement "WorkSheet_Change" et n'agir que sur l'intersection des cellules modifiées (Target) et de ta plage et par sur toutes les cellules de ta plage (maplage).

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    stepel , le curseur ne change pas de cellule
    Désolé, bbil, mais je ne comprends pas cette affirmation car ce n'est pas le cas. Quand je valide le message qui me dit que la valeur est incorrecte, cette validation entraine le changement de cellule active en l’occurrence, elle passe à celle du dessous. Je suis donc obligé de remonter manuellement à cette cellule désormais vide (avec flèche haut, ou avec la souris). Ne puis je pas l'éviter ?

  9. #9
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Ce que je veux dire tu utilise l'événement SelectionChange pour exécuter ton code cet événement apparaît après un changement de sélection et donc lorsque tu saisie une valeur (valide ou pas) ton code ne s'exécute qu'une fois que tu as quitté la cellule saisie , dans ton cas après le déplacement du curseur à la cellule suivante suite a la validation de ta saisie..
    Il n'y as pas de déplacement de curseur dans ton code ...c'est au contraire le changement de position du curseur qui provoque l'exécution du code..

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    OK, je comprends parfaitement tes explications. Merci pour ces éclaircissements.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2007, 13h39
  2. Réponses: 4
    Dernier message: 07/05/2007, 21h20
  3. [VB.NET]Procédure qui s'éxécute plusieurs fois
    Par ropiet dans le forum Windows Forms
    Réponses: 13
    Dernier message: 25/08/2006, 17h21
  4. Réponses: 3
    Dernier message: 08/08/2005, 02h40

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