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

Limiter une fonction perso CountColor en colonne B selon l'année présente en A

8 réponses
Avatar
Jarobasearobase
Excel 2003

Bonjour à tous

Pour une fonction perso CountCcolor agissant en col B, comment la limiter selon l'année existant en
A12:Ax (calendrier au format jjj jj mm aaaa) qui est comparée à A9 (au format aaaa), s'il vous plait?

La fonction =CountColor($B$11:$B$1830;A1) compte les cellules de même fond que celles de références
situées de A1 à A8 et fonctionne parfaitement.

'************
Function CountColor(range_data As Range, criteria As Range) As Long
Dim datax As Range
Dim xcolor As Long
xcolor = criteria.Interior.ColorIndex

For Each datax In range_data
If datax.Interior.ColorIndex = xcolor Then
CountColor = CountColor + 1
End If
Next datax
End Function
'************

J'ai essayé, bien sûr sans résultats :
' If Not Intersect(Target, range_data) Is Nothing Then
' If Target.Offset(-1, 0).Value = "A9".Value Then
et
' If DateDiff("yyyy", range_data, [A9]) = 0 Then
et bien d'autres bidouillages ...

Merci
J@@

8 réponses

Avatar
MichD
Bonjour,
Essaie comme ceci :
Dans une cellule de la feuille de calcul, tu saisis la formule de cette
manière :
B1:B10 -> la plage de cellule
D3 -> la cellule contenant la cellule de comparaison
=CountSameYear(B1:B10;D3)
Cette fonction doit être mise dans un MODULE STANDARD.
'--------------------------
Function CountSameYear(range_data As Range, criteria As Range) As Long
Dim datax As Range, S As Long
For Each datax In range_data
If Year(datax) = Year(criteria) Then
S = S + 1
End If
Next datax
CountSameYear = S
End Function
'--------------------------
MichD
Avatar
Jarobasearobase
Bonjour MichD
Merci pour le code. il me donne bien le nbre de jours correspondant à l'année notée en A9.
Mais en dessous à partir de A11, c'est un calendrier complet de plusieurs années.
Je cherche à compter les cellules en colonne B dont la date en A correspond à l'année en A9.
Comment associer les 2 codes, le code CountColor et le code CountSameYear :
'---------------------------
Function CountColor(range_data As Range, criteria As Range) As Long
Dim datax As Range
Dim xcolor As Long, S As Long
xcolor = criteria.Interior.ColorIndex
For Each datax In range_data
If Year(datax) = Year(criteria) Then 'si la date en A est de l'année en A9
If datax.Interior.ColorIndex = xcolor Then 'alors seulement je totalise les cellules
CountColor = CountColor + 1 'de même fond
End If
End If
Next datax
End Function
'---------------------------
Fonction appliquée '=CountColor($B$11:$B$1830;A1)
Merci
J@@
Le 14/01/2019 à 01:38, MichD a écrit :
Bonjour,
Essaie comme ceci :
Dans une cellule de la feuille de calcul, tu saisis la formule de cette manière :
B1:B10 -> la plage de cellule
D3 -> la cellule contenant la cellule de comparaison
=CountSameYear(B1:B10;D3)
Cette fonction doit être mise dans un MODULE STANDARD.
'--------------------------
Function CountSameYear(range_data As Range, criteria As Range) As Long
    Dim datax As Range, S As Long
    For Each datax In range_data
    If Year(datax) = Year(criteria) Then
    S = S + 1
    End If
    Next datax
   CountSameYear = S
End Function
'--------------------------
MichD
Avatar
MichD
Dans la cellule tu écris :
=CountSameYear_Et_Couleur(A1:A9;C4;D1)
A1:A9 -> Plage de cellules
C4 -> cellule contenant une date (année)
D1 -> cellule contenant la couleur de comparaison
'-----------------------------
Function CountSameYear_Et_Couleur(range_data As Range, _
CritAn As Range, CritCoul As Range) As Long
Dim datax As Range, S As Long
For Each datax In range_data
If Year(datax) = Year(CritAn) Then
If datax.Interior.Color = CritCoul.Interior.Color Then
S = S + 1
End If
End If
Next datax
CountSameYear_Et_Couleur = S
End Function
'-----------------------------
MichD
Avatar
Jarobasearobase
Bonjour Denis
Merci.
2 points :
- la fonction ne s'exécute pas automatiquement : il faut entrer dedans et cliquer entrée. Que faire?
- comment modifier le code car le champ date est bien A1:A9 (pour reprendre ton exemple),mais les
couleurs sont "saisies" en B1:B9 (c'est à dire que celui qui saisit ne touche pas à la colonne
"calendrier", il ne modifie que celle en face, la B1:B9.
Merci pour tes lumières (et ta patience).
Bien cordialement
J@@
-
Le 14/01/2019 à 16:11, MichD a écrit :
Dans la cellule tu écris :
=CountSameYear_Et_Couleur(A1:A9;C4;D1)
A1:A9 -> Plage de cellules
C4 -> cellule contenant une date (année)
D1 -> cellule contenant la couleur de comparaison
'-----------------------------
Function CountSameYear_Et_Couleur(range_data As Range, _
                    CritAn As Range, CritCoul As Range) As Long
     Dim datax As Range, S As Long
     For Each datax In range_data
     If Year(datax) = Year(CritAn) Then
        If datax.Interior.Color = CritCoul.Interior.Color Then
            S = S + 1
        End If
     End If
     Next datax
    CountSameYear_Et_Couleur = S
End Function
'-----------------------------
MichD
Avatar
MichD
J'ai simplement ajouté à la fonction : Application.Volatile
La fonction réagit non pas au formatage d'une cellule, mais dès que tu
modifies le contenu d'une cellule peu importe laquelle, la fonction
s'exécute.
'-----------------------------
Function CountSameYear_Et_Couleur(range_data As Range, _
CritAn As Range, CritCoul As Range) As Long
Application.Volatile
Dim datax As Range, S As Long
For Each datax In range_data
If Year(datax) = Year(CritAn) Then
If datax.Interior.Color = CritCoul.Interior.Color Then
S = S + 1
End If
End If
Next datax
CountSameYear_Et_Couleur = S
End Function
'-----------------------------
MichD
Avatar
Jarobasearobase
Excellent. Merci (j'avais oublié ce volatile)
Sinon vois-tu comment modifier le code car si le champ date est bien A1:A9 (pour reprendre ton
exemple), les couleurs sont "saisies" en B1:B9 (c'est à dire que celui qui saisit n'accède pas à la
colonne "calendrier", il ne modifie que celle en face, la B1:B9 ?
Merci encore de te pencher sur ce point.
J@@
Le 14/01/2019 à 17:26, MichD a écrit :
J'ai simplement ajouté à la fonction : Application.Volatile
La fonction réagit non pas au formatage d'une cellule, mais dès que tu modifies le contenu d'une
cellule peu importe laquelle, la fonction s'exécute.
'-----------------------------
Function CountSameYear_Et_Couleur(range_data As Range, _
                     CritAn As Range, CritCoul As Range) As Long
    Application.Volatile
      Dim datax As Range, S As Long
      For Each datax In range_data
      If Year(datax) = Year(CritAn) Then
         If datax.Interior.Color = CritCoul.Interior.Color Then
             S = S + 1
         End If
      End If
      Next datax
     CountSameYear_Et_Couleur = S
End Function
'-----------------------------
MichD
Avatar
MichD
Sinon vois-tu comment modifier le code car si le champ date est bien
A1:A9 (pour reprendre ton exemple), les couleurs sont "saisies" en B1:B9
(c'est à dire que celui qui saisit n'accède pas à la colonne
"calendrier", il ne modifie que celle en face, la B1:B9 ?

Bonjour,
Ce que tu demandes, c'est vite vu!
Il n'y a aucun moyen dans Excel de détecter la modification d'un format
de cellule. Par conséquent, il n'y a aucun moyen d'écrire une fonction
qui se met à jour automatiquement suite à une modification d'un format
de cellule.
"Application.Volatile" permet de mettre à jour une fonction
automatiquement à chaque fois qu'une cellule est mise en mode "édition"
soit par un double-clic ou par l'appui sur la touche F2.
MichD
Avatar
Jarobasearobase
Bonjour
Entendu.
Merci pour ton aide.
Bonne journée.
Cordialement
J@@
Le 15/01/2019 à 01:13, MichD a écrit :
Sinon vois-tu comment modifier le code car si le champ date est bien A1:A9 (pour reprendre ton
exemple), les couleurs sont "saisies" en B1:B9 (c'est à dire que celui qui saisit n'accède pas à
la colonne "calendrier", il ne modifie que celle en face, la B1:B9 ?

Bonjour,
Ce que tu demandes, c'est vite vu!
Il n'y a aucun moyen dans Excel de détecter la modification d'un format de cellule. Par conséquent,
il n'y a aucun moyen d'écrire une fonction qui se met à jour automatiquement suite à une
modification d'un format de cellule.
"Application.Volatile" permet de mettre à jour une fonction automatiquement à chaque fois qu'une
cellule est mise en mode "édition" soit par un double-clic ou par l'appui sur la touche F2.
MichD