Compter une occurrence une seule fois
Bonjour chers membres du Forum.
Dans le cadre d'un projet, je suis confronté à un problème de comptage d'occurrence. Je dispose d'un fichier (ci-joint) concernant les informations des salariés d'une start up en informatique. Ces infos sont réparties sur trois feuilles de calcul et comprennent des infos relatives aux salariés, à leurs contrats et à leurs formations. Comme cela peut sauter aux yeux, c'est un fichier relatif au traitement RH de notre start up.
Ici, mon souci est de compter pour une année (2015 par exemple), et à l'aide d'un code VBA, le nombre de salarié ayant suivi une formation selon le genre et le statut. Et un salarié ne peut être compter qu'une seule et une fois même s'il a eu à suivre plusieurs formations au cours de l'année.
Par ailleurs, les informations relatives aux genres se retrouvent dans la feuille "salarié", et celles concernant le statut dans la feuille "contrats". J'ai élaboré deux fonctions VBA qui permettent de les déterminer automatiquement.
Public Function genre(acronyme As String)
'Cette fonction évalue le sexe du salarié
Dim WksS As Worksheet
Dim rCel As Range
Dim iRowS As Integer
Set WksS = Worksheets("Salariés")
iRowS = WksS.Range("A" & Rows.Count).End(xlUp).Row
Set rCel = WksS.Range("A2:A" & iRowp).Find(what:=acronyme, lookat:=xlWhole, searchdirection:=xlNext)
If WksS.Range("D" & rCel.Row).Value = "H" Then
genre = "H"
Else
genre = "F"
End If
End Function
Public Function statut(acronyme As String, annee As Integer)
'Cette fonction évalue le statut du salarié
Dim wksC As Worksheet
Dim rCel, rCels As Range
Set wksC = Worksheets("Contrats")
Set rCels = wksC.Range("A2:" & wksC.Range("A2").End(xlDown).Address)
For Each rCel In rCels
If wksC.Range("A" & rCel.Row).Value = acronyme And _
annee >= wksC.Range("J" & rCel.Row).Value And annee <= wksC.Range("K" & rCel.Row).Value Then
If wksC.Range("F" & rCel.Row).Value = "Cadre" Then
statut = "Cadre"
Exit For
ElseIf wksC.Range("F" & rCel.Row).Value = "Non cadre" Then
statut = "Non cadre"
Exit For
Else
statut = "Autres"
Exit For
End If
End If
Next rCel
End Function
Sub formation_pro()
Dim wksF As Worksheet
Dim rCel, rCels As Range
Dim irowF, icompteur As Integer
icompteur = 0
Set wksF = Worksheets("Formation")
irowF = wksF.Range("A" & Rows.Count).End(xlUp).Row
Set rCels = wksF.Range("A2:" & wksF.Range("A2").End(xlDown).Address)
'Nombre de personnes formées au cours d'une année
'Cadres
'Hommes
'Non cadre
'Hommes
'Femmes
End SubMaintenant mon souci, c'est de les utiliser et de compter une seule fois un salarié remplissant les différents critères (sexe et statut). Merci d'avance pour vos suggestions.
bonjour
pas de VBA surtout pas de VBA !
onglet Formation ajouter une colonne "genre" et une colonne "statut" (avec des RECHERCHEV ou INDEX comme tu sais le faire)
puis des SOMMEPROD ou un TCD devraient donner la réponse
vu le métier de ton entreprise, ça doit pas poser trop de problème
Bonjour
Bonjour à tous
Un essai avec macro à tester. Te convient-il ?
Bye !
Bonsoir le forum,
Bonsoir Ekoue09,
Bonsoir les cracks,
la version au petit bouton rouge... fort similaire à celle de gmb!
Private Sub cmdGO_Click()
'
Dim tTabS, tTabC, tTabF
Dim sNom As String
'
tTabS = [Tableau3]
tTabC = [Tableau1]
tTabF = [Tableau4]
For x = 2 To 3
[Tableau6].Cells(x, 2) = ""
[Tableau6].Cells(x, 3) = ""
Next
'
For x = 1 To UBound(tTabF, 1)
sNom = tTabF(x, 1)
For y = 1 To UBound(tTabS, 1)
If CStr(tTabS(y, 1)) = sNom And tTabS(y, 5) <> 1 And CInt(tTabF(x, 6)) = CInt([I6]) Then
tTabS(y, 5) = 1
iCol = IIf(Trim(CStr(tTabS(y, 4))) = "H", 2, 3)
For Z = UBound(tTabC, 1) To 1 Step -1
If Trim(CStr(tTabC(Z, 1))) = sNom Then
iRow = IIf(Trim(CStr(tTabC(Z, 6))) = "Cadre", 2, 3)
Exit For
End If
Next
[Tableau6].Cells(iRow, iCol) = [Tableau6].Cells(iRow, iCol) + 1
Exit For
End If
Next
Next
'
End SubBon travail!
A+
Salut jmd, gmb et cururils57,
Grand merci pour vos approches de solutions. Elles sont très édifiantes les unes que les autres, d'une qualité et d'une finesse sans pareil. Un clin d'oeil à la performance du code.
De plus, elles sont assez intéressantes car faisant parties des méthodes que je n'ai pas encore eu l'occasion d'utiliser jusqu'à présent.
Jmd merci pour ton conseil, je prends bonne note! Sauf qu'ici, il m'a été demandé d'automatiser ce processus, et je suis obligé de passer par VBA.
Merci à vous tous, vous êtes au top!!