application undo

M

modus57

Guest
Bonsoir le forum, voilà mon petit problème

La cellule A1 contient un nombre X.
La cellule A2 contient un nombre Y.

Après la saisie d’un nombre Z en A1, un Inputbox m’invite à saisir un nombre quelconque qui sera qui sera copié en A2 .

Si aucune valeur n’a été saisie dans l’Inputbox, retour à la valeur X en A1

J’ai essayé ce petit bout de code, ça ne fonctionne pas (boucle sans fin)

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next

If Target <> [A1] Then Exit Sub
If [A1] = 0 Then
[A2] = 0
Else
If IsNumeric(UserEntry) Then
UserEntry = InputBox('SAISIR UN NOMBRE ')

If UserEntry = '' Then
Application.Undo ‘retour à la valeur X en A1
Exit Sub
Else
Range('A2').Value = UserEntry
End If
End if
End If
End Sub

Merci d’avance pour votre aide à +
 
M

modus57

Guest
Rebonsoir j'ai une petite erreur dans le code, voici le code modifié :

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next

If Target <> [A1] Then Exit Sub
If [A1] = 0 Then
[A2] = 0
Else
UserEntry = InputBox('SAISIR UN NOMBRE ')
If IsNumeric(UserEntry) Then
If UserEntry = '' Then
Application.Undo ‘retour à la valeur X en A1
Exit Sub
Else
Range('A2').Value = UserEntry
End If
End if
End If
End Sub

J'espère que c'est plus clair, à bientôt
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir modus57,

Tu peux essayer comme ça :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim UserEntry As Variant
      If Not Application.Intersect(Target, Range('A1')) Is Nothing Then
            'On suspend la gestion des évènements VBA
            Application.EnableEvents = False
            'Si valeur 0
            If Target.Value = 0 Then
                  Range('A2').Value = 0
            Else
                  'Si autre valeur, alors on demande la valeur pour A2
                  UserEntry = Application.InputBox('Saisir un nombre ', '?', , , , , , 1)
                  'Si annulation par l'utilisateur, alors annulation de la modif en A1
                  If UserEntry = False Then
                        Application.Undo
                  Else
                        'MAJ de A2
                        Range('A2').Value = UserEntry
                  End If
            End If
            'On rétablit la gestion des évènements VBA
            Application.EnableEvents = True
      End If
End Sub
Cordialement,
 
M

modus57

Guest
modus57 écrit:
Super Didier, ça marche.
Ta réponse rapide c'est sympa !

Merci beaucoup et bonne nuit

Didier c'est encore moi pour un point de détail.

J'ai intégré ton code dans ma procédure il fonctionne très bien.
Est-il possible d'interdire la saisie de texte dans la cellule A1.
J'ai essayé <Donées =>Validation> mais je ne trouve pas la bonne formulation.
Pourrais-tu faire un petit effort et modifier ton code en conséquence car je suis moyen dans ce domaine.

Un grand merci et re +
 

myDearFriend!

XLDnaute Barbatruc
Re modus57,

Je pense effectivement qu'il convient d'utiliser autant que possible les possibilités 'naturelles' d'Excel et donc de régler ton problème par Données / Validation...

Pour ce faire :
[ol][li]Tu sélectionnes la cellule A1[/li]
[li]Tu fais menu Données / Validation... onglet 'Options'[/li]
[li]Autoriser : tu choisies 'Nombre Entier'[/li]
[li]Données : tu choisies 'Comprises entre'[/li]
[li]Minimum : 0 (à adapter)[/li]
[li]Maximum : 1000 (à adapter)[/li]
[li]Ignorer si vide : Coché[/li]
[li]Onglet 'Alerte d'erreur'[/li]
[li]Quand des données non valides sont tapées : Coché[/li]
[li]Style : 'Arrêt'[/li]
[li]Titre : Ce que tu veux[/li]
[li]Message d'erreur: Ce que tu veux[/li]
[li]Et tu valides finalement par OK.[/li][/ol]Ci-joint un exemple pour illustrer cette façon de faire...

Cordialement, [file name=PourModus57.zip size=7310]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/PourModus57.zip[/file]
 

Pièces jointes

  • PourModus57.zip
    7.1 KB · Affichages: 40

myDearFriend!

XLDnaute Barbatruc
Sinon, si tu veux vraiment tout faire par VBA, tu peux peut-être essayer :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim UserEntry As Variant
        If Not Application.Intersect(Target, Range('A1')) Is Nothing Then
                  'On suspend la gestion des évènements VBA
                  Application.EnableEvents = False
                  If Not IsNumeric(Target.Value) Then
                              MsgBox 'Donnée numérique obligatoire !'
                              Application.Undo
                              Application.EnableEvents = True
                              Exit Sub
                        End If

                  'Si valeur 0
                  If Target.Value = 0 Then
                          Range('A2').Value = 0
                  Else
                          'Si autre valeur, alors on demande la valeur pour A2
                          UserEntry = Application.InputBox('Saisir un nombre ', '?', , , , , , 1)
                          'Si annulation par l'utilisateur, alors annulation de la modif en A1
                          If UserEntry = False Then
                                    Application.Undo
                          Else
                                    'MAJ de A2
                                    Range('A2').Value = UserEntry
                          End If
                  End If
                  'On rétablit la gestion des évènements VBA
                  Application.EnableEvents = True
        End If
End Sub
 

Statistiques des forums

Discussions
312 972
Messages
2 094 055
Membres
105 930
dernier inscrit
Manoa