Fonctions Personnalisées (avec Feuilles Variables)
Bonjour,
J'ai fait une fonction personnalisée, elle fait la somme des heures travaillées mentionnée sur un planning.
Elle me donne le résultat attendu que si j'apelle la fonction depuis la feuille où se trouvent les données. Ce qui veut dire qu'elle ne reconnait pas les feuilles. Elles ne seraient donc pas variables.
Dans le fichier joint, il y a une feuille "Synthèse", la fonction ne marche pas quand je l'utilise dans cette feuille alors qu'elle fonctionne quand je 'lutilise dans les feuilles où se trouvent les données, alors que je pense avoir mis la feuille en argument.
Pouvez-vous svp m'aider ?
Merci
Function Totales_Heures_ProductivesP(Feuille_Mois As Variant)
Application.Volatile
Dim Feuille As Worksheet
Set Feuille = Sheets(Feuille_Mois)
NbreDeJourMois = Feuille.Range("C1").Value
Colonne = NbreDeJourMois + 7
NbreTaches = 0
'MsgBox Feuille_Mois
For Ligne = Feuille.Range("E" & Rows.Count).End(xlUp).Row To 9 Step -1
'Pour faire la somme des heures mises en congés, en maladie ou en absence et l'enlever du total heure
Autres = Application.WorksheetFunction.CountIf(Feuille.Range(Cells(Ligne, 8), Cells(Ligne, Colonne)), "*Cong*") + _
Application.WorksheetFunction.CountIf(Feuille.Range(Cells(Ligne, 8), Cells(Ligne, Colonne)), "*Mal*") + _
Application.WorksheetFunction.CountIf(Feuille.Range(Cells(Ligne, 8), Cells(Ligne, Colonne)), "*Abs*")
NbreTaches = NbreTaches + (Application.WorksheetFunction.CountA(Feuille. _
Range(Cells(Ligne, 8), Cells(Ligne, Colonne))) - Autres) * Feuille.Range("C" & Ligne).Value
Next Ligne
Totales_Heures_ProductivesP = NbreTaches
End Function
Bonjour
Essaie en remplaçant :
Function Totales_Heures_ProductivesP(Feuille_Mois As Variant)
par :
Function Totales_Heures_ProductivesP(Feuille_Mois As String)
Ainsi que toutes les :
...(Cells(Ligne, 8)....
par :
...(Feuille.Cells(Ligne, 8)...
Bye !
Bonjour MarieG,
Il faut appliquer l'objet "Feuille" à chaque plage que ce soit Range ou Cells
Voici le code expliqué pour les autres
Function Totales_Heures_ProductivesP(Feuille_Mois As String)
Dim Feuille As Worksheet
Dim Ligne As Long
' Calculer automatiquement la fonction
Application.Volatile
' Définir la feuille à traiter
Set Feuille = Sheets(Feuille_Mois)
'
NbreDeJourMois = Feuille.Range("C1").Value
Colonne = NbreDeJourMois + 7
NbreTaches = 0
' Pour chaque ligne
For Ligne = Feuille.Range("E" & Rows.Count).End(xlUp).Row To 9 Step -1
' Comptabiliser le nombre d'absences
Autres = Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Cong*") + _
Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Mal*") + _
Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Abs*")
' Comptabiliser le nombre d'heure de producion
NbreTaches = NbreTaches + (Application.WorksheetFunction.CountA(Feuille. _
Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne))) - Autres) * Feuille.Range("C" & Ligne).Value
Next Ligne
' Retourner la valeur à la fonction
Totales_Heures_ProductivesP = NbreTaches
' Efface la variable objet pour libérer la mémoire
Set Feuille = Nothing
End Function
A+
Bonjour,
Pour résumer !
Ta fonction corrigée :
Function Totales_Heures_ProductivesP(Feuille_Mois$)
Dim NbreDeJourMois%, Colonne%, NbreTaches%, Autres%, Ligne% 'Comprenez : % = As integer
Application.Volatile
With Worksheets(Feuille_Mois)
NbreDeJourMois = .Range("C1")
Colonne = NbreDeJourMois + 7
NbreTaches = 0
For Ligne = 9 To .Range("E" & .Rows.Count).End(xlUp).Row
Autres = WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Cong*") + _
WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Mal*") + _
WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Abs*")
NbreTaches = NbreTaches + (WorksheetFunction.CountA(.Range(.Cells(Ligne, 8), _
.Cells(Ligne, Colonne))) - Autres) * .Range("C" & Ligne)
Next Ligne
End With
Totales_Heures_ProductivesP = NbreTaches
End Function
Nota : Des noms trop longs nuisent à la lisibilité donc à la compréhension de l'ensemble. Moi j'aurai écris ça :
Function TTHP(WsMois$)
Dim iC%, iTT%, iNP%, iR% 'Comprenez : % = As integer
Application.Volatile
With Worksheets(WsMois)
iC = .Range("C1") + 7
For iR = 9 To .Range("E" & .Rows.Count).End(xlUp).Row
iNP = WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Cong*") + _
WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Mal*") + _
WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Abs*")
iTT = iTT + (WorksheetFunction.CountA(.Range(.Cells(iR, 8), .Cells(iR, iC))) - iNP) * .Range("C" & iR)
Next iR
End With
TTHP = iTT
End Function
A+
Merci beaucoup à vous. C'est parfait.
J'ai essayé d'associer un if juste après le :For Ligne = 9 To .Range("E" & .Rows.Count).End(xlUp).Row dans le but de calculer le nombre d'heures pour un collaborateur, j'y arrive avec la proposition de BrunoM45 mais pas avec la vôtre :
Avez-vous svp une idée de pourquoi cela ne fonctionne pas.
Function Total_Heures_Productives_Collaborateur(FeuilleMois$, Collaborateur$)
Application.Volatile
Dim NbreDeJourMois%, Colonne%, Ligne% '% = As integer
Dim NbreTaches!, Autres! '! = As Single
'Calculer automatiquement la fonction
Application.Volatile
With Worksheets(Feuille_Mois)
NbreDeJourMois = .Range("C1")
Colonne = NbreDeJourMois + 7
NbreTaches = 0
' Pour chaque ligne
For Ligne = 9 To .Range("E" & .Rows.Count).End(xlUp).Row
If .Range(.Cells(Ligne, 5).Value) = Collaborateur Then
'ou If .Range("E"& Ligne).Value) = Collaborateur Then
' Comptabiliser le nombre d'absences
Autres = WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Cong*") + _
WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Mal*") + _
WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Abs*")
' Comptabiliser le nombre d'heure de producion
NbreTaches = NbreTaches + (WorksheetFunction.CountA(.Range(.Cells(Ligne, 8), _
.Cells(Ligne, Colonne))) - Autres) * .Range("C" & Ligne)
End If
Next Ligne
End With
' Retourner la valeur à la fonction
Total_Heures_Productives_Collaborateur = NbreTaches
End Function
Bonjour,
Pour résumer !
Ta fonction corrigée :
Function Totales_Heures_ProductivesP(Feuille_Mois$) Dim NbreDeJourMois%, Colonne%, NbreTaches%, Autres%, Ligne% 'Comprenez : % = As integer Application.Volatile With Worksheets(Feuille_Mois) NbreDeJourMois = .Range("C1") Colonne = NbreDeJourMois + 7 NbreTaches = 0 For Ligne = 9 To .Range("E" & .Rows.Count).End(xlUp).Row Autres = WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Cong*") + _ WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Mal*") + _ WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Abs*") NbreTaches = NbreTaches + (WorksheetFunction.CountA(.Range(.Cells(Ligne, 8), _ .Cells(Ligne, Colonne))) - Autres) * .Range("C" & Ligne) Next Ligne End With Totales_Heures_ProductivesP = NbreTaches End Function
Nota : Des noms trop longs nuisent à la lisibilité donc à la compréhension de l'ensemble. Moi j'aurai écris ça :
Function TTHP(WsMois$) Dim iC%, iTT%, iNP%, iR% 'Comprenez : % = As integer Application.Volatile With Worksheets(WsMois) iC = .Range("C1") + 7 For iR = 9 To .Range("E" & .Rows.Count).End(xlUp).Row iNP = WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Cong*") + _ WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Mal*") + _ WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Abs*") iTT = iTT + (WorksheetFunction.CountA(.Range(.Cells(iR, 8), .Cells(iR, iC))) - iNP) * .Range("C" & iR) Next iR End With TTHP = iTT End Function
A+
Merci beaucoup. C'est parfait.
Bonjour MarieG,
Il faut appliquer l'objet "Feuille" à chaque plage que ce soit Range ou Cells
Voici le code expliqué pour les autres
Function Totales_Heures_ProductivesP(Feuille_Mois As String) Dim Feuille As Worksheet Dim Ligne As Long ' Calculer automatiquement la fonction Application.Volatile ' Définir la feuille à traiter Set Feuille = Sheets(Feuille_Mois) ' NbreDeJourMois = Feuille.Range("C1").Value Colonne = NbreDeJourMois + 7 NbreTaches = 0 ' Pour chaque ligne For Ligne = Feuille.Range("E" & Rows.Count).End(xlUp).Row To 9 Step -1 ' Comptabiliser le nombre d'absences Autres = Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Cong*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Mal*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Abs*") ' Comptabiliser le nombre d'heure de producion NbreTaches = NbreTaches + (Application.WorksheetFunction.CountA(Feuille. _ Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne))) - Autres) * Feuille.Range("C" & Ligne).Value Next Ligne ' Retourner la valeur à la fonction Totales_Heures_ProductivesP = NbreTaches ' Efface la variable objet pour libérer la mémoire Set Feuille = Nothing End Function
A+
Je reviens vers pour solliciter vos compétences qui m'ont vraiment aimée à avancer.
Je voudrais savoir si c'est possible d'intégrer dans mon code les durée des tâches en lieu et place de les répérer sur excel .Range("C" & Ligne) avec une colonne cachée.
En résumé, je voudrais faire dans mon code la différence entre la fin de la tâche et le début de celle-ci.
Merci
Bonjour,
Pour résumer !
Ta fonction corrigée :
Function Totales_Heures_ProductivesP(Feuille_Mois$) Dim NbreDeJourMois%, Colonne%, NbreTaches%, Autres%, Ligne% 'Comprenez : % = As integer Application.Volatile With Worksheets(Feuille_Mois) NbreDeJourMois = .Range("C1") Colonne = NbreDeJourMois + 7 NbreTaches = 0 For Ligne = 9 To .Range("E" & .Rows.Count).End(xlUp).Row Autres = WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Cong*") + _ WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Mal*") + _ WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Abs*") NbreTaches = NbreTaches + (WorksheetFunction.CountA(.Range(.Cells(Ligne, 8), _ .Cells(Ligne, Colonne))) - Autres) * .Range("C" & Ligne) Next Ligne End With Totales_Heures_ProductivesP = NbreTaches End Function
Nota : Des noms trop longs nuisent à la lisibilité donc à la compréhension de l'ensemble. Moi j'aurai écris ça :
Function TTHP(WsMois$) Dim iC%, iTT%, iNP%, iR% 'Comprenez : % = As integer Application.Volatile With Worksheets(WsMois) iC = .Range("C1") + 7 For iR = 9 To .Range("E" & .Rows.Count).End(xlUp).Row iNP = WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Cong*") + _ WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Mal*") + _ WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Abs*") iTT = iTT + (WorksheetFunction.CountA(.Range(.Cells(iR, 8), .Cells(iR, iC))) - iNP) * .Range("C" & iR) Next iR End With TTHP = iTT End Function
A+
Je reviens vers pour solliciter vos compétences qui m'ont vraiment aimée à avancer.
Je voudrais savoir si c'est possible d'intégrer dans mon code les durée des tâches en lieu et place de les répérer sur excel .Range("C" & Ligne) avec une colonne cachée.
En résumé, je voudrais faire dans mon code la différence entre la fin de la tâche et le début de celle-ci.
Merci
Merci beaucoup. C'est parfait.
Bonjour MarieG,
Il faut appliquer l'objet "Feuille" à chaque plage que ce soit Range ou Cells
Voici le code expliqué pour les autres
Function Totales_Heures_ProductivesP(Feuille_Mois As String) Dim Feuille As Worksheet Dim Ligne As Long ' Calculer automatiquement la fonction Application.Volatile ' Définir la feuille à traiter Set Feuille = Sheets(Feuille_Mois) ' NbreDeJourMois = Feuille.Range("C1").Value Colonne = NbreDeJourMois + 7 NbreTaches = 0 ' Pour chaque ligne For Ligne = Feuille.Range("E" & Rows.Count).End(xlUp).Row To 9 Step -1 ' Comptabiliser le nombre d'absences Autres = Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Cong*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Mal*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Abs*") ' Comptabiliser le nombre d'heure de producion NbreTaches = NbreTaches + (Application.WorksheetFunction.CountA(Feuille. _ Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne))) - Autres) * Feuille.Range("C" & Ligne).Value Next Ligne ' Retourner la valeur à la fonction Totales_Heures_ProductivesP = NbreTaches ' Efface la variable objet pour libérer la mémoire Set Feuille = Nothing End Function
A+
Bonjour,
Je vous sollicite de nouveau si vous me le permettez.
Je suis confrontée à un problème en voulant utiliser la fonction personnalisée.
Aujourd’hui, la fonction a pour argument la feuille (1 mois = une feuille), au bout d’une année on aura donc 12 feuilles. Notons que dans le classeur, il y aura d’autres feuilles. Donc la boucle doit se faire que sur les feuilles avec comme nom un mois de l’année. Je pense à un tableau où on se stocke les douze mois. Mais je n’y arrive pas. Ou alors avoir autant d’arguments dans ma formule que j’ai de mois, cette deuxième option pose un problème comment faire pour rendre un argument optionnel.En effet, si je passe mes 12 mois en arguments, à fin août, je ne vais pas pouvoir renseigner le dernier trimestre.
Vous est-il possible d'adapter votre fonction pour qu'elle boucle sur les feuilles ayant comme nom 1 mois de l'année. POur distinguer ces feuilles, je suis assez souple, je suis donc ouvert à toute proposition.
Merci pour aide.
Bonjour MarieG,
Il faut appliquer l'objet "Feuille" à chaque plage que ce soit Range ou Cells
Voici le code expliqué pour les autres
Function Totales_Heures_ProductivesP(Feuille_Mois As String) Dim Feuille As Worksheet Dim Ligne As Long ' Calculer automatiquement la fonction Application.Volatile ' Définir la feuille à traiter Set Feuille = Sheets(Feuille_Mois) ' NbreDeJourMois = Feuille.Range("C1").Value Colonne = NbreDeJourMois + 7 NbreTaches = 0 ' Pour chaque ligne For Ligne = Feuille.Range("E" & Rows.Count).End(xlUp).Row To 9 Step -1 ' Comptabiliser le nombre d'absences Autres = Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Cong*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Mal*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne)), "*Abs*") ' Comptabiliser le nombre d'heure de producion NbreTaches = NbreTaches + (Application.WorksheetFunction.CountA(Feuille. _ Range(Feuille.Cells(Ligne, 8), Feuille.Cells(Ligne, Colonne))) - Autres) * Feuille.Range("C" & Ligne).Value Next Ligne ' Retourner la valeur à la fonction Totales_Heures_ProductivesP = NbreTaches ' Efface la variable objet pour libérer la mémoire Set Feuille = Nothing End Function
A+
Bonjour,
Je vous sollicite de nouveau si vous me le permettez.
Je suis confrontée à un problème en voulant utiliser la fonction personnalisée.
Aujourd’hui, la fonction a pour argument la feuille (1 mois = une feuille), au bout d’une année on aura donc 12 feuilles. Notons que dans le classeur, il y aura d’autres feuilles. Donc la boucle doit se faire que sur les feuilles avec comme nom un mois de l’année. Je pense à un tableau où on se stocke les douze mois. Mais je n’y arrive pas. Ou alors avoir autant d’arguments dans ma formule que j’ai de mois, cette deuxième option pose un problème comment faire pour rendre un argument optionnel.En effet, si je passe mes 12 mois en arguments, à fin août, je ne vais pas pouvoir renseigner le dernier trimestre.
Vous est-il possible d'adapter votre fonction pour qu'elle boucle sur les feuilles ayant comme nom 1 mois de l'année. POur distinguer ces feuilles, je suis assez souple, je suis donc ouvert à toute proposition.
Par ailleurs, je voudrais que la fonction me retourne 0 si je donne un mois en arguement qui n'existe pas dans mon classeur, j'ai donc récupérer cette fonction:
Function FeuilleExiste(NomFeuille) As Boolean
Dim Feuille As Object
On Error Resume Next
Set Feuille = Sheets(NomFeuille)
If Err = 0 Then FeuilleExiste = True
Set Feuille = Nothing
End Function
Merci pour aide.
J'ai essayé de l'insérer dans le code mais je n'ai aucun effet. Pouvez-vous svp m'aider ?
Je reviens vers pour solliciter vos compétences qui m'ont vraiment aimée à avancer.
Je voudrais savoir si c'est possible d'intégrer dans mon code les durée des tâches en lieu et place de les répérer sur excel .Range("C" & Ligne) avec une colonne cachée.
En résumé, je voudrais faire dans mon code la différence entre la fin de la tâche et le début de celle-ci.
Merci
Bonjour,
Pour résumer !
Ta fonction corrigée :
Function Totales_Heures_ProductivesP(Feuille_Mois$) Dim NbreDeJourMois%, Colonne%, NbreTaches%, Autres%, Ligne% 'Comprenez : % = As integer Application.Volatile With Worksheets(Feuille_Mois) NbreDeJourMois = .Range("C1") Colonne = NbreDeJourMois + 7 NbreTaches = 0 For Ligne = 9 To .Range("E" & .Rows.Count).End(xlUp).Row Autres = WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Cong*") + _ WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Mal*") + _ WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Abs*") NbreTaches = NbreTaches + (WorksheetFunction.CountA(.Range(.Cells(Ligne, 8), _ .Cells(Ligne, Colonne))) - Autres) * .Range("C" & Ligne) Next Ligne End With Totales_Heures_ProductivesP = NbreTaches End Function
Nota : Des noms trop longs nuisent à la lisibilité donc à la compréhension de l'ensemble. Moi j'aurai écris ça :
Function TTHP(WsMois$) Dim iC%, iTT%, iNP%, iR% 'Comprenez : % = As integer Application.Volatile With Worksheets(WsMois) iC = .Range("C1") + 7 For iR = 9 To .Range("E" & .Rows.Count).End(xlUp).Row iNP = WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Cong*") + _ WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Mal*") + _ WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Abs*") iTT = iTT + (WorksheetFunction.CountA(.Range(.Cells(iR, 8), .Cells(iR, iC))) - iNP) * .Range("C" & iR) Next iR End With TTHP = iTT End Function
A+
Par ailleurs, je voudrais que la formule me retourne 0 si je donne un mois en arguement qui n'existe pas dans mon classeur, j'ai donc récupérer cette fonction:
Function FeuilleExiste(NomFeuille) As Boolean
Dim Feuille As Object
On Error Resume Next
Set Feuille = Sheets(NomFeuille)
If Err = 0 Then FeuilleExiste = True
Set Feuille = Nothing
End Function
Merci pour aide.
J'ai essayé de l'insérer dans le code mais je n'ai aucun effet. Pouvez-vous svp m'aider ?
Je reviens vers pour solliciter vos compétences qui m'ont vraiment aimée à avancer.
Je voudrais savoir si c'est possible d'intégrer dans mon code les durée des tâches en lieu et place de les répérer sur excel .Range("C" & Ligne) avec une colonne cachée.
En résumé, je voudrais faire dans mon code la différence entre la fin de la tâche et le début de celle-ci.
Merci
Bonjour,
Pour résumer !
Ta fonction corrigée :
Function Totales_Heures_ProductivesP(Feuille_Mois$) Dim NbreDeJourMois%, Colonne%, NbreTaches%, Autres%, Ligne% 'Comprenez : % = As integer Application.Volatile With Worksheets(Feuille_Mois) NbreDeJourMois = .Range("C1") Colonne = NbreDeJourMois + 7 NbreTaches = 0 For Ligne = 9 To .Range("E" & .Rows.Count).End(xlUp).Row Autres = WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Cong*") + _ WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Mal*") + _ WorksheetFunction.CountIf(.Range(.Cells(Ligne, 8), .Cells(Ligne, Colonne)), "*Abs*") NbreTaches = NbreTaches + (WorksheetFunction.CountA(.Range(.Cells(Ligne, 8), _ .Cells(Ligne, Colonne))) - Autres) * .Range("C" & Ligne) Next Ligne End With Totales_Heures_ProductivesP = NbreTaches End Function
Nota : Des noms trop longs nuisent à la lisibilité donc à la compréhension de l'ensemble. Moi j'aurai écris ça :
Function TTHP(WsMois$) Dim iC%, iTT%, iNP%, iR% 'Comprenez : % = As integer Application.Volatile With Worksheets(WsMois) iC = .Range("C1") + 7 For iR = 9 To .Range("E" & .Rows.Count).End(xlUp).Row iNP = WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Cong*") + _ WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Mal*") + _ WorksheetFunction.CountIf(.Range(.Cells(iR, 8), .Cells(iR, iC)), "*Abs*") iTT = iTT + (WorksheetFunction.CountA(.Range(.Cells(iR, 8), .Cells(iR, iC))) - iNP) * .Range("C" & iR) Next iR End With TTHP = iTT End Function
A+
Bonjour MarieG
Je reviens vers pour solliciter vos compétences qui m'ont vraiment aimée à avancer.
Je voudrais savoir si c'est possible d'intégrer dans mon code les durée des tâches en lieu et place de les répérer sur excel .Range("C" & Ligne) avec une colonne cachée.
En résumé, je voudrais faire dans mon code la différence entre la fin de la tâche et le début de celle-ci.
Merci
Voici le code qui permet de ne plus utiliser la colonne C et qui te retourne 0 si la feuille n'existe pas
Function Totales_Heures_ProductivesP(Feuille_Mois As String)
Dim Feuille As Worksheet
Dim Ligne As Long
Dim DuréeTache As Double
Dim NbreTaches As Integer
Dim NbHeures As Double
Dim TotalHeures As Double
' Calculer automatiquement la fonction
Application.Volatile
' En cas d'erreur on continue
On Error Resume Next
' Définir la feuille à traiter
Set Feuille = Sheets(Feuille_Mois)
' Vérifier si erreur
If Err.Number <> 0 Then Err.Clear: Totales_Heures_ProductivesP = 0: Exit Function
' Sinon si OK
' Remettre la gestion normale des erreurs
On Error GoTo 0
' Récupérer le nombre de jour du mois en C1
NbreDeJourMois = Feuille.Range("C1").Value
Colonne = 7 + NbreDeJourMois
TotalHeures = 0
' Pour chaque ligne
For Ligne = 9 To Feuille.Range("E" & Rows.Count).End(xlUp).Row
' Initialiser les valeurs
NbreTaches = 0: DuréeTache = 0
' Comptabiliser le nombre d'absences
Autres = Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Cong*") + _
Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Mal*") + _
Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Abs*")
' Durée de la tâche en centième
DuréeTache = (Feuille.Range("G" & Ligne).Value - Feuille.Range("F" & Ligne).Value) * 24
' Comptabiliser le nombre de tâche de producion
NbreTaches = Application.WorksheetFunction.CountA(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne))) - Autres
' Calculer le nombre d'heures pour la ligne
NbHeures = NbreTaches * DuréeTache
' Totaliser le nombre d'heures
TotalHeures = TotalHeures + NbHeures
Next Ligne
' Retourner la valeur à la fonction
Totales_Heures_ProductivesP = TotalHeures
' Efface la variable objet pour libérer la mémoire
Set Feuille = Nothing
End Function
A+
Bonjour,
Merci d'éviter de citer les citations de citation de citations de réponses qui ne servent à rien mais rendent le fil incompréhensible.
Vous voulez répondre au fil appuyez sur le bouton Répondre en bas de page.
Vous voulez répondre à un interlocuteur en particulier : Nommez le !
Ce fil est décidément trop pourri je laisse tomber !
A+
Vous êtes génial. Merci Beaucoup.
Je vais me mettre de solliciter peut-être une dernière fois.
Bonjour MarieG
Je reviens vers pour solliciter vos compétences qui m'ont vraiment aimée à avancer.
Je voudrais savoir si c'est possible d'intégrer dans mon code les durée des tâches en lieu et place de les répérer sur excel .Range("C" & Ligne) avec une colonne cachée.
En résumé, je voudrais faire dans mon code la différence entre la fin de la tâche et le début de celle-ci.
Merci
Voici le code qui permet de ne plus utiliser la colonne C et qui te retourne 0 si la feuille n'existe pas
Function Totales_Heures_ProductivesP(Feuille_Mois As String) Dim Feuille As Worksheet Dim Ligne As Long Dim DuréeTache As Double Dim NbreTaches As Integer Dim NbHeures As Double Dim TotalHeures As Double ' Calculer automatiquement la fonction Application.Volatile ' En cas d'erreur on continue On Error Resume Next ' Définir la feuille à traiter Set Feuille = Sheets(Feuille_Mois) ' Vérifier si erreur If Err.Number <> 0 Then Err.Clear: Totales_Heures_ProductivesP = 0: Exit Function ' Sinon si OK ' Remettre la gestion normale des erreurs On Error GoTo 0 ' Récupérer le nombre de jour du mois en C1 NbreDeJourMois = Feuille.Range("C1").Value Colonne = 7 + NbreDeJourMois TotalHeures = 0 ' Pour chaque ligne For Ligne = 9 To Feuille.Range("E" & Rows.Count).End(xlUp).Row ' Initialiser les valeurs NbreTaches = 0: DuréeTache = 0 ' Comptabiliser le nombre d'absences Autres = Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Cong*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Mal*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Abs*") ' Durée de la tâche en centième DuréeTache = (Feuille.Range("G" & Ligne).Value - Feuille.Range("F" & Ligne).Value) * 24 ' Comptabiliser le nombre de tâche de producion NbreTaches = Application.WorksheetFunction.CountA(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne))) - Autres ' Calculer le nombre d'heures pour la ligne NbHeures = NbreTaches * DuréeTache ' Totaliser le nombre d'heures TotalHeures = TotalHeures + NbHeures Next Ligne ' Retourner la valeur à la fonction Totales_Heures_ProductivesP = TotalHeures ' Efface la variable objet pour libérer la mémoire Set Feuille = Nothing End Function
A+
Bonjour,
Je suis désolée que vous réagissez comme cela. Je ne voulais pas créer un autre fil. Et je voulais être sûr que toutes les personnes sur ce fil soient alertés. J'ai eu tort .désolé.
Bonjour,
Merci d'éviter de citer les citations de citation de citations de réponses qui ne servent à rien mais rendent le fil incompréhensible.
Vous voulez répondre au fil appuyez sur le bouton Répondre en bas de page.
Vous voulez répondre à un interlocuteur en particulier : Nommez le !
Ce fil est décidément trop pourri je laisse tomber !
A+
Pour ma part, je ne pense pas que tu es eu tort MarieG
Tu as fait ce que bon te semblait
Je pense juste qu'à l'approche des congés certains en ont plus besoin que d'autres
Allons ! Allons !
Ne nous fachons pas !
La vie est belle !
Profitons-en !
et ...Vive le forum !
Bye !
Bonjour BrunoM45,
J'ai remarqué qu'avec cette nouvelle, les cellules ont du mal à se mettre à jour. J'ai essayé de mettre en commentaire la gestion d'erreur (test si la feuille existe ou pas) et j'ai toujours un problème de rafraischissement.
Avez-vous une idée une idée de la provenance de ce problème de recalcul ? Une solution ?
MarieG
Merci
Vous êtes génial. Merci Beaucoup.
Je vais me mettre de solliciter peut-être une dernière fois.
Bonjour MarieG
Je reviens vers pour solliciter vos compétences qui m'ont vraiment aimée à avancer.
Je voudrais savoir si c'est possible d'intégrer dans mon code les durée des tâches en lieu et place de les répérer sur excel .Range("C" & Ligne) avec une colonne cachée.
En résumé, je voudrais faire dans mon code la différence entre la fin de la tâche et le début de celle-ci.
Merci
Voici le code qui permet de ne plus utiliser la colonne C et qui te retourne 0 si la feuille n'existe pas
Function Totales_Heures_ProductivesP(Feuille_Mois As String) Dim Feuille As Worksheet Dim Ligne As Long Dim DuréeTache As Double Dim NbreTaches As Integer Dim NbHeures As Double Dim TotalHeures As Double ' Calculer automatiquement la fonction Application.Volatile ' En cas d'erreur on continue On Error Resume Next ' Définir la feuille à traiter Set Feuille = Sheets(Feuille_Mois) ' Vérifier si erreur If Err.Number <> 0 Then Err.Clear: Totales_Heures_ProductivesP = 0: Exit Function ' Sinon si OK ' Remettre la gestion normale des erreurs On Error GoTo 0 ' Récupérer le nombre de jour du mois en C1 NbreDeJourMois = Feuille.Range("C1").Value Colonne = 7 + NbreDeJourMois TotalHeures = 0 ' Pour chaque ligne For Ligne = 9 To Feuille.Range("E" & Rows.Count).End(xlUp).Row ' Initialiser les valeurs NbreTaches = 0: DuréeTache = 0 ' Comptabiliser le nombre d'absences Autres = Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Cong*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Mal*") + _ Application.WorksheetFunction.CountIf(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne)), "*Abs*") ' Durée de la tâche en centième DuréeTache = (Feuille.Range("G" & Ligne).Value - Feuille.Range("F" & Ligne).Value) * 24 ' Comptabiliser le nombre de tâche de producion NbreTaches = Application.WorksheetFunction.CountA(Feuille.Range(Feuille.Range("H" & Ligne), Feuille.Cells(Ligne, Colonne))) - Autres ' Calculer le nombre d'heures pour la ligne NbHeures = NbreTaches * DuréeTache ' Totaliser le nombre d'heures TotalHeures = TotalHeures + NbHeures Next Ligne ' Retourner la valeur à la fonction Totales_Heures_ProductivesP = TotalHeures ' Efface la variable objet pour libérer la mémoire Set Feuille = Nothing End Function
A+