Dans ce cas, voilà une macro pour ton premier fichier :
Sub MoyenneParEntreprise()
Dim Eval() As Single, MaxLig As Long, Lig As Long, MaxCol As Integer, Col As Integer, Correspond As Range, N As Integer
With Sheets("Evaluation")
MaxLig = .Range("A" & .Rows.Count).End(xlUp).Row 'Identifie la dernière ligne
MaxCol = .Cells(1, .Columns.Count).End(xlToLeft).Column 'Dernière colonne
For Lig = 5 To MaxLig 'Pour chaque ligne
Moy = 0
N = 0
ReDim Eval(1)
For Col = 7 To MaxCol 'Pour chaque colonne
If .Cells(Lig, Col) = "x" Then 'Si la cellule contient "x"
Set Correspond = Sheets("Feuil2").Range("C2:C" & Sheets("Feuil2").Range("C" & Rows.Count).End(xlUp).Row).Find(.Cells(3, Col), LookIn:=xlValues, LookAt:=xlWhole) 'On cherche l'évaluation correspondant à ce chantier
If Not Correspond Is Nothing Then
If IsNumeric(Sheets("Feuil2").Cells(Correspond.Row, 4)) And Sheets("Feuil2").Cells(Correspond.Row, 4) > 0 Then
Eval(N) = Sheets("Feuil2").Cells(Correspond.Row, 4) 'Si on trouve une valeur numérique, alors on la garde en mémoire
N = N + 1
ReDim Preserve Eval(N)
End If
End If
End If
.Cells(Lig, 4) = Application.Average(Eval) 'Une fois que l'on a parcouru toutes les colonnes, on fait la moyenne des valeurs en mémoire
Next Col
Next Lig
End With
End Sub
Par contre, celà nécessite quelques points :
- -> Pas de changement de nom d'onglets (sinon il faut les modifier aussi dans le code)
- -> Le tableau des chantiers en feuille "Evaluation" comporte 4 lignes d'en-tête et le 1er chantier démarre en colonne G
- -> Cocher une case revient à y mettre un "x" (un autre caractère n'étant pas reconnu)
Je maintiens qu'un fichier mal conçu au départ te posera problème par la suite, et c'est valable pour tous les fichiers.