[Excel VBA] Colonne modifiable par clic + Changement auto signe cellule
Bonjour,
- Je souhaite créer une feuille excel pour faire mes comptes dans laquelle il y a une colonne (colonne E) avec flèche haut ("Ç" = flèche haut en police Wingdings 3) ou flèche bas ("È" = flèche bas police Wingdings 3), et une colonne (colonne F) avec le montant de l'opération en €). Avec des macros je souhaite :
1/ Colonne E : pouvoir faire un double clic pour changer l'orientation de la flèche (haut ou bas, en police Wingdings 3)
2/ Colonne F : ajuster le signe du chiffre entré en fonction de l'orientation de la flèche (nombre positif si flèche vers le haut, nombre négatif si flèche vers le bas)
- Vous trouverez ci-dessus les macros que j'ai faite. C'est fonctionnel, mais j'aurai 2 questions s'il vous plait :
1/ Dans "Public Function cellule_nombre_positif_negatif_fleche", si je met un "If Not Intersect" ça ne fonctionne pas. Si je l'enlève (il est en commentaire), ça fonctionne. Savez-vous pourquoi ?
2/ C'est mon principal problème que je n'arrive pas à résoudre : si je supprime une colonne (qui ne sont pas les colonnes E et F), ça "plante". Côté débogage ça arrive dans la fonction "Public Function cellule_nombre_positif_negatif_fleche", sur la ligne : "If Target.Offset(0, -1).Value = "Ç" Then"
Savez-vous comment résoudre ce problème s'il vous plait ?
- Voici les macros que j'ai faite (dans l'onglet correspondant) :
' >>> FONCTION Case fleche haut bas
'Ç -> fleche haut police Wingdings 3
'È -> fleche bas police Wingdings 3
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
' >>> FONCTION Signe nombre (positif ou negatif) en fonction de fleche (haut ou bas)
'Ç -> fleche haut police Wingdings 3
'È -> fleche bas police Wingdings 3
Public Function cellule_nombre_positif_negatif_fleche(ByVal Target As Range, num_ensemble_de_cellules As String)
'If Not Intersect(Target, Range(num_ensemble_de_cellules)) Is Nothing Then
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
Exit Function
End If
Target.Offset(1, 0).Select
'End If
End Function
' >>> FONCTION LORSQU'ON MODIFIE LA CELLULE
Private Sub Worksheet_Change(ByVal Target As Range)
Call cellule_nombre_positif_negatif_fleche(Target, "E:F")
End Sub
' >>> FONCTION LORSQU'ON DOUBLE CLIC SUR UNE CELLULE
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Call cellule_fleche_haut_bas(Target, "E:E")
End Sub
Bonjour,
A mon avis le problème vient du fait que tu n'as pas mis Application.EnableEvents = False, et donc tu fais un appel infini sur tes fonctions.
Ci-après ton code un peu revu, je pense qu'il est plus clair ainsi.
' MODULE DE CODE VBA
' >>> FONCTION Case fleche haut bas
'Ç -> fleche haut police Wingdings 3
'È -> fleche bas police Wingdings 3
Public Sub ChangerFlecheEtSigne(ByVal Target As Range)
With Target
If .Value = "Ç" Then
.Value = "È"
Else
.Value = "Ç"
End If
ChangerSigneDe .Offset(0, 1)
.Offset(1, 0).Select
End With
End Sub
' >>> FONCTION Signe nombre (positif ou negatif) en fonction de fleche (haut ou bas)
'Ç -> fleche haut police Wingdings 3
'È -> fleche bas police Wingdings 3
Public Sub ChangerSigneDe(ByVal Target As Range)
With Target
If .Offset(0, -1).Value = "Ç" Then
.Value = Abs(.Value)
ElseIf .Offset(0, -1).Value = "È" Then
.Value = -Abs(.Value)
Else
Exit Sub
End If
.Offset(1, 0).Select
End With
End Sub
' MODULE DE CODE FEUILLE
' >>> FONCTION LORSQU'ON MODIFIE LA CELLULE
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Columns("E:F")) Is Nothing Then Exit Sub
Application.EnableEvents = False
ChangerSigneDe Target
Application.EnableEvents = True
End Sub
' >>> FONCTION LORSQU'ON DOUBLE CLIC SUR UNE CELLULE
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("E:E")) Is Nothing Then Exit Sub
Application.EnableEvents = False
ChangerFlecheEtSigne Target
Application.EnableEvents = True
End Subça fonctionne, merci beaucoup !! :)
Bonne journée.
Merci pour votre retour, content d'aider.
N'oubliez pas de cloturer le post, bonne journée
Bonjour,
J'essaie de faire la même chose que pour les colonnes E;F, mais aussi pour les colonnes G:H (en plus). Je n'arrive pas à le faire fonctionner (j'ai fait plusieurs tests en rajoutant le même code en plus pour les colonnes G et H mais ça ne fonctionne pas).
Sauriez-vous comment faire s'il vous plaît ?
Merci.
Bonjour,
En suivant la même logique, ceci devrait fonctionner
' >>> FONCTION LORSQU'ON MODIFIE LA CELLULE
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("E:F,G:H")) Is Nothing Then Exit Sub
Application.EnableEvents = False
ChangerSigneDe Target
Application.EnableEvents = True
End Sub
' >>> FONCTION LORSQU'ON DOUBLE CLIC SUR UNE CELLULE
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Intersect(Target, Range("E:E,G:G")) Is Nothing Then Exit Sub
Application.EnableEvents = False
ChangerFlecheEtSigne Target
Application.EnableEvents = True
End Sub