Problème avec Worksheet_Change
Bonjour,
Je suis en train de me créer un petit fichier excel pour mes comptes.
Dans la colonne "I" je rentre mes montants (en euros), et dans ma colonne "H" j'ai une fonction qui me permet quand je double clic dessus d'écrire une flèche vers le haut (en Wingdings3, c'est "Ç") ou une flèche vers le bas (en Wingdings3, c'est "È"), selon si le chiffre est positif ou négatif.
Cette fonction marche sans problème :
Public Function cellule_fleche_haut_bas(ByVal Target As Range, num_ensemble_de_cellules As String)
If Not Intersect(Target, Range(num_ensemble_de_cellules)) Is Nothing Then
If Target.Value = "Ç" Then
Target.Value = "È"
Target.Offset(0, 1).Value = -Abs(Target.Offset(0, 1).Value)
Else
Target.Value = "Ç"
Target.Offset(0, 1).Value = Abs(Target.Offset(0, 1).Value)
End If
Target.Offset(1, 0).Select
End If
End FunctionPrivate Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Call cellule_fleche_haut_bas(Target, "H2:H999999")
End SubMaintenant je voudrais faire une macro qui, lorsque je saisie mon montant, si la cellule de la colonne précédente est une flèche vers le haut (en Wingdings3, c'est "Ç"), alors de mettre mon montant en positif. Et inversement, si la flèche est vers le bas (en Wingdings3, c'est "È"), alors de mettre mon montant en négatif.
Voici le code que j'ai entré :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("I2:I999999")) Is Nothing Then
'Ç -> fleche haut
'È -> fleche bas
If Target.Offset(0, -1).Value = "Ç" Then
Target.Value = Abs(Target.Value)
ElseIf Target.Offset(0, -1).Value = "È" Then
Target.Value = -Abs(Target.Value)
Else
End If
Target.Offset(1, 0).Select
End If
End SubMalheureusement ça me fait planter Excel.
A savoir que je ne rentre mes montants que dans la colonne "I", et mes flèches que dans la colonne "H" (juste pour information).
Auriez-vous une idée de ce que je pourrais faire SVP ?
Merci.
Bonsoir,
Il y a bien une solution ... mais pas certain qu'elle te plaise: faire la même chose par formulejimi a écrit :Auriez-vous une idée de ce que je pourrais faire SVP ?
J'y ai pensé, mais si j'entre une formule dans ma case I12 (par exemple), et que je saisi mon montant aussi dans ma case I12 ça va effacer ma formule.
L'objectif est de faire un fichier un peu esthétique... Si j'entre mon montant dans une case et ma formule dans une autre ça n'a plus vraiment d'intérêt par rapport à ce que je veux faire... Donc la seule solution à laquelle j'ai penser est le VBA.
Ouille! Je n'avais pas compris que c'était la cellule même dans laquelle tu encodes ton montant au départ que tu veux modifier!?
Si c'est ça, je comprends encore moins: imaginons que tu encodes, en I5, un montant de 50 € (sans signe, il est donc positif) ... que doit-il se passer alors? Dans ton explication, en relisant, tu dis:
... mais ... si la flèche en colonne H est vers le haut, c'est déjà un nombre positif ... non?lorsque je saisie mon montant, si la cellule de la colonne précédente est une flèche vers le haut (en Wingdings3, c'est "Ç"), alors de mettre mon montant en positif
Oui d'où le fais que j'utilise des valeurs absolues.
Je veux donc faire :
SI (flèche vers le haut)
{
Montant = valeur_absolue(montant)
// Si le montant est déjà positif ça ne change rien, par contre s'il est negatif il deviendra positif
}
SINON SI (flèche vers le bas)
{
Montant = - valeur_absolue(montant)
// Si le montant est déjà négatif, alors ça me transforme mon nombre en positif grâce à la valeur absolue, puis ça le repasse en négatif avec le "moins"
// Si le montant est positif, le signe "moins" passe mon montant en négatif
}
- Messages
- 1'119
- Excel
- 2013 FR
- Inscrit
- 18/09/2015
- Emploi
- Développeur Bureautique Indépendant (Excel)
Bonjour jimi, U. Milité
sans fichier exemple... ce n'est pas évident !
Cependant pour apporter ma contribution... il me semble qu'à la lecture du code... un Application.EnableEvents=False pourrait résoudre le
jimi a écrit :Malheureusement ça me fait planter Excel.A savoir que je ne rentre mes montants que dans la colonne "I", et mes flèches que dans la colonne "H" (juste pour information).
Private Sub Worksheet_Change(ByVal Target As Range)
'
' -> ICI pour stopper la gestion des events excel
Application.EnableEvents = False
'
If Not Intersect(Target, Range("I2:I999999")) Is Nothing Then
'Ç -> fleche haut
'È -> fleche bas
If Target.Offset(0, -1).Value = "Ç" Then
Target.Value = Abs(Target.Value)
ElseIf Target.Offset(0, -1).Value = "È" Then
Target.Value = -Abs(Target.Value)
Else
End If
Target.Offset(1, 0).Select
End If
'
' -> ICI pour tout remettre en ordre => remettre en place la gestion des events
Application.EnableEvents = True
'
End Subcependant comme précisé plus haut je n'ai lu le code qu'en diagonale
Une chose est sûre: je vais aller me coucher tôt aujourd'hui
Il y a une partie du code qui s'exécute au double-clic, juste pour incliner une flèche vers le haut ou le bas, en fonction du montant dans la colonne voisine. Par ailleurs, il y aurait un code qui s'exécuterait au moment où le montant est encodé, en lisant le sens de la flèche (mais à ce moment-là, la flèche ne saurait pas encore être dessinée, puisqu'elle ne le sera qu'au double-clic ... qui lui-même ne pourra se faire que si le montant est présent!?) Ce n'est plus le serpent qui se mange la queue, c'est 100 fois pire
Tu commences à entrevoir pourquoi ta macro a tout planté?
@andrea73: là où tu as inséré le Application.EnableEvents=False, ça désactive toute gestion d'événements dès qu'une valeur quelconque sera modifiée n'importe où dans la feuille ... tu es certain que c'est la bonne idée?
Pour ce qui me concerne, en tout cas, je crois que je vais me retirer sur la pointe des pieds et laisser jimi réfléchir à son projet.
Bonne soirée,
Merci pour ces informations. Malheureusement ça ne fonctionne pas.
J'ai trouvé un autre moyen que ça fonctionne comme je le souhaite :
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Range("I2:I999999")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
'Ç -> fleche haut
'È -> fleche bas
If Target.Offset(0, -1).Value = "Ç" Then
Target.Value = Abs(Target.Value)
ElseIf Target.Offset(0, -1).Value = "È" Then
Target.Value = -Abs(Target.Value)
Else
End If
Target.Offset(1, 0).Select
End If
End Subça fonctionne parfaitement, SAUF quand je supprime une ligne quelconque (sélection de la ligne complète, clic droit, supprimer).
J'ai le message suivant qui s'affiche :
Erreur d'exécution '1004':
Erreur définie par l'application ou par l'objet
Savez-vous comment je peux corriger le code ci-dessus ?
Merci.
Bonjour,
Inspire toi de cet exemple. Attention SelectionChange et non Change
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("I2:I999999")) Is Nothing Then
'Ç -> fleche haut
'È -> fleche bas
If Target.Offset(0, -1).Value < 0 Then
Target.Font.Name = "Wingdings 3"
Target.Value = Chr(216)
ElseIf Target.Offset(0, -1).Value > 0 Then
Target.Font.Name = "Wingdings 3"
Target.Value = Chr(214)
Else
End If
' Target.Offset(1, 0).Select
End If
End Subcordialement