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 :

Forcer exécution de Worksheet_Change même si rien n'a été modifié


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
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut Forcer exécution de Worksheet_Change même si rien n'a été modifié
    Bonjour à tou(te)s,

    Je cherche sans succès une solution au problème suivant :

    Dans l'event Worksheet_Change, je vérifie la validité de la donnée introduite. Si la valeur est incorrecte, j'affiche une MsgBox avec un message d'erreur et quand l'utilisateur a cliqué sur OK, je resélectionne la cellule qui vient d'être vérifiée pour que l'utilisateur puisse corriger.
    Mon problème, c'est que si l'utilisateur ne change rien du tout et fait simplement Enter, le curseur passe à la cellule suivante en laissant la valeur incorrecte.
    Je voudrais pouvoir forcer l'utilisateur à modifier la valeur incorrecte.

    Comment puis-je faire cela ? Peut-on forcer l'exécution de Worksheet_Change ?

    Merci d'avance pour votre aide et bonne journée.

    Philippe

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par PhilippeHenry Voir le message
    Bonjour,

    Il suffirait peut-être d'utiliser une boucle "Tant que" ou une cellule pour contrôler la valeur saisie. Si la valeur entrée est mauvaise en fonction du résultat du contrôle, Worksheet_Change reste sur la cellule erronée et fait apparaître de nouveau le Msgbox. Une MFC permettrait de mettre en évidence également la mauvaise saisie.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Citation Envoyé par Eric KERGRESSE Voir le message
    Bonjour,

    Il suffirait peut-être d'utiliser une boucle "Tant que" ou une cellule pour contrôler la valeur saisie. Si la valeur entrée est mauvaise en fonction du résultat du contrôle, Worksheet_Change reste sur la cellule erronée et fait apparaître de nouveau le Msgbox. Une MFC permettrait de mettre en évidence également la mauvaise saisie.
    Merci. Si je reste dans Worksheet_Change, je n'aurai pas la possibilité de corriger le contenu de la cellule, je pense ...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Il faut déclarer une variable publique pour contenir l'adresse de la celle en erreur.

    Puis dans évènement sélection change vérifier si <> de "".

  5. #5
    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
    Excel est construit de telle manière que l'évènement Change est déclenché même si l'on saisit (dynamiquement ou manuellement) une valeur rigoureusement identique à celle qui était là.

    On en profite donc ainsi :

    On lui dit que la cellule que l'on sélectionne "prend" la valeur ... qu'elle avait déjà (et cela déclenche alors l'évènement Change) -->>

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Column = 2 And Target.Value <> "toto" Then MsgBox "corriger"
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Target.Column = 2 then Target.Value = Target.Value
    End Sub
    le message "corriger" sera affiché chaque fois que, se rendant dans une cellule de la colonne B, le contenu de celle-ci ne sera pas "toto"

  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
    Par défaut
    Bonjour,

    pas faisable par une simple validation de données ?
    eric

  7. #7
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Citation Envoyé par eriiic Voir le message
    Bonjour,

    pas faisable par une simple validation de données ?
    eric
    Non, la validation se fait via une fonction que j'ai écrite.
    Merci.

  8. #8
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour
    Excel est construit de telle manière que l'évènement Change est déclenché même si l'on saisit (dynamiquement ou manuellement) une valeur rigoureusement identique à celle qui était là.

    On en profite donc ainsi :

    On lui dit que la cellule que l'on sélectionne "prend" la valeur ... qu'elle avait déjà (et cela déclenche alors l'évènement Change) -->>

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
      If Target.Column = 2 And Target.Value <> "toto" Then MsgBox "corriger"
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      If Target.Column = 2 then Target.Value = Target.Value
    End Sub
    le message "corriger" sera affiché chaque fois que, se rendant dans une cellule de la colonne B, le contenu de celle-ci ne sera pas "toto"
    Ca me semble astucieux, je vais essayer. Merci !

  9. #9
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Citation Envoyé par dysorthographie Voir le message
    Bonjour,
    Il faut déclarer une variable publique pour contenir l'adresse de la celle en erreur.

    Puis dans évènement sélection change vérifier si <> de "".
    Merci, je n'avais pas pensé à cet événement. Je vais essayer.

  10. #10
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par PhilippeHenry Voir le message
    Je voudrais pouvoir forcer l'utilisateur à modifier la valeur incorrecte.
    Comment sait-on qu'une valeur est "incorrecte" ?
    Est-ce que tu utilises ce terme au sens où l'entend Excel ou en tant qu'erreur dans un exercice ?

  11. #11
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Une variante :
    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
    Option Explicit
     
    Dim Plage() As Range
    Dim indice As Integer
    Dim AncTarget As Range
     
    Const Adresses As String = "B1;B3;B5;C8"
     
    Private Sub Worksheet_Activate()
    Dim i As Integer
       ReDim Plage(3) '4 cellules concernées
       For i = 0 To 3
          Set Plage(i) = Range(Split(Adresses, ";")(i))
       Next
       indice = 0
       Set AncTarget = Plage(indice)
       AncTarget.Select
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       If Target.Cells.Count > 1 Then Exit Sub 'garde fou
       If Not AncTarget Is Nothing Then
          If AncTarget.Value = "toto" Then
             If indice < UBound(Plage) Then
                indice = indice + 1
             Else
                indice = 0
             End If
             Set AncTarget = Plage(indice)
          Else
             MsgBox "corriger"
          End If
          Application.EnableEvents = False
          AncTarget.Select
          Application.EnableEvents = True
       End If
    End Sub

  12. #12
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Bonjour,

    Une variante :
    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
    Option Explicit
     
    Dim Plage() As Range
    Dim indice As Integer
    Dim AncTarget As Range
     
    Const Adresses As String = "B1;B3;B5;C8"
     
    Private Sub Worksheet_Activate()
    Dim i As Integer
       ReDim Plage(3) '4 cellules concernées
       For i = 0 To 3
          Set Plage(i) = Range(Split(Adresses, ";")(i))
       Next
       indice = 0
       Set AncTarget = Plage(indice)
       AncTarget.Select
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       If Target.Cells.Count > 1 Then Exit Sub 'garde fou
       If Not AncTarget Is Nothing Then
          If AncTarget.Value = "toto" Then
             If indice < UBound(Plage) Then
                indice = indice + 1
             Else
                indice = 0
             End If
             Set AncTarget = Plage(indice)
          Else
             MsgBox "corriger"
          End If
          Application.EnableEvents = False
          AncTarget.Select
          Application.EnableEvents = True
       End If
    End Sub
    Merci, je vais décortiquer cela, car je ne suis pas très expérimenté encore.

  13. #13
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Merci à tou(te)s pour votre aide.
    Merci, je vais essayer vos propositions et je reviendrai à vous.
    Bonne journée.
    Philippe

  14. #14
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2013
    Messages : 14
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Comment sait-on qu'une valeur est "incorrecte" ?
    Est-ce que tu utilises ce terme au sens où l'entend Excel ou en tant qu'erreur dans un exercice ?
    la validation se fait via une fonction que j'ai écrite.
    Merci.

Discussions similaires

  1. Forcer 2 frames à la même taille
    Par sopsag dans le forum Tkinter
    Réponses: 11
    Dernier message: 21/09/2010, 19h18
  2. Exécuter mon application même si celle ci est fermer!
    Par justintak dans le forum VB.NET
    Réponses: 6
    Dernier message: 11/08/2010, 09h26
  3. Réponses: 2
    Dernier message: 28/12/2007, 11h23
  4. Différences de temps d'exécution d'une même requête
    Par hellbilly dans le forum Access
    Réponses: 3
    Dernier message: 16/12/2005, 20h56

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