Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
Pourriez-vous m'éclairer quant au code VBA que je devrais écrire afin d'automatiser ceci :
J'ai un tableau comprenant une dizaine de feuilles.
Chaque feuille comporte +/- 1000 lignes.
Sur chaque feuille, en colonne G, j'encode des quantités.
En colonne B, j'aimerais que si j'écris la lettre "n", la quantité inscrite en colonne G se remette à zéro.
(Ex : en en G92, j'ai écrit 50, si par après en B92 j'écris "n", alors la quantité en G92 retourne à zéro.)
Si possible, je souhaiterais que si je fais CRL+Z, je puisse tout de même retrouver ma valeur initiale en colonne G (dans le cas où j'écrirais "n", en colonne B, par erreur …)
Un grand merci d'avance pour votre aide précieuse
Je sais que ce forum fait des miracles.
Si tu le souhaites mes ces deux lignes en ramarque et efface la procédure retour
mais sache qu'il n'existe ici qu"une seule feuille cachéepour tous les autres feuilles,
J'utilise le numéro de colonne de la feuille cachée pour désigner la feuille sur laquelle tu travailes
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Parent.Name = "mem" Then Exit Sub
On Error Resume Next
If Target.Column = 2 And Target = "n" Then
If Err.Number <> 0 Then Exit Sub 'Sheets("mem").Cells(Target.Offset(0, 5), Target.Parent.Index) = Target.Offset(0, 5).Value
'Application.StatusBar = mem
Target.Offset(0, 5) = 0
End If
End Sub
Sub retour()
For Each i In Selection
Bonjour
Tu peux essayer ceci, j'utilise la barre de statut pour mémoriser la valeur
Le ctrlZ ce fait sur la cellule contenant le n
Attention seule, une mémorisation!
A voir
Merci ! Je viens d'ouvrir ton fichier, ça à l'air parfait. Je l'implante sur mon fichier ce soir et je te dis si ça fonctionne. Grand merci pour la rapidité !
Tel que j'ai compris la chose
(Mais cela présente un risque... dont on parlera plus tard
quand tu auras testé 😉
Code à mettre dans le ThisWorbook
VB:
Option Explicit
Dim CellActiv As Variant
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
CellActiv = ActiveCell.Value
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Intersect(Target, Range("G:G")) Is Nothing Then
If Target.CountLarge > 1 Then Exit Sub
Application.EnableEvents = False
If MsgBox("Changer la valeur de cette cellule?", vbOKCancel + vbCritical, "Avertissement") = vbCancel Then
Target.Value = CellActiv
End If
Application.EnableEvents = True
End If
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
CellActiv = Target.Value
End Sub
Pour tester, avoir un classeur avec deux, trois feuilles
Puis aller sur la feuille 2 par exemple et saisir un valeur en colonne
G
Répondre OK
Puis retourner sur cette cellule et saisir une autre valeur
et répondre Annuler
EDITION: Désolé, pas rafraichi la page.
Pas vu la réponse de sousou (Bonsoir)
Bonjour
Tu peux essayer ceci, j'utilise la barre de statut pour mémoriser la valeur
Le ctrlZ ce fait sur la cellule contenant le n
Attention seule, une mémorisation!
A voir
Pour une raison que je n'explique pas, le crtlZ ne fonctionne que si j'ai ton fichier excel ouvert en même temps que le mien....as-tu une idée d'où le problème peut-il provenir ?
Un autre problème, c'est qu'il faudrait que j'ai la possibilité de supprimer plusieurs "n" à la fois en une sélection or là actuellement, je ne peux les supprimer que un à la fois ou sinon je reçois un message d'erreur....
Tu penses pouvoir m'aider encore là-dessus ?
Merci d'avance,
Tel que j'ai compris la chose
(Mais cela présente un risque... dont on parlera plus tard
quand tu auras testé 😉
Code à mettre dans le ThisWorbook
VB:
Option Explicit
Dim CellActiv As Variant
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
CellActiv = ActiveCell.Value
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Not Intersect(Target, Range("G:G")) Is Nothing Then
If Target.CountLarge > 1 Then Exit Sub
Application.EnableEvents = False
If MsgBox("Changer la valeur de cette cellule?", vbOKCancel + vbCritical, "Avertissement") = vbCancel Then
Target.Value = CellActiv
End If
Application.EnableEvents = True
End If
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Target.CountLarge > 1 Then Exit Sub
CellActiv = Target.Value
End Sub
Pour tester, avoir un classeur avec deux, trois feuilles
Puis aller sur la feuille 2 par exemple et saisir un valeur en colonne
G
Répondre OK
Puis retourner sur cette cellule et saisir une autre valeur
et répondre Annuler
EDITION: Désolé, pas rafraichi la page.
Pas vu la réponse de sousou (Bonsoir)
Grand merci d'avoir pris le temps de me répondre. Je pense par contre que ça ne répond pas exactement à ma demande....en tout les cas, je l'ai testé et ça ne fonctionne malheureusement pas comme je le souhaite. Je pense que Sousou est plus proche de la solution même s'il y a encore une petite chose qui coince pour le moment
Si possible, je souhaiterais que si je fais CRL+Z, je puisse tout de même retrouver ma valeur initiale en colonne G (dans le cas où j'écrirais "n", en colonne B, par erreur …)
Sauf que je zappe l'étape du "n"
Puis c'est la colonne G qui est visée
La macro agit sur toutes les colonnes de toutes les feuilles du classeur actif
Exemple (par vraiment au hasard)
Tu en G1600
Tu saisis dans cette cellule
Staple
Tu réponds OK
Puis tu retournes sur G1600
Tu appuies sur SUPPR et si tu réponds OK (la cellule est effacée)
Tu réponds Annuler , c'est la précédente valeur qui revient dans la cellule.
Sauf que je zappe l'étape du "n"
Puis c'est la colonne G qui est visée
La macro agit sur toutes les colonnes de toutes les feuilles du classeur actif
Exemple (par vraiment au hasard)
Tu en G1600
Tu saisis dans cette cellule
Staple
Tu réponds OK
Puis tu retournes sur G1600
Tu appuies sur SUPPR et si tu réponds OK (la cellule est effacée)
Tu réponds Annuler , c'est la précédente valeur qui revient dans la cellule.
Je comprends mieux la manipulation que tu proposes.
En fait, cette lettre "n" que j'écris ou non en colonne B est importante car elle me permet de faire fonctionner mon filtre en colonne B.
Pour être clair, mon tableau est un métré de travaux de construction. Il y a dans ce tableau, tous les postes possibles mais évidemment en fonction du projet sur lequel je travaille je n'ai pas besoin de tous ces postes. Donc j'écris "n" devant toutes les lignes qui ne vont pas me servir pour le projet sur lequel je suis (Ex : Pour le projet X, je n'ai pas besoin de bloc béton mais j'ai besoin de structure en bois, etc). Et puis je filtre pour masquer toutes les lignes qui ont "n" en colonne B.
Comme je repars toujours du même tableau pour faire un métré, il y a bien entendu des lignes qui étaient utiles pour un projet mais pas pour l'autre. Donc j'enlève et je rajoute des "n" d'un projet à l'autre, en colonne B. Si je peux associer la lettre "n" à l'effacement de la quantité présente en colonne G, alors je suis certain de ne pas faire d'erreur en comptant des quantités dont je n'aurais pas besoin.
Merci pour ton retour,
Je t'avoue que je ne sais pas trop ce que cela implique....mais pourquoi pas.
Par contre, j'ai une quinzaine de feuille, cela implique 15 feuilles cachées?
Aussi, mais ça rejoint peut-être le même problème, si je mets "n" dans 3 cellules, les valeurs repassent bien à zéro, par contre si je fais ctrlZ sur les cellules où j'ai mis "n", il va remettre toujours la même valeur en colonne G.
Si c'est plus simple, je peux me passer de la fonction CRTL Z et donc de la mémorisation des données.
Un code pour uniquement mettre les valeurs à zéro pourrait déjà me convenir.
Il faudrait juste que je puisse supprimer plusieurs "n" à la fois sans faire bugger la macro....
Est-ce que tu pourrais malgré tout me proposer un code où on oublie ce retour Ctrl Z mais où juste les valeurs en G se mettent à zéro si j'écris "n" ? Comme j'ai bcp de feuilles, j'ai un peu peur de m'y perdre avec des feuilles à cacher.
Grand merci pour ton temps
Si tu le souhaites mes ces deux lignes en ramarque et efface la procédure retour
mais sache qu'il n'existe ici qu"une seule feuille cachéepour tous les autres feuilles,
J'utilise le numéro de colonne de la feuille cachée pour désigner la feuille sur laquelle tu travailes
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Parent.Name = "mem" Then Exit Sub
On Error Resume Next
If Target.Column = 2 And Target = "n" Then
If Err.Number <> 0 Then Exit Sub 'Sheets("mem").Cells(Target.Offset(0, 5), Target.Parent.Index) = Target.Offset(0, 5).Value
'Application.StatusBar = mem
Target.Offset(0, 5) = 0
End If
End Sub
Sub retour()
For Each i In Selection
If i = "n" Then i.Value = "": i.Offset(0, 5) = Sheets("mem").Cells(i.Offset(0, 5).Row, i.Parent.Index)
Next
End Sub
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD