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 Sub

Maintenant 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.

33classeur1.xlsx (17.43 Ko)

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 !

39classeur1-v1.xlsm (32.79 Ko)

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 Sub

Bon travail!

A+

30formations.xlsm (29.07 Ko)

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!!

Rechercher des sujets similaires à "compter occurrence seule fois"