3 votes

Référence de la cellule Excel à sa valeur précédente (formatage conditionnel)

J'ai une bonne maîtrise du formatage conditionnel en général. Cependant, il y a un cas d'utilisation que je n'ai pas encore réussi à comprendre. Peut-être que quelqu'un pourrait me donner un indice sur la façon de le réaliser.

Je crée une liste MarketWatch d'instruments financiers sur une feuille. Les données en direct arrivent et changent fréquemment.

Ma question est la suivante : si le cours en direct de l'action ABC est de 5,00 USD, puis augmente, disons jusqu'à 5,50 USD, je voudrais que la cellule devienne verte. Si la valeur suivante est maintenant de 5,40 USD (ce qui est inférieur à la valeur "précédente" de la même cellule), je voudrais que la cellule devienne rouge. Et ainsi de suite, de manière continue.

Le point principal (qui rend la situation délicate) est que la référence de la cellule est dynamique - puisqu'elle fait référence à sa propre valeur précédente), et non à une "autre cellule" statique.

Quelles sont les possibilités d'y parvenir ?

enter image description here

1voto

Nader Points 1

Vous devrez effectuer cette opération manuellement, car elle n'est pas prise en charge par le formatage conditionnel standard.

Vous pourriez gérer cet événement : Private Sub Worksheet_Change(ByVal Target As Range)

Une façon de le faire est présentée ici : https://stackoverflow.com/questions/409434/automatically-execute-an-excel-macro-on-a-cell-change

Vous devrez comparer Target avec la valeur actuelle de la cellule. Vous pouvez ensuite définir la couleur de la cellule à l'aide de la commande cell.Interior.ColorIndex = ...

--

Deux choses en réponse au commentaire :

Vous avez raison de dire que Change ne concerne que les modifications apportées par l'utilisateur. Pour capturer également les recalculs, vous devez gérer l'événement Calculate également. En voici un exemple.

Private Sub Worksheet_Calculate()
  Call updateme
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  Call updateme
End Sub

Ces deux fonctions appellent une autre sous-routine updateme dès que l'un de ces événements se produit.

Dans cette fonction, vous devez vérifier si la valeur a changé, puis décider du changement de couleur. Cela signifie qu'il faut garder la trace de la valeur précédente dans une variable globale. Vous pourriez faire ceci :

Private Sub updateme()
  Set cell = ActiveSheet.Range("A5")
  newval = cell.Value
  If newval > lastval Then
    cell.Interior.ColorIndex = 3
  End If
  If newval < lastval Then
    cell.Interior.ColorIndex = 4
  End If
  If newval = lastval Then
    cell.Interior.ColorIndex = 2
    End If
lastval = newval
End Sub

Comment gardez-vous la trace de cette valeur, lastval entre les appels de fonction ? Vous devez initialiser le lastval comme une variable globale. Pour ce faire, vous devez créer un nouveau "Module" dans l'éditeur VBA, et ajouter ceci au module :

Public lastval As Double

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X