Relancer le calcul dans code VBA

Bonjour à tous,

Je change une valeur dans une cellule A1. Une formule en A2 dépendante de la valeur de A1 se modifie en conséquence.

Admettons que A1 = "1" et A2 = "4,5".

Mon code VBA dit que si A2 > "5,0" alors le fond de la cellule devient rouge, sinon elle reste incolore.

Lorsque je mets A1 = "2" alors A2 = "7".

Pour avoir la coloration de A2 en rouge, je dois valider A1 = "2" une seconde fois.

Opération inverse, même problématique : lorsque je repasse A1 = "1", je dois le revalider une seconde fois pour obtenir la décoloration du fond rouge de A2.

Dans le cas du passage de A1 = "1" à A1 = "2", je réalise un test dans mon code VBA via MsgBox("A1") et le renvoi est bien "2", pourtant le MsgBox("A2") renvoie "4,5" et non "7".

J'ai essayé d'ajouter Application.Calculate, le résultat reste le même, il ne semble recalculer la feuille qu'à la fin du code. J'ai également essayé Application.EnableEvents = True en début de code, aucun changement.

Je subis donc un décalage sur l'application de ma coloration en cellule A2 car la valeur ne se rafraichit pas dans mon code VBA suite au changement de la valeur de A1.

Pouvez-vous m'aider sur ce sujet ?

Je vous remercie d'avance.

Cordialement,

Bonjour,

comme tu parles de pb de code il aurait fallu le mettre...
Et depuis 2014 tu devrais savoir que mettre un fichier augmente le nombre de réponses et leur fiabilité.

Je pense que tu confonds "1" (chaine de caractère) avec 1 (numérique)
eric

Bonjour eriiic,

Non je ne confonds pas chaine de caractère et numérique, j'ai utilisé cette typologie juste comme ça pour bien marquer les choses !

Voici une partie seulement du code :

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False

Dim DN As String
Dim Tronçon_DN As Variant
Dim Tronçon_Longueur As Variant
Dim Tronçon_NuméroSST As Variant
Dim Tronçon_Nom As Variant
Dim Tronçon_Pertesdecharge As Variant
Dim Tronçon_Densité As Variant
Dim Tronçon_Vitesse As Variant
Dim MyRange As Range
Dim wb As Workbook: Set wb = ThisWorkbook
Dim ws As Worksheet
Dim wsv As Worksheet
Set ws = wb.Sheets("Tronçon")
Set wsv = wb.Sheets("Vitesse")

On Error GoTo GestionErreurs 'Renvoi à la gestion d'erreur en bas de macro

'Modification du DN :
    If ActiveCell.Offset(-1, 0).NumberFormat = """" & "DN" & """" & Space(1) & "####" Then 'Pour éviter un lancement de macro à chaque modification de cellule
    'Viens écrire le DN, la longueur et le numéro de la SST desservie par le tronçon dans l'onglet "Tronçon" après modification du DN du tronçon dans l'onglet "Réseau"
        Tronçon_Nom = ActiveCell.Offset(-1, -1)
        Tronçon_DN = ActiveCell.Offset(-1, 0)
        Tronçon_Longueur = ActiveCell.Offset(0, 0)
        Tronçon_NuméroSST = ActiveCell.Offset(4, 1)
        Tronçon_Pertesdecharge = ActiveCell.Offset(7, 0)
        Tronçon_Densité = ActiveCell.Offset(10, 0)
        Tronçon_Vitesse = ActiveCell.Offset(8, 0)

                If Tronçon_Pertesdecharge > 30 Then
                    ActiveCell.Offset(7, 0).Interior.ColorIndex = 3
                Else
                    ActiveCell.Offset(7, 0).Interior.Color = RGB(218, 150, 148)
                End If

                If Tronçon_Densité < 1.5 Then
                    ActiveCell.Offset(10, 0).Interior.ColorIndex = 3
                Else
                    ActiveCell.Offset(10, 0).Interior.Color = RGB(218, 150, 148)
                End If

        Worksheets("Vitesse").Activate

        Set MyRange = wsv.Range("B4:C24").Find(Tronçon_DN, , xlValues, xlWhole).Offset(0, 1)

        Worksheets("Réseau").Activate
                If Tronçon_Vitesse > MyRange Then
                    ActiveCell.Offset(8, 0).Interior.ColorIndex = 3
                Else
                    ActiveCell.Offset(8, 0).Interior.Color = RGB(218, 150, 148)
                End If

L'opération se passe très bien pour les tests "If" sur "Tronçon_Pertesdecharge" et "Tronçon_Densité".

En revanche, mon problème s'applique sur le test "If" du "Tronçon_Vitesse" (dernière partie de ce morceau de code).

Déjà tu peux enlever Worksheets("Vitesse").Activate et Worksheets("Réseau").Activate qui ne servent à rien d'autre que ralentir ici.

D'autre part tu dois typer tes variable au plus près du besoin. As Variant ne sert à rien, c'est la valeur par défaut.
Par exemple quel doit être le type de Tronçon_Vitesse ??
Tu le compares à If Tronçon_Vitesse > MyRange.
C'est un Range, précise toujours la propriété voulue (.Value sans doute), ne fait jamais confiance au choix automatique de VBA.

D'autre part, avec Set MyRange = wsv.Range("B4:C24").Find(Tronçon_DN, , xlValues, xlWhole).Offset(0, 1) es-tu sûr à 120% que la valeur sera trouvée ?
Si non, il faut tester MyRange avant de l'utiliser.
If not MyRange is nothing then .... Là tu peux faire ton .Offset(0, 1) et la suite

Si tu n'as pas assez d'éléments pour trouver tu peux faire un fichier de travail avec le pb
eric

Alors, j'ai essayé en rajoutant .Value sur MyRange lors du test If, mais ça ne change rien.

Le problème se situe ici :

If Tronçon_Vitesse > MyRange.Value Then

Mon MyRange a la bonne valeur, mais Tronçon_Vitesse non. Sa valeur se modifie après l'exécution de la macro et donc le test If est faussé.

PS :

        Set MyRange = wsv.Range("B4:C24").Find(Tronçon_DN, , xlValues, xlWhole).Offset(0, 1)

        MsgBox (MyRange)

Je confirme avoir la bonne valeur dans chaque cas !

si tu as des calculs lourds sur ta feuille il faut attendre qu'ils aient fini.
Avant ton test :

    Do Until Application.CalculationState = xlDone
        DoEvents
    Loop

Je n'ai aucun calcul lourd, tout se met à jour très rapidement (moins d'une seconde) lors d'un changement de valeur. Par contre, ton code fait planter totalement mon fichier (j'ai essayé plusieurs fois...).

et bien dépose un fichier de travail réduit au minimum pour avoir le pb

Malheureusement mon fichier est une "usine à gaz" et l'alléger reviendrait à ne plus pouvoir le faire fonctionner... Et ma société ne m'autorise pas à l'envoyer dans son intégralité.

Tronçon_Nom = ActiveCell.Offset(-1, -1)
        Tronçon_DN = ActiveCell.Offset(-1, 0)
        Tronçon_Longueur = ActiveCell.Offset(0, 0)
        Tronçon_NuméroSST = ActiveCell.Offset(4, 1)
        Tronçon_Pertesdecharge = ActiveCell.Offset(7, 0)
        Tronçon_Densité = ActiveCell.Offset(10, 0)
        Tronçon_Vitesse = ActiveCell.Offset(8, 0)

J'ai testé les valeurs via MsgBox de Pertesdecharge et Densité, ma mise en couleur fonctionne. Et la différence est là : Lorsque je change ma cellule d'entrée qui déclenche la macro, les valeurs Pertesdecharge et Densité s'actualise avant les tests de la macro, ce qui n'est pas le cas de Vitesse ! Voilà, mon problème se précise mais je n'ai toujours pas la solution : pourquoi 2 cellules prennent une nouvelle valeur comme il se doit mais pas la 3ème cellule ?

Rechercher des sujets similaires à "relancer calcul code vba"