Créer macro annuler action

Fermé
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 - 9 août 2011 à 13:39
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 16 août 2011 à 08:39
Bonjour,

Encore moi. J'aimerais soliciter à qui peut m'aider. Est ce possible de créer un macro qui annule une action. Par exemple je fais une écriture dans ma ligne, au lieu de suprimer je fais annuler.

Merci d'avance à vous!
Mes respects
Bonisam

A voir également:

21 réponses

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
9 août 2011 à 13:53
Bonjour,
La moindre des choses serait de dire un p'tit coucou ou un merci lorsque quelqu'un t'apporte une solution. Non?
2
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
9 août 2011 à 14:00
pijaku,

merci pour le rappel. je suis vraiment désolé et m'excuse sincèrement.
Je promet d'être plus poli la prochaine fois.
Merci pour tous.
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
9 août 2011 à 14:03
Pas de souci, pour tout te dire ça m'a surpris, tes posts étant tous empreints d'une telle politesse. Oublions!

Répondons plutôt à ta question.

Il est impossible, par la commande Excel Editions/Annuler, d'annuler la tâche accomplie par une macro. Ca tu le savais déjà.

Pour "annuler" ce qu'a réalisé un code VBA, il faut écrire le code inverse...

Exemple :
Sub EcrisTestEnA1()
Range("A1") = "Test"
End Sub

Sub AnnuleCeQueJaiEcrisEnA1()
If Range("A1") = "Test" Then
    Range("A1") = ""
End If
End Sub
0
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
9 août 2011 à 14:10
pour cette procedure ça devient en fait faire un double travail.
Mais vraiment vous m'avez eclairer et je comprend mieux. donc en fin je vais préférer laisser tombé ça pour garder la commande standard d'annulation.
Encore merci pour la prompte réaction surtout votre sens de compréhension.
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
9 août 2011 à 14:26
Après tout dépends de ce que vous souhaitez faire...
L'annulation d'une procédure peut être remplacée par l'empêchement de réaliser cette procédure si...
Vous dites.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
9 août 2011 à 14:51
ok, merci c'est super.
Je pense que c'est bon pour ça.
Par contre j'ai un autre problème.
J'aimerais réaliser une macro de vérification d'erreur.
En fait j'ai crée 12 feuilles de saisie répresentant les mois de janvier à decembre. donc j'aimerais avoir une macro qui empêche la validation de la date en affichant un message d'erreur de type "date incorrecte" si un utilisateur saisie par exemple 01/02/2011 dans la feuille de janvier. Mais si l'année est antérieur à 2011, ça doit passer.
Merci pour votre aide
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
9 août 2011 à 14:56
Les dates sont saisies n'importe ou dans la feuille ou dans une colonne bien précise???
0
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
9 août 2011 à 14:58
Dans une colonne bien précise "colonne A"

Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
9 août 2011 à 15:22
Code à coller dans chaque code de feuille :
Clic droit sur chaque onglet/Visualiser le code
copier / coller ceci :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
If UCase(Format(CDate(Target.Value), "mmmm")) <> UCase(ActiveSheet.Name) And Year(Target.Value) = Year(Date) Then
    MsgBox "Date non valide"
    With Target
        .ClearContents
        .Select
    End With
End If
End Sub

Testes et dis nous...
0
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
9 août 2011 à 18:07
Bonjour,

D'abord je m'excuse, c'était l'heure de la pause ce nous.
Sinon la procédure marche mais unique pour l'anné 2011. Dans mon cas l'année peut varier et je voulais qu'en fonction de l'année choisie le code tient compte de ça. touvez-ci joint un cas pratique de ce que je veux faire:
https://www.cjoint.com/?AHjsgoTvJkr

Merci pour tout
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 08:13
Bonjour,
Je ne disposes pas d'Excel 2007 et donc ne peux pas ouvrir ton fichier joint. Pour me le passer, merci de l'enregistrer sous format 97-2003.
Tu avais pourtant dit : Mais si l'année est antérieur à 2011, ça doit passer Ben dans mon code ça passe...
Si tu veux empêcher systématiquement toute saisie de date dont le mois serait différent du nom de l'onglet :
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
If UCase(Format(CDate(Target.Value), "mmmm")) <> UCase(ActiveSheet.Name) Then
    MsgBox "Date non valide"
    With Target
        .ClearContents
        .Select
    End With
End If
End Sub
0
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
10 août 2011 à 10:22
Bonjour pijaku

Tu avais pourtant dit : Mais si l'année est antérieur à 2011, ça doit passer Ben dans mon code ça passe. En fait je m'excuse c'est une erreur de langage. J'aimerais en fin que tout mois différent du mois de l'année choisie qu'il soit antérieur ou postérieur soit systématiquement réjété.
Touvez-ci joint une version 97-2003: https://www.cjoint.com/?AHkku0FSgGW

Merci pour votre aide.
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 10:31
Juste comme ça, as tu testé le code donné dans ma dernière réponse???
0
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
10 août 2011 à 10:51
oui j'ai testé. Ca mache pour l'année choisie. Par exemple pour l'année 2011 dans la feuille de janvier: si on saisie 01/02/2011 ça bloque (ça c'est bien). mais si on saisie par exemple 01/01/2010 ou 01/01/2012, ça passe.(ça c'est pas bon). j'aimerais que tout mois différent du mois de l'année choisie soit systématiquement bloqué.

Merci pour tout
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 10:56
Alors code à copier dans chacune de tes feuilles:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
If UCase(Format(CDate(Target.Value), "mmmm")) <> UCase(ActiveSheet.Name) Or Year(Date) <> Year(CDate(Target.Value)) Then
    MsgBox "Date non valide"
    With Target
        .ClearContents
        .Select
    End With
End If
End Sub
0
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
Modifié par Bonisam le 10/08/2011 à 11:17
waoooo! c'est génial. ça marche 5/5. Vous êtes vraiment un génie de la chose.
mille merci, vous m'avez vraiment sauve et je ne sais comment vous remercier.

Néanmoins j'ai juste une question: dans mes bricolage je suis arrivé à faire un petit logociel mais un problème perdure.c'est notamment le problème de changement d'année. Est ce possible avec une macro une fois qu'on va à l'année suivante, la base soit remise à zero bien avec une possibilité de retour.
Je prend un exemple: nous somme en 2011 et une fois qu'on passe à 2012, la base soit remise à vide.

Merci pour tout votre sacrifice
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 11:23
Pour faire ceci, tu veux supprimer les données contenues dans chaque feuille "mois" de A10 à H dernière ligne, par macro?
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 11:36
Ce code boucle sur toutes les feuilles de ton classeur.
Si la feuille ne s'appelle ni "acceuil", ni "Recapitulatif", elle boucle sur toutes les cellules de A10 à H dernière ligne
Si la cellule ne contient pas de formule, son contenu est effacé.
Tu dis...
Sub EffaceDonnees()
Dim DerLig As Long
Dim Wsh As Worksheet
Dim Plage As Range, Cel As Range

For Each Wsh In ThisWorkbook.Worksheets
    If Wsh.Name <> "Acceuil" And Wsh.Name <> "Recapitulatif" Then
        With Wsh
            DerLig = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row
            Set Plage = .Range("A10:H" & DerLig)
            For Each Cel In Plage
                If Left(Cel.Formula, 1) <> "=" Then
                    Cel.ClearContents
                End If
            Next
        End With
    End If
Next
Set Plage = Nothing
End Sub
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
10 août 2011 à 12:10
Bonjour à vous deux,

Tout d'abord toutes mes excuses de m'immiscer dans votre échange mais je le suis depuis le début car cela m'interesse.
J'ai testé la solution de de Pijaku et elle me conviendrait parfaitement mais à condition que ce contrôle puisse se faire sur douze mois mais à cheval sur deux années, d'Avril à Mars par exemple.
Cordialement
Mistral
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 12:12
Salut,
Bienvenue!
testé la solution de de Pijaku laquelle? Il y a eu plusieurs questions sur ce sujet...
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
10 août 2011 à 12:19
Celle ci-dessous

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 1 Or Target.Value = "" Then Exit Sub
If UCase(Format(CDate(Target.Value), "mmmm")) <> UCase(ActiveSheet.Name) Or Year(Date) <> Year(CDate(Target.Value)) Then
    MsgBox "Date non valide"
    With Target
        .ClearContents
        .Select
    End With
End If
End Sub


Qui permet de tester la cohérence de la date saisie sur la bonne feuille et que le millesime de l'année est correcte.
Cordialement
Mistral
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
Modifié par pijaku le 10/08/2011 à 12:28
Le problème se pose, pour toi, pour les feuilles janvier, février et mars qui sont donc en année N+1. Si tu les utilises avant 2012 par exemple, le test : Year(Date) <> Year(CDate(Target.Value)) ne renverra pas d'erreur de saisie.
Il faut donc biaiser. Si tu as, par exemple en D12 l'année écrite ex : 2012 en N+1 2011 en N tu peux utiliser ce code (à adapter Range("D12")) :
Private Sub Worksheet_Change(ByVal Target As Range) 
If Target.Column <> 1 Or Target.Value = "" Then Exit Sub 
If UCase(Format(CDate(Target.Value), "mmmm")) <> UCase(ActiveSheet.Name) Or Range("D12") <> Year(CDate(Target.Value)) Then 
    MsgBox "Date non valide" 
    With Target 
        .ClearContents 
        .Select 
    End With 
End If 
End Sub
0
Bonjour;

Je voulais juste une précision: où mettre le code? dans chaque feuille où dans la feuille accueil?
En plus est ce que si une cellule contient une formule, on peut effacé le résultat et conserver la formule?

Sinon j'ai testé votre dernière reponse mais à moins que j'ai fait une erreur, ça marche pas.

Merci pour tout
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 13:37
Sub EffaceDonnees() se place dans un module standard (sous visual basic : Insertion/Module).
si une cellule contient une formule, on peut effacé le résultat et conserver la formule? Alors, logiquement une cellule qui contient une formule (à part certaines comme =AUJOURDHUI()) fait référence à une (au moins) autre cellule qui elle contient une valeur. Si vous supprimez le contenu de toutes les cellules qui contiennent une valeur, les cellules contenant des formules vont :
- perdre leur valeur,
- conserver leurs formules.
Sinon j'ai testé votre dernière reponse mais à moins que j'ai fait une erreur, ça marche pas Moi aussi, j'ai testé, et ça fonctionne... Peut être une erreur de votre part. de toutes façons, le code ne peux fonctionner que depuis un mdule standard...
A vous...
0
Bonjour,

je vais faire une requette spéciale à vous de m'envoyé un modèle je vais voir sinon je me bat dans tous les sens en vain.

Donc si vous pouvez m'envoyer un modèle cela va beaucoup m'aider.
Merci pour tout
Mes respects
Bonisam
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 14:21
Là j'ai pas compris : je vais faire une requette spéciale ???????????
Sinon votre fichier est ici...
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
10 août 2011 à 14:44
Pijaku je viens de prendre connaissance de ton dernier message et j'ai fait des essais en aynat modifié la ligne :

If UCase(Format(CDate(Target.Value), "mmmm")) <> UCase(ActiveSheet.Name) Or Year(Date + 365) <> Year(CDate(Target.Value)) Then

Dans la Woorksheet des trois premiers mois et ça fonctionne, reste à regler le problème des années bisextilles dont 2012 fait partie.

Cordialement
Mistral
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 14:50
Ce code est entré dans le code de la feuille. Il ne fonctionne par conséquent que dans la feuille concernée. Il suffit donc de faire le bon test dans la feuille janvier.
Donc dans les feuilles janv fév et mars remplace :
Year(Date) ou ton fameux Year(Date + 365)
par :
Year(Date) + 1
0
Bonjour,

Je voulais dire vous demander spécialement de m'envoyé un modèle.
Dites moi, il faut excuter ou bien automatiquement ça marche?
Parce que j'ai crée un module standard mais même quand je change d'année les donnée restent.

je vous renvoie mon fichier:en fait dans la feuille "Acceuil" il y'a une liste déroulante des années. donc je voudrait quand passant à l'année suivante(2012) les donné de l'année antérieur (2011) s'efface. et quand je reviens dans l'antérieur (2011) après je puisse quand même revoir mes donées et vis versa. Ci-joint mon fichier :http://cjoint.com/?AHkoXivjrmm

Je suis désolé de trop vous embêter pour ça mais comprenez moi.
Merci pour tout
Mes respects
Bonisam
0
Mon fichie :http://cjoint.com/?AHko3erhtSK
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
10 août 2011 à 15:00
donc je voudrait quand passant à l'année suivante(2012) les donné de l'année antérieur (2011) s'efface. et quand je reviens dans l'antérieur (2011) après je puisse quand même revoir mes donées et vis versa Je vous réponds de suite, sans regarder votre tableau : impossible sans avoir une base de données stockant toutes les informations.....
Vous devriez : enregistrer votre classeur, chaque année, sous NomDuClasseur + année, et réinitialiser votre classeur manuellement en lançant la macro ci dessus référencée par ALT+F8...
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
10 août 2011 à 15:03
Pijaku :
C'est exactement ce que j'ai fait et tu as raison faire +1 au lieu de +365 est plus intelligent. Merci à toi.

Bonisam:
J'ai testé les macros fournies par pikasu et ça fonctionne parfaitement chez moi.
La permière celle qui contrôle la validité de la date doit être sur une Woorkshett de chaque feuille Mois.
La seconde pour éffacer se trouve dans un module indépendant et tu dois la lancer manuellement ou à l'aide d'un bouton auquel tu attaches la macro.

Cordialement
Mistral
0
Bonjour,

Vraiment je m'excuse mais j'ai toujours des difficultés. J'ai crée un bouton d'execution de la macro effacedonnées. Mon problème est quand je lance l'execution de la macro elle m'affiche un message "d'erreur d'execution "1004" (Impossible de modifier une cellule fusionnée). Pourtant mes cellules fusionnées sont"A8:B8 " qui ne sont pas incluse dans ma plage. Et puis quand je part voir dans mes feuilles "mois" les données sont effacer mais ça efface aussi la cellule "A9" et "B9" pourtant ma plage est : "A10:G". Donc je ne comprend vraiment pas.

Voici mon fichier:http://cjoint.com/?AHks3pQfBQa
Je vous prie de m'aider encore.
Merci pour tout
Mes respects
Bonisam
0
http://cjoint.com/?AHks3pQfBQa
0
http://cjoint.com/?AHks3pQfBQa
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 744
11 août 2011 à 09:23
Salut,
Comment tu veux que je regarde ton fichier, tu l'as protégé de partout par mot de passe..........
0
Mistral_13200 Messages postés 634 Date d'inscription mardi 5 août 2008 Statut Membre Dernière intervention 21 mars 2024 4
11 août 2011 à 09:42
Bonjour à vous deux,

Et de plus il y a deux fichiers différents!!!
Un sans aucune macro...
L'autre verrouillé...

Cordialement
Mistral
0
Bonisam Messages postés 144 Date d'inscription mercredi 27 octobre 2010 Statut Membre Dernière intervention 24 avril 2019 1
12 août 2011 à 10:19
Bonjour Mistral 13200,

A l'execution de la macroefface donné j'ai une erreur 1004 donc je ne comprend plus rien.
Voyez plustot à l'image suivantes:https://www.cjoint.com/?AHmksVeQtLW

Merci pour tout
Mes respects
Bonisam
0