Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Changement du format d'une cellule sur un event ne marche plus.

2 réponses
Avatar
BeN
Bonjour,
J'ai déjà poster pour un problème avec la methode Application.Volatile
On m'a conseiller d'utiliser me.Calculate . ça ne marchais pas,j'ai donc
utiliser un Application.CalculateFull, là ça marché.

Le problème c'est que j'ai une procedure sur un évenement (Change), où
j'effectue une mise en forme conditionnelle, mais avec plus de 4 cas.
Mon problème est bisarre, ça me fait là même chose, que quand
j'utilisais le Application.Volatile dans une de mes fonctions, c'est à
dire, que dans ma procédure de coloration, les modification que je veux
faire ne sont pas prises en compte. Pourtant avec un point d'arrêt excel
passe bien sur ma ligne de code qui colore la cellule.

La fonction qui me pose problème est la suivante.

Public Function ble_dur(intervale As Range, culture As String) As Single
Dim total As Single
total = 0
For i = 1 To intervale.Rows.Count
If intervale.Cells(i, 1) = "Blé dur" Then
If ActiveSheet.Cells(intervale.Cells(i, 1).Row,
intervale.Cells(i, 1).Column - 1) = culture Then
total = total +
ActiveSheet.Cells(intervale.Cells(i, 1).Row, 3)
End If
End If
Next i
ble_dur = total
End Function

Au debut, quand j'avais mis un Application.Volatile avant le "Dim
total", ça me faisait le même problème. Donc en fait, vu que j'utilise
cette fonction par rapport aux cellules où j'applique la coloration. Je
forcé le recalcul à la fin de ma procedure de coloration, avec un
Application.Calculatefull . ça a marché un temps, donc après j'ai crée
des tableaux avec ma fonction "ble_dur" dedans. Tout va bien, ça me
recalcule tout comme il faut, puis je me suis rendu compte, que ma
coloration ne marchait plus. Un peu comme si ma fonction "ble_dur"
s'était mise toute seule, en Application.Volatile . J'ai vérifier mon
code, il n'y a pas de Application.Volatile dans ma fonction. J'ai tracé
ma procedure de coloration, et en fait. J'ai viré le
Application.CalculateFull et pourtant dès que je modifie une cellule, la
fonction "ble_dur" s'execute automatiquement, et met à jour les cellules
où je l'utilise. Alors qu'au debut, si je ne forcais pas le recalcul,
les cellules ne se mettaient pas à jour (Je devais revalider la cellule,
pour ça, ou bien forcer le recalcul).

Je vous colle ma procédure de coloration
Private Sub Worksheet_Change(ByVal Target As Range)
If ((Target.Row >= 5 And Target.Row <= 24) Or (Target.Row >= 26 And
Target.Row <= 48)) And (Target.Column >= 5 And Target.Column <= 10) Then
Select Case Target
Case "Blé dur"
With Target.Interior
.ColorIndex = 10
.Pattern = xlSolid
End With
Case "Prairie"
With Target.Interior
.ColorIndex = 43
.Pattern = xlSolid
End With
Case "Courges"
With Target.Interior
.ColorIndex = 46
.Pattern = xlSolid
End With
Case "Gel"
With Target.Interior
.ColorIndex = 40
.Pattern = xlSolid
End With
Case "Melons"
With Target.Interior
.ColorIndex = 6
.Pattern = xlSolid
End With
Case "Luzerne"
With Target.Interior
.ColorIndex = 50
.Pattern = xlSolid
End With
Case "P de terre"
With Target.Interior
.ColorIndex = 53
.Pattern = xlSolid
End With
Case "Oliviers"
With Target.Interior
.ColorIndex = 12
.Pattern = xlSolid
End With
Case Else
With Target.Interior
.ColorIndex = 0
.Pattern = xlSolid
End With
End Select
End If
End Sub

Donc en fait, si je modifie une cellule compris entre E5 à J24 ou
E26:J48, la coloration se fait en fonction du contenu. Sur les cases où
je l'applique, j'ai une liste de validation, avec les valeurs possible
(Blé dur, Prairie ...). Je veux que la coloration change en fonction de
ce que je rentre dans la cellule, donc je crois avoir utilisé le bon
évenement.
Cette procedure marche, si j'efface ma fonction blé_dur. Mais après
forcement je ne peux plus m'en servir :)

Ma procedure se trouve dans le module de la feuil1, et la fonction dans
un module (Module1).

Merci d'avance pour les réponses ;)

2 réponses

Avatar
BeN
J'ai un petit peu optimisé ma fonction. Voici la nouvelle version.

Public Function ble_dur(intervale As Range, culture As String) As Single
Dim total As Single
Dim Cellule As Range
total = 0
For Each Cellule In intervale
If Cellule = "Blé dur" Then
If ActiveSheet.Cells(Cellule.Row, Cellule.Column - 1) =
culture Then
total = total + ActiveSheet.Cells(Cellule.Row, 3)
End If
End If
Next Cellule
ble_dur = total
End Function

Bon ça ne change rien à mon problème, mais c'est plus propre (je debute
en vba, donc si mon code est un peu pourri, c'est normal :) ).
Avatar
BeN
J'ai remarqué un truc bisarre, si j'ai une seule cellule contenant ma
fonction et qui fait référence à une plage donnée, et que je modifie une
cellule dans cette plage, la fonction se lance deux fois.