Msgbox de confirmation [Résolu]

Signaler
Messages postés
2
Date d'inscription
mardi 5 février 2008
Statut
Membre
Dernière intervention
6 février 2008
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour a tous,

Tout d'abord sachez que je débute en VBA. Ne m'en voulez pas si je n'arrive pas a suivre ^^

Voila mon soucis:

J'ai créer un classeur excel avec diverses données.
Pour une plage de données je ne veux pas que quelqu'un modifie les valeurs par inadvertance. Je souhaitais donc créer une msgbox qui demande à la personne modifiant ces valeurs si elle est bien sur de vouloir le faire (car modifier une de ces valeurs revient a modifier toutes les autres données qui partent de la par le calcul)

J'ai donc créer ma box avec la question (souhaitez vous vraiment modifier cette cellule?) et mes deux boutons (oui/non)

Lorsque je clique sur Oui, nikel, la box se ferme et ma cellule est modifiée
Lorsque je clique sur Non, le probleme survient... je n'arrive pas a faire en sorte que la donnée précédente reprenne sa place. Soit ca donne une boucle qui me relance la box, soit ca fais exactement la meme chose que quand je clique sur oui.

Je vous affiche mon ébauche VBA:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("D5:D68")
reponse = MsgBox("Etes-vous sûr(e) de vouloir modifier cette valeur?", vbYesNo + vbQuestion, "Confirmation")
If reponse = vbYes Then
   Exit Sub
End If
If reponse = vbNo Then
Application.SendKeys "{ESC}" 'j'avais essayé application.undo avant ca'
End If
End Sub

J'ai un autre soucis qui fait que la msgbox s'etend a toutes les cellules de la feuille... est ce normal?

Merci de bien vouloir m'aider.

6 réponses

Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
16
Salut,

Inspire-toi de ceci

Option Explicit

Dim Valeur As Variant
Dim EnEdition As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Rep As Integer
   
    If Not EnEdition Then
        If Not Application.Intersect(Target, Range("A1:F30")) Is Nothing Then
            Rep = MsgBox("Voulez-vous vraiment modifier cette cellule (" & Target.Address & ")", vbYesNo)
            If Rep = vbNo Then
                EnEdition = True
                Target.Value = Valeur
                EnEdition = False
                Exit Sub
            End If
        End If
    End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Valeur = Target.Value
End Sub

Comme un changement de cellule rappelle toujours Worksheet_Change, il faut y aller avec une variable booléenne (EnEdition, ici) qui évite de revenir continuellement dans l'événement.

Dans SelectionChange, il faut stocker la valeur avant qu'elle ne soit modifiée. Et comme ce sont des événements indépendants, il faut déclarer les 2 variables en dehors des procédures pour qu'elles soient reconnues dans une ou l'autre.

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
12
Salut,

J'y vais à taton...essaye cela défois que :

Private Sub Command1_Click()


'<E> Déclaration
     Dim sValeur As Variant
  '<E> Récupération valur cellule
       sValeur = Range("D5:D68").Value
      
'<E> MsgBox de confirmation modification
     If MsgBox("Etes-vous sûr(e) de vouloir modifier cette valeur?", vbYesNo + vbQuestion, "Confirmation") = vbYes Then
        '<E> Réponse Oui
        Exit Sub
     End If


' Réponse Non
 Range("D5:D68").Value = sValeur


End Sub


A+
Exploreur

 Linux a un noyau, Windows un pépin
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
16
J'ai oublié de préciser que le Intersect sert à définir le Range qui sera considéré. Ici, j'ai mis A1 à F30, donc à toi de modifier au besoin.

Aussi, et ce n'est pas le moindre, si tu modifies une seule cellule, ça devrait bien fonctionner. Mais si tu sélectionnes plusieurs cellules et que tu les modifies d'un coup, ou si tu copies/colles plusieurs cellules, tu auras une belle erreur, si je ne me trompe... Il faudrait alors insérer une boucle pour lire chaque cellule modifiée... et je te laisse chercher un peu la solution...

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
2
Date d'inscription
mardi 5 février 2008
Statut
Membre
Dernière intervention
6 février 2008

Merci beaucoup pour vos réponses rapides. Tout marche nikel ^^
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
46
Salut,

[auteur/ANNAPOUET/1297726.aspx >Annapouet]:Si tout marche nickel, merci de valider les réponses t'ayant aidé à avancer

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
32
validé et déplacé vers VBA !
(bonjour à tous)