Bonjour,
2 choses :
1. Je vois que tu as mis la fonction sous la feuille "Coût mensuel des tris". Il faut que tu la mettes dans un module.
Le code dans une feuille est fait pour les événements de la feuille. Ce n'est pas pour mettre des fonctions ou procédures.
=> cela devrait t'enlever l'erreur #NOM?, mais à mon avis tu auras encore une erreur (peut-être #VALEUR!).
2. La structure de ton classeur n'est pas exactement celle que je pensais, c'est peut-être pour ça qu'il y aura un autre problème.
Je pensais que tu avais un classeur de données avec les feuilles / jour + le coût horaire seulement. C'est pour ça que j'avais mis la ligne :
If feuille.Name <> "Coût horaire" Then
En effet cette ligne permettait de faire le calcul si le nom de la feuille est différent de "Coût horaire". Or, d'après la structure de ton classeur, il n'y a pas que cette feuille qu'il faut exclure.
Du coup, je vais adopter une autre stratégie : on va faire la somme sur les feuilles qui finissent par "2020" => càd dont les 4 premiers caractères en partant de la droite sont "2020". Pour cela on va utiliser la fonction Right.
1ère étape : sans variables
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| Function cout_mois(nomFichier As String, numMois As Range)
'nomFichier : variable de type texte qui est le nom du fichier dans lequel il y a les données (fichier avec 1 onglet/ mois)
'numMois : objet de type cellule qui est la cellule dans laquelle il y a le numéro correspondant au mois voulu
Application.ScreenUpdating = False 'application qui permet de figer l'écran pendant que la macro s'exécute (n'a aucun impacte sur la macro, c'est juste pour que ça tourne plus vite)
Dim fichier As Workbook 'objet correspondant au classeur avec les données (fichier avec 1 onglet/ mois)
Dim feuille As Worksheet ' objet correspondant à une feuille de classeur
Dim somme As Long 'variable de type nombre réel qui nous permettra de faire la somme des données voulues.
somme = 0 'pour l'instant on met la somme = 0
Set fichier = Workbooks(nomFichier & ".xlsx") 'on suppose que le fichier avec les données est déjà ouvert. Ici on attribut à l'objet "fichier" ce fameux fichier avec les données.
'Boucle pour aller chercher les sommes de chaque jour et faire le total
For Each feuille In fichier.Sheets 'Pour chaque feuille de l'ensemble des feuilles du fichier avec les données
If numMois.Value = feuille.Range("E50") Then 'on vérifier que dans cette feuille en E50, on a le numéro du mois qu'on veut
If Right(feuille.Name, 4) = "2020" Then somme = somme + feuille.Range("E48").Value 'on vérifie que la feuille correspond bien à une feuille quotidienne, puis on ajoute à la somme la cellule E48 (dans laquelle on a fait un sous-total pour un jour donné).
End If
Next feuille
cout_mois = somme 'ici on fait en sorte que notre fonction renvoie la somme calculée précédemment.
Application.ScreenUpdating = True
End Function |
La partie en rouge nous dit : si le nom de la feuille fini par 2020, alors je prends cette feuille pour faire le calcul.
1ère étape : avec variable
Le problème maintenant, c'est qu'il faudra que tu changes ton code tous les ans pour adapter l'année. Soit tu te souviens qu'il faut juste changer 2020 en 2021, puis 2022 etc. à cet endroit du code. Soit on fait en sorte de ne pas rentrer dans le code et on met une indication sur le fichier Excel. Le mieux c'est de mettre une case dans ta feuille "coût mensuel des tris" qui indique l'année. Par exemple en A6, tu notes l'année. Maintenant, il n'y a plus qu'à changer le 2020 du code par la valeur de la case A6. Et l'an prochain, tu noteras 2021 en A6.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| Function cout_mois(nomFichier As String, numMois As Range)
'nomFichier : variable de type texte qui est le nom du fichier dans lequel il y a les données (fichier avec 1 onglet/ mois)
'numMois : objet de type cellule qui est la cellule dans laquelle il y a le numéro correspondant au mois voulu
Application.ScreenUpdating = False 'application qui permet de figer l'écran pendant que la macro s'exécute (n'a aucun impacte sur la macro, c'est juste pour que ça tourne plus vite)
Dim fichier As Workbook 'objet correspondant au classeur avec les données (fichier avec 1 onglet/ mois)
Dim feuille As Worksheet ' objet correspondant à une feuille de classeur
Dim somme As Long 'variable de type nombre réel qui nous permettra de faire la somme des données voulues.
somme = 0 'pour l'instant on met la somme = 0
Set fichier = Workbooks(nomFichier & ".xlsx") 'on suppose que le fichier avec les données est déjà ouvert. Ici on attribut à l'objet "fichier" ce fameux fichier avec les données.
'Boucle pour aller chercher les sommes de chaque jour et faire le total
For Each feuille In fichier.Sheets 'Pour chaque feuille de l'ensemble des feuilles du fichier avec les données
If numMois.Value = feuille.Range("E50") Then 'on vérifier que dans cette feuille en E50, on a le numéro du mois qu'on veut
If Right(feuille.Name, 4) = Sheets("coût mensuel des tris").Range("A6").Value Then somme = somme + feuille.Range("E48").Value 'on vérifie que la feuille correspond bien à une feuille quotidienne, puis on ajoute à la somme la cellule E48 (dans laquelle on a fait un sous-total pour un jour donné).
End If
Next feuille
cout_mois = somme 'ici on fait en sorte que notre fonction renvoie la somme calculée précédemment.
Application.ScreenUpdating = True
End Function |
Petite remarque en aparté : tu n'as peut-être pas trop le choix du format des fichiers, mais si un jour tu dois construire une base de données comme cela, il est beaaaauuuucoouuup plus simple pour la manipulation et surtout l'analyse de construire une base de données sur un seul onglet avec en colonne les données dont tu as besoin et en ligne les occurrences. Avec ça pas besoin de VBA, un tableau croisé dynamique fait en 1 minute (j'exagère à peine) t'aurait donné le résultat que tu veux actuellement.
Dans ton cas par exemple, il aurait fallu un tableau comme cela (fait en 5 min montre en main
) :

https://silkyroad.developpez.com/excel/tcd/
Partager