Calcul automatique de Excel VBA UDF lié aux propriétés cellulaires

J'ai écrit un UDF pour countr des cellules de certaines colors et avec certains LineStyles, je publie toute la fonction:

Function CountTime(rData As Range, cellRefColor As Range) As Variant Dim indRefColor As Long Dim cellCurrent As Range Dim cntRes As Variant Application.Volatile cntRes = 0 indRefColor = cellRefColor.Cells(1, 1).Interior.Color For Each cellCurrent In rData If indRefColor = cellCurrent.Interior.Color Then cntRes = cntRes + 1 End If If cellCurrent.Borders(xlDiagonalUp).LineStyle <> xlNone Then cntRes = cntRes + 0.5 End If Next cellCurrent CountTime = cntRes End Function 

Maintenant, le problème que j'ai est que la formule ne calcule pas automatiquement lorsque l'une des cellules de rData a des propriétés de couleur ou de ligne modifiées. J'ai ajouté Application.Volatile et j'ai également essayé de triggersr le calcul par un sous-plan Worksheet_Change , mais cela ne fonctionne pas car Excel ne semble pas envisager de modifier la couleur d'un changement dans la cellule / feuille de calcul.

Existe-t-il un moyen de calculer la cellule et de la mettre à jour automatiquement lorsqu'un user modifie les propriétés de la couleur ou de la ligne d'une cellule dans rData ?

EDIT – SOLVED Merci beaucoup d'ignotus, la solution de rechange ChangeSelection est assez bonne pour mes besoins. Je n'y pensais pas. Et les informations de base sont également utiles, merci beaucoup.

Je ne pense pas que cela soit possible, mais une solution assez juste serait de recalculer lorsque vous quittez une cellule ou la modifiez:

 Private Sub Worksheet_Change(ByVal Target As Range) Me.Calculate End Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) Me.Calculate End Sub 

Ou comme alternative, placez un button sur la feuille qui Me.Calculate

FYI: Qu'est-ce que Me ? La source

Me réfère à l'object parent à partir duquel le code est "assis". Si vous écrivez dans un module de feuille, le Me se référera à cette feuille spécifique.

L'utilisation de Me est pratique parce que nous n'avons pas à nous soucier du changement de nom de la feuille, et cela rend aussi un peu facile pour les futurs lecteurs de code car ils ne doivent pas se callbacker que "UserForm principal" est le UserForm que nous travaillons actuellement sur. Vous pouvez appliquer les mêmes methods au Me que vous pourriez postuler à l'object si vous avez donné le nom complet.

Dans le Sheet1 module , les lignes suivantes sont identiques:

 Worksheets("Sheet1").Range("A1").Select Me.Range("A1").Select 

Si votre fonction s'exécute très rapidement (par exemple, sous 50 ms), vous pouvez l'appeler à partir du gestionnaire d'events Private Sub Worksheet_SelectionChange(ByVal Target As Range) ; Les users ne se rendront pas count que cela se produit. Un autre problème avec cette solution serait lorsque l'user change de format et quitte la feuille de travail tout de suite. Ensuite, si vous voulez que les récapitulatifs se produisent, vous pouvez, peut-être, utiliser le Private Sub Worksheet_Deactivate() pour l'exécuter. Il existe d'autres possibilités, aucune à l'épreuve de la balle ni à distance simple.