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 :

macro qui s'exécute une seule fois [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Retraité 72 ans
    Inscrit en
    Mai 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité 72 ans

    Informations forums :
    Inscription : Mai 2011
    Messages : 244
    Par défaut macro qui s'exécute une seule fois
    Bonjour les amis et les crack du forum,
    Je ne connais pas grand chose en Vba, ce que je désire obtenir sur une feuille protégée ou je patauge :

    Si en A4 (nom de la personne Col A) et en K4 (son prénom Col B) sont inscrits.
    Avoir une macro qui demande (essai ci-dessous) par MsgBox, mais, car il y a un mais, elle ne doit se déclencher qu'une seule fois.

    Ma principale difficulté est que j'aimerai que cette macro ne se lance que dès que je change la valeur de ces 2 cellules Colonne A et B et seulement pour les cases qui viennent d'être modifiées.

    Je crains qu'elle ne se lance à chaque changement dans la feuille. Peut être faut-il ajouter un compteur (je ne sais pas faire, ni me passer des .Select).

    En vous remerciant car je compte vraiment sur vos connaissances. Un grand merci si vous acceptez de me mettre le code entier rectifié.

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
    ...... codes qui précèdent
     
    Sheets("feuil1").Select
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ......codes existants.
    Range("A4"].Value <> "" and Range("K4").Value <> "" 
     
        If MsgBox("Ce contact doit-il être supprimé des données ?", vbYesNo) = vbYes Then  
           Range("AA2").Value = ("Sup")
        Else
           Range("AA2").Value = ("Maj")
        End If
     
        If MsgBox("Confirmez-vous la suppression de ce contact?",vbYesNo)=vbyes       
             Call CfnMsgBox
        Else
            Range("A4").Select
        End If
    End Sub

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,

    En fonction de ce que vous avez écrit, il suffit de détecter dans la colonne AA s'il y a déjà eu une mise à jour "Maj", si c'est le cas alors on ne pourra plus modifier les valeurs en colonnes A et B (sauf autorisation).
    Votre code modifié, même si ce n'est peut-être pas tout à fait ce que vous attendez, cela vous mettra sur la voie pour l'adapter à votre guise.

    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
    Private Sub Worksheet_Change(ByVal Target As Range)
        Application.EnableEvents = False
        If Target.Column <= 3 Then 'si la cellule sélectionnée est en colonne A ou B, sinon on sort du programme
            If Cells(Target.Row, "A") <> "" And Cells(Target.Row, "K") <> "" Then 'Si A et K ne sont pas vides
                If Cells(Target.Row, "AA") = "Maj" Then 'Si sur la même ligne en colonne AA, la Maj a déjà été faite
                    If MsgBox("Ce contact a dèjà été modifié, voulez-vous le modifier une nouvelle fois?", vbYesNo) = vbYes Then 'Demande d'autorisation d'une nouvelle modification
                        Application.EnableEvents = True 'Si la réponse est "oui", on accepte la modification
                        Exit Sub
                    Else
                        Application.Undo 'si la réponse est "non", on restitue la donnée d'origine
                        Application.EnableEvents = True
                        Exit Sub
                    End If
                End If
                If MsgBox("Ce contact doit-il être supprimé des données ?", vbYesNo) = vbYes Then
                    If MsgBox("Confirmez-vous la suppression de ce contact?", vbYesNo) = vbYes Then
                        Call CfnMsgBox
                        Application.EnableEvents = True
                        Exit Sub
                    End If
                Else
                    Cells(Target.Row, "AA") = "Maj" 'ceci empêchera toutes nouvelles modifications sans accord
                End If
            End If
        End If
        Cells(Target.Row, "A").Select
        Application.EnableEvents = True
    End Sub
    Cdlt

  3. #3
    Membre éclairé
    Homme Profil pro
    Retraité 72 ans
    Inscrit en
    Mai 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité 72 ans

    Informations forums :
    Inscription : Mai 2011
    Messages : 244
    Par défaut
    Bonjour ARTURO83, content de te retrouver.
    Le code ne fonctionne pas chez moi.
    Ce que je souhaite, c'est que le style de macro :
    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
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ......codes existants.
    Range("A4"].Value <> "" and Range("K4").Value <> "" 'vérifie que A4 & K4 sont renseignées 
     
        If MsgBox("Ce contact doit-il être supprimé des données ?", vbYesNo) = vbYes Then   'Action demandée
           Range("AA2").Value = ("Sup")
        Else
           Range("AA2").Value = ("Maj")
        End If
     
        If MsgBox("Confirmez-vous la suppression de ce contact?",vbYesNo)=vbyes       'Demande la confirmation de l'action
             Call CfnMsgBox
        Else
            Range("A4").Select
        End If
    End Sub
    Que ce code ne s'exécute qu'une seule fois.
    Le contenu de AA2 déclenchant une autre macro.
    En te remerciant.

  4. #4
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Le code ne fonctionne pas chez moi.
    C'est à dire, qu'est-ce qu'il ne fait pas?
    Avez-vous remplacé votre procédure par celle-ci? La mienne réagit au changement de valeur, pas à la sélection de cellule. Private Sub Worksheet_Change(ByVal Target As Range) à la place de Private Sub Worksheet_SelectionChange(ByVal Target As Range)Ma procédure fonctionne lorsque une valeur dans une cellule de la colonne A ou B est modifiée, le problème est que si on change un nom (colonne A), la cellule en AA afficherait "Maj", or si on voulait changer aussi le prénom, on ne pourrait plus, d'où le fait d'avoir ajouté une question supplémentaire qui autorise la modification du prénom.
    Si vous tenez à verrouiller la macro lorsque "MAj" est inscrit, il suffit de vérifier la présence de cette valeur "Maj" et de quitter si elle est présente.
    Cdlt

  5. #5
    Membre éclairé
    Homme Profil pro
    Retraité 72 ans
    Inscrit en
    Mai 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité 72 ans

    Informations forums :
    Inscription : Mai 2011
    Messages : 244
    Par défaut
    Après plusieurs essai, la macro se lance après avoir saisi un nom ce qui ne va pas.
    Elle doit se lancer SEULEMENT si le nom est saisi en A4 et le prénom en K4

    D'autre part, j'ai trouvé ceci pour que la macro ne s'exécute qu'une fois, mais je ne sais ou le mettre et si c'est bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        If cpt = 1 Then 
    Exit Sub
        cpt = 1

  6. #6
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 241
    Par défaut
    Bonjour,
    A la première sélection que ce soit le nom ou le prénom, on marque d'un point(.) en colonne K.
    A la deuxième sélection, on marque "Maj". (Car il faut bien au moins 2 sélections pour changer un fois le nom et une fois le prénom)
    Une troisième sélection est impossible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        Application.EnableEvents = False
        If Target.Column = 1 Or Target.Column = 11 Then
            If Cells(Target.Row, "AA") <> "Maj" Then
                If Cells(Target.Row, "AA") = "." Then Cells(Target.Row, "AA") = "Maj"
                If Cells(Target.Row, "AA") = "" Then Cells(Target.Row, "AA") = "."
            Else
                Cells(Target.Row, 2).Select
            End If
        End If
        Application.EnableEvents = True
    End Sub
    Cdlt

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

Discussions similaires

  1. code qui s'exécute une seule fois
    Par sam01 dans le forum Langage
    Réponses: 7
    Dernier message: 04/06/2010, 17h12
  2. Ecran qui s'affiche une seule fois lors de l'ouverture d'eclipse
    Par menzlitsh dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 01/06/2009, 09h00
  3. lu tous les jours mais exécuté une seule fois par mois
    Par sianto dans le forum Scripts/Batch
    Réponses: 13
    Dernier message: 17/11/2008, 09h08
  4. Réponses: 6
    Dernier message: 22/05/2008, 23h15
  5. Msgbox qui s'ouvre une seule fois
    Par dan016 dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/12/2007, 13h31

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