XL 2010 VBA remplacement valeur cellule si

jfglrx

XLDnaute Nouveau
Bonjour à tous,

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.
 
Solution
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) =...

sousou

XLDnaute Barbatruc
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
 

Pièces jointes

  • test.xlsm
    14.7 KB · Affichages: 12

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

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)
 

jfglrx

XLDnaute Nouveau
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
Bonsoir Sousou,

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,
 
Dernière édition:

jfglrx

XLDnaute Nouveau
Bonsoir le fil

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)
Bonsoir Staple,

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

Merci encore !
 

Staple1600

XLDnaute Barbatruc
Re

J'ai simplifié la chose
en me basant sur
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.

Mais comme je l'ai dit, il y aura vite un hic ;)
 

jfglrx

XLDnaute Nouveau
Re

J'ai simplifié la chose
en me basant sur

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.

Mais comme je l'ai dit, il y aura vite un hic ;)
Merci Staple,

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.

Je ne sais pas si c'est très clair ;)
Merci
 

jfglrx

XLDnaute Nouveau
Bonjour
J'avais bien conscience de ce fait.
Es-tu disposé à ajouter une feuille caché, pour mémoriser les anciennes valeurs?
Bonjour Sousou,

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.

Merci pour ton temps.
Bien à toi,
 

jfglrx

XLDnaute Nouveau
Re-bonjour Sousou,

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....

Grand merci,
 

jfglrx

XLDnaute Nouveau
Ah Ctrl Z!!
Une fois copié les procédures dans ton fichier, tu affectes la procédure retour à CtrlZ dans macro option
Merci Sousou,

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
 

sousou

XLDnaute Barbatruc
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
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
314 719
Messages
2 112 179
Membres
111 452
dernier inscrit
christine64