Application.CountIf compte pas un nom mais tous les noms compris dans une l

Bonjour

J'ai créé un code mais je souhaiterais que Application.CountIf ne compte pas seulement un nom (ici CA) mais tous les noms compris dans une liste (ex: colonne P et Q).

voici mon code:

je souhaiterais que pour toute les fois à la place de "CA" il y ait une liste de nom (ex:liste dans une colonne)

Dim nABSSOG&, nABSINC2&, nABSINC1&

Private Sub Worksheet_Change(ByVal Target As Range)

Dim nABSSOG As Double

Dim nABSINC2 As Double

Dim nABSINC1 As Double

If Intersect([C9:M29], Target) Is Nothing Then Exit Sub

nABSSOG = Application.CountIf(Intersect([9:11], Target.EntireColumn), "CA")

nABSINC2 = Application.CountIf(Intersect([9:17], Target.EntireColumn), "CA")

nABSINC1 = Application.CountIf(Intersect([9:29], Target.EntireColumn), "CA")

If nABSSOG > 2 Then

MsgBox "Le nombre maximal de SOG absent est atteint !", vbCritical, "Absence"

Target.Interior.Color = RGB(255, 255, 255)

Application.EnableEvents = False

Target.ClearContents

Application.EnableEvents = True

End If

If nABSINC2 > 4 Then

MsgBox "Le nombre maximal d'INC2 absent est atteint !", vbCritical, "Absence"

Target.Interior.Color = RGB(255, 255, 255)

Application.EnableEvents = False

Target.ClearContents

Application.EnableEvents = True

End If

If nABSINC1 > 10 Then

MsgBox "Le nombre maximal d'INC1 est atteint !", vbCritical, "Absence"

Target.Interior.Color = RGB(255, 255, 255)

Application.EnableEvents = False

Target.ClearContents

Application.EnableEvents = True

End If

End Sub

Merci par avance

Manu

3test.zip (80.15 Ko)

Bonjour Manjul,

En retour ton fichier modifié. L'exemple a été fait pour les 13 premières lignes de la colonne P. couleur beige

Sur le choix de la colonne du 9 septembre. Cette dernière est actuellement fixe mais le choix peut être modifiable.

C'est à dire adapté à d'autres colonnes. Voir aussi la macro événementielle.

Si le principe te convient fais moi un retour.

A suivre...

2testmanjulmod.zip (84.39 Ko)

J'ai modifié légèrement pour que cela s'applique à mes 3 plages: SOG, INC2 et INC1.

Concernant ton code ça ne fonctionne pas comme je voudrais car nABSSOG doit être la somme de tous les valeurs de la colonne Q nABSSOG = nombre de CA + nombre de ST + ..... pour avec le code bloquer si nABSSOG > 2

dans mon exemple joint ça ne fonctionne pas

Merci

A nouveau,

Pour cela fait la somme total en Q42 des cellules lignes 2 à 41. Et si total >2 ressort ton message.

Suite,

Donc dans Private sub WS_change

nABSSOG = Range("Q42") au lieu de ...Max(Range("Q2:Q13")

ou plus rapidement

If range("Q42") > 2 then

MsgBox... etc...

J'y ai pensé mais cela sera bon que pour une colonne en l’occurrence pour l'exemple la colonne E mais ça serait laborieux car il faudrait faire un nouveau tableau où il sera reporté pour chaque jour 3 colonnes pour les absences jours et 3 colonnes pour les absences nuits...

Dans mon code original:

nABSSOG = Application.CountIf(Intersect([9:11], Target.EntireColumn), "CA")

il suffirait qu'à la place de "CA", il y ait "CA", "CAJ", "ST"... ou une autre formule

Facile à imaginer mais difficile à mettre en œuvre

Merci

Suite,

Comme précisé dans la 1iere réponse, c'était testé pour la colonne E.

Mais il suffit en fait de cliquer sur une cellule d'une colonne du tableau.

Pour pouvoir adapter la formule à la colonne cliquée.

Je peux te laisser la formule si tu le souhaites.

oui je veux bien la formule pour essayer de l'adapter.

Merci bien

Suite,

Dans la cellule Q3, inscris =NB.SI(Indirect(Q$2);P3) puis cette formule à recopier jusqu'à la ligne 41 ou P3 sera donc P41.

Ensuite dans la macro Private Sub WS_Change

place après If Intersect.....then Exit Sub

Col=Chr(Target.Column + 64)

[Q2]= Col & 9 & ":" & Col & 29 ' Note pour les lignes 9 à 29 ou met 46 à la fin si tu prends toutes les lignes du tableau.

Ainsi ce sera adapté à la colonne visée.

Bonjour

Cela semble fonctionner comme je souhaite mais afin de na pas faire sans savoir, pourriez-vous me renseigner sur cette partie du code? quelle est l'action? pourquoi 64?

Col=Chr(Target.Column + 64)

Merci bien

Bonjour Manjul,

pourriez-vous me renseigner sur cette partie du code? quelle est l'action? pourquoi 64?

Col=Chr(Target.Column + 64)

Merci bien

Target.Column te renvoie le numéro de colonne. Donc si tu clique sur la colonne A par exemple, cela renverra 1 pour la 1ière colonne de la feuille.

Je rajoute 64 à ce numéro, ce qui fait dans cet exemple 65. Et la fonction Chr (VBA) est l'équivalent de la fonction CAR que tu peux utiliser directement sur une cellule de ta feuille. Tapes dans une feuille = CAR(65). La cellule affichera A. Et ainsi de suite pour toutes les lettres de l'alphabet.

Vu que ton tableau ne dépasse pas la colonne Z, on peut utiliser cette façon de faire.

Il y a aussi d'autres manières. Un exemple avec le code ci-dessous te permet de savoir les Lettres des colonnes n° 27 à plus, composé de deux lettres seulement.

Sub LettreCol()
Range("A1") = left(Range("AA1").address(RowAbsolute, ColumnAbsolute), 2)
End sub

Bonne continuation.

Merci pour cette explication

Rechercher des sujets similaires à "application countif compte pas nom tous noms compris"