Total présence enfant par tranches horaire
Bonjour,
Pour la garderie , j'ai un tableau de présence à faire avec 3 types de tranches horaires :
1- le matin
2 - ST1 (Soir tranche 1) = 16h30/17h30
3 - ST2 (Soir Tranche 2) = 17h30/18h30
chaque élève peut-être présent que le matin, sinon, que le ST1, ou que
le ST2, ou
le matin + ST1, ou le matin +ST2, dans chacun des cas, on coche la case correspondante
et il faut donc que je compte le nombre de fois où il n'est là que le matin, ou que le ST1, ou que le ST2, sinon, le matin + ST1, ou le matin +ST2
Quelle sont, selon vous, les formules idéales
merci d'avance pour aide !
bonjour bugg, une fonction personnalisée.
déjà, merci pour la réponse !
J'ai vu que vous aviez ajouté cette fonction :
Function Compter(plage)
Dim Arr, Dict
Arr = plage.Value2
If UBound(Arr, 2) Mod 3 = 0 Then
Set Dict = CreateObject("scripting.dictionary")
For i = 1 To UBound(Arr, 2) - 2 Step 3
s = ""
For j = 0 To 2
s = s & -(Arr(1, i + j) <> "")
Next
Dict(s) = Dict(s) + 1
Next
Compter = Array(Dict("100") + 0, Dict("010") + 0, Dict("001") + 0, Dict("110") + 0, Dict("101") + 0)
Else
Compter = "erreur mod 3"
End If
End FunctionPouvez-vous me l'expliquer pour que je l'adapte à mon tableau?
merci d'avance !
bonjour bugg,
la fonction avec commentaire et un petit peu modifié et le fichier avec des erreurs dans les lignes 8-9 et puis les lignes 10-17, les 8 possibilités dans la plage AU10:AW17
Function Compter(plage)
'*****************************************************************************************************************************************
' la plage sera par exemple $E5:$AW5 = 45 celluiles = 15 jours de 3 tranches
'
'on créera dans 2 boucles 15 strings (=les jours) de 3 (les tranches d'un jour) avec un 0 ou 1,dépendant du contenu de la cellule (0=vide,1=non-vide ou si vous voulez un x ou ...)
'comme-ça on a par exemple des strings comme "000", "001", "010", ... (normallement 8 combinaisions possible)
'on peut utiliser un dictionaire pour facilement compter le nombre d'ouccurences de chaque combinaison.
'pour par exemple "100" = combinaison d'un jour avec seulement le matin , ce résultat est l'item = dict("100") et le résultat est oubien vide (aucune occurrence) oubien un chiffre de 1 à 15
'au bout, on s'intéresse seulement le résultat de 5 de ces 8 combinaisons et on met leur résultat dans une matrice avec 5 éléments
'100 = seulement matin, 010 = seulement ST1, 001 = seulement ST2, 110 = matin et ST1 sans ST2, 101 = matin sans ST1 avec ST2
'cette matrice sera collée dans votre feuille dans la cellule contenant la formule et les 4 cellules à droite
'
'si le nombre de colonnes ou des lignes la plage n'étaient pas comme-il-faut, le résultat sera une cellule avec texte "Erreur, ...."
'****************************************************************************************************************************************
Dim Arr, Dict, i, j, s
Arr = plage.Value2
If UBound(Arr) = 1 And UBound(Arr, 2) Mod 3 = 0 Then 'nombre de lignes de la plage = 1 & nombre des colonnes horizontales de la plage est un multiple de 3
Set Dict = CreateObject("scripting.dictionary") 'on utilise un dictionaire pour compter
For i = 1 To UBound(Arr, 2) - 2 Step 3 'on boucle les cellules avec un intervalle de 3 = les jours
s = "" 'RAZ le string s
For j = 0 To 2 '2eme boucle de 3 = les tranches d'un jour
s = s & -(Arr(1, i + j) <> "") 'si la cellule n'était pas vide, on ajoute 1 àutrement 0 au string s
Next
Dict(s) = Dict(s) + 1 'au bout du 2eme boucle on a un string de 3 0 ou 1 et on compte les nombres de ces ocuurences dans les "items" du dictionaire
Next
Compter = Array(Dict("100"), Dict("010"), Dict("001"), Dict("110"), Dict("101")) 'résultat de la fonction = matrice avec le contenu de l'item de 5 des 8 combinaisons possible dans le dictionaire
Else
If UBound(Arr) > 1 Then
Compter = "Erreur, nombre de lignes >1"
Else
Compter = "erreur, nombre de colonnes n'est pas un multiple de 3" 'le resultat si le nombre de colonnes de la plage n'est pas un multiple de 3
End If
End If
End FunctionBonsoir,
merci pour vos explications !
j'ai tenté de reproduire dans mon tableau la même chose, et, j'ai une erreur #Valeur! (voir fichier joint)
pouvez-vous me dire pourquoi, ce que je fais de mal.
merci beaucoup d'avance pour votre aide vraiment sympa !
re,
1. La fonction a besoin de 5 cellules pour coller son résultat, la cellule elle-même avec la formule et les 4 cellules à droite. Ces 4 cellules devraient être vides. Cela n'est pas le cas, BA5 contient un "=". Supprimez son contenu et la fonction fera son boulot. Succès.
Edit : autres causes :
2. la formule est =compter($E5:$AW5), conc un ":" au lieu du ";"
3. le fichier est un "xlsx", donc il ne contient aucune macro. Vous devez copier le module de mon fichier dans votre fichier.
Edit 2 :
3 colonnes supplémentaires
- BD = nombre de cellules non-vides
- BE = nombre de cellules qui correspondent à une des 5 combinaisons prévues
- BF = nombre de cellules qui correspondent aux 3 autres combinaisons
Bonsoir,
Je tenais à vous remercier pour votre patience et vos explications, que j'ai dû relire plein de fois vos explications avant de comprendre et de l'adapter à mes tableaux ! Non pas que vos explications n'étaient pas claires, au contraire ! mais il me fallait comprendre la logique ! Merci encore !
J'ai quand même une dernière question : si je n'enregistre pas le fichier en xlsm, le fichier produit des erreurs contrairement au vôtre, pourquoi, selon vous ?
Bonjour,
Les codes que vous a fournis BsAlv sont du VBA = des "macros". Il faut donc enregistrer dans un format de fichier qui autorise les macros : XLSM ou XLSB.
Quand vous enregistrez votre fichier en XLSX, déjà vous devriez avoir un message d'alerte de type "vous risquez de perdre du contenu" et en effet, ce faisant, vous supprimez le code ajouté par BsAlv.