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

14exemple.xlsm (513.40 Ko)

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 à vous, C'est impeccable.

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 !

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+

Surtout n'hésite pas à laisser tomber Galopin01

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+

Rechercher des sujets similaires à "fonctions personnalisees feuilles variables"