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 Function
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Call cellule_fleche_haut_bas(Target, "H2:H999999")
End Sub

Maintenant 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 Sub

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

Auriez-vous une idée de ce que je pourrais faire SVP ?

Merci.

Bonsoir,

jimi a écrit :

Auriez-vous une idée de ce que je pourrais faire SVP ?

Il y a bien une solution ... mais pas certain qu'elle te plaise: faire la même chose par formule

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:

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

... mais ... si la flèche en colonne H est vers le haut, c'est déjà un nombre positif ... non?

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

}

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 Sub

cependant 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 Sub

cordialement

Rechercher des sujets similaires à "probleme worksheet change"