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

  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 : 30
    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 : 30
    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 : 30
    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

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

    Informations professionnelles :
    Activité : Retraité 72 ans

    Informations forums :
    Inscription : Mai 2011
    Messages : 244
    Par défaut
    Bonjour ARTURO83
    Je n'arrive pas à comprendre (maladie lourde excuse-moi).
    J'essaie de m'expliquer de nouveau
    'Vérification si A4 et K4 sont renseignées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cells(Target.Row, "A4") <> "" And Cells(Target.Row, "K4") <> "" Then  ‘si non Exit Sub
    'Essai Compteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub test()  'Pour que la macro ne se lance qu’une fois
        cpt = 0
        If cpt = 1 Then
            Exit Sub
        End If
    End Sub
    'MsgBox : Question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MsgBox : Question….. ?
        If MsgBox("Question ?", vbYesNo) = vbYes Then
     'si Yes
            Range("AA2").Value = ("Sup") 
        Else
     'si No
            Range("AA2").Value = ("Maj") 
        End If
    'MsgBox : 'Confirmez ….
    ‘Faut-il remettre un compteur également ici ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        If MsgBox("Confirmez", vbYesNo) = vbYes Then
            Range("AA2").Value = ("Sup")
        Else
            Range("AA2").Value = ("Maj")
        End If
    
    ‘Il faudrait un retour au début du compteur si réponse différente je pense
    
    End Sub
    'Contrôle : de confirmation
    ‘Code pour récupérer et comparer les Réponses des MsgBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If réponse MsgBox Question = réponse MsgBox Confirmation  Then
    macro 1
    Else 
    macro 2
    End If
    En te remerciant

  8. #8
    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,

    Pour que je puisse comprendre, il me manque certains éléments.
    Comment est constitué votre feuille?
    N'y a t-il qu'un seul nom en A4 et prénom en AK4 ou bien est-ce une liste de noms en colonne A et de prénoms en colonne AK, et que vous choisissez par la suite?
    Pourquoi le résultat en AA2 et pas en AA4?
    Lors d'une Maj, si vous voulez changez le contact, du fait que le nom et le prénom ne sont pas dans la même cellule, il faudra intervenir 2 fois si ces 2 éléments doivent être remplacés, mais 1 seule fois suffirait si vous ne devez en changer qu'un seul(le nom par exemple, le prénom étant identique, on ne le touche pas), comment détecter si la modification est complète ou pas?

    Cdlt

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

    Informations professionnelles :
    Activité : Retraité 72 ans

    Informations forums :
    Inscription : Mai 2011
    Messages : 244
    Par défaut
    Bonjour ARTURO
    Oui, il n'y a qu'un seul Nom en A4 et Prénom en K4 saisi manuellement et une seule fois par fiche
    Le résultat se porte en AA2 par obligation (conception de la fiche)
    Le post 7 résume me semble-t-il ce que je souhaite (le comprends-tu ?) :
    Mémoriser le clic de chaque MsgBox (ex: Oui et Oui)
    Oui étant ce qui m'intéresse le plus et comparer les réponses aux MsgBox
    Peut-être est-ce à ce moment qu'il faut écrire Sup ou Maj en AA2
    Pour le compteur je ne sais pas s'il faut une ou deux fois
    Je te remercie pour ta patience envers moi

    Un essai détourné que j'ai fait semble aller dans le sens que je désire, peux-tu me dire Stp
    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
    Sub test()    'TEST BON
    Dim reponse As String
    Dim choix As Integer
        Range("AD1:AE1").Value = ""
         If MsgBox("Question ?", vbYesNo) = vbYes Then
         Range("AD1").Value = "1"
     End If
         If MsgBox("Confirmation !", vbYesNo) = vbYes Then
         Range("AE1").Value = "1"
     End If
         If Range("AD1").Value = ("1") And Range("AE1").Value = ("1") Then
            MsgBox "réponse postive"
        Else
            MsgBox "réponse négative"
      End If
      End Sub

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

    Informations professionnelles :
    Activité : Retraité 72 ans

    Informations forums :
    Inscription : Mai 2011
    Messages : 244
    Par défaut
    J'ai finalement trouvé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
        If MsgBox("Question ?", vbYesNo) = vbYes And MsgBox("Confirmation !", vbYesNo) = vbYes Then
            MsgBox "réponse postive" 'lance macro
        Else
            MsgBox "réponse négative" 'lance macro
        End If
    End Sub

+ 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, 18h12
  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, 10h00
  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, 10h08
  4. Réponses: 6
    Dernier message: 23/05/2008, 00h15
  5. Msgbox qui s'ouvre une seule fois
    Par dan016 dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/12/2007, 14h31

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