Série de fonction calculs avec Application.volatile; c'est t

Bonjour

J'ai créé une série de fonctions. Mais ça ralentit terriblement mon système. Dans la cellule de calcul je fais HTS_Lun+HTS_Mar+HTS_Mer+HTS_Jeu+HTS_Ven pour calculer les heures cumulées de la semaine

Puis-je simplifier, ne faire qu'une fonction pour les 5 ?

"ZoneFerm" est la liste des fériés et fermetures, DateDéb et DateFin sont les dates de début et fin des activités.

Désolé, je n'arrive pas à joindre mon fichier trop lourd, j'ai mis les codes en-dessous.

Merci de votre aide.

Bert69

Option Explicit

Function HTS_Lun(DateDéb As Date, DateFin As Date, Datejour1 As Date) As Integer

'Calcule les HTS par lundi inclus dans l'offre, si pas férié ou fermé

Application.Volatile

If Application.CountIf(Range("ZoneFerm"), Datejour1) = 0 Then

If Datejour1 >= DateDéb And Datejour1 <= DateFin Then

HTS_Lun = 7

Else: HTS_Lun = 0

End If

End If

End Function

Function HTS_Mar(DateDéb As Date, DateFin As Date, Datejour2 As Date) As Integer

'Calcule les HTS par mardi inclus dans l'offre, si pas férié ou fermé

Application.Volatile

If Application.CountIf(Range("ZoneFerm"), Datejour2) = 0 Then

If Datejour2 >= DateDéb And Datejour2 <= DateFin Then

HTS_Mar = 8

Else: HTS_Mar = 0

End If

End If

End Function

Function HTS_Mer(DateDéb As Date, DateFin As Date, Datejour3 As Date) As Integer

'Calcule les HTS par mercredi inclus dans l'offre, si pas férié ou fermé

Application.Volatile

If Application.CountIf(Range("ZoneFerm"), Datejour3) = 0 Then

If Datejour3 >= DateDéb And Datejour3 <= DateFin Then

HTS_Mer = 8

Else: HTS_Mer = 0

End If

End If

End Function

Function HTS_Jeu(DateDéb As Date, DateFin As Date, Datejour4 As Date) As Integer

'Calcule les HTS par jeudi inclus dans l'offre, si pas férié ou fermé

Application.Volatile

If Application.CountIf(Range("ZoneFerm"), Datejour4) = 0 Then

If Datejour4 >= DateDéb And Datejour4 <= DateFin Then

HTS_Jeu = 8

Else: HTS_Jeu = 0

End If

End If

End Function

Function HTS_Ven(DateDéb As Date, DateFin As Date, Datejour5 As Date) As Integer

'Calcule les HTS par jeudi inclus dans l'offre, si pas férié ou fermé

Application.Volatile

If Application.CountIf(Range("ZoneFerm"), Datejour5) = 0 Then

If Datejour5 >= DateDéb And Datejour5 <= DateFin Then

HTS_Ven = 4

Else: HTS_Ven = 0

End If

End If

End Function

Bonjour

Il existe des formules qui font cela très bien.

Cette manie de tout vouloir faire en VBA, surtout que dans ton cas, tu es quand même obligé d'entrer une formule.

Si tu es intéressé, mets un exemple sur une feuille Excel et sur la même présentation que ton fichier

Cordialement

Bonjour

Merci pour ta réponse. Je te joins le fichier que j'ai élagué au max.

Bien à toi

Bonjour

Avec un fichier vierge et sans un minimum d'explications?

Ajoute-en un peu..et donne un exemple avec le résultat attendu

Cordialement

Bonjour

Le principe de calcul est le suivant:

  • Chaque offre sur la feuille "PLAN" est déterminée entre autre par une date de début et une date de fin.
  • Chaque offre donne lieu, entre sa date de début et sa date de fin, à la réalisation d'heures travaillées (HTS). Ce sont ces HTS que mon code VBA calcule, pour chaque semaine par addition des HTS par jour, dans la feuille "HTS_Offres".

Chaque jour a une durée qui lui est propre:

  • Lundi : 7 HTS
  • Mardi à jeudi : 8 HTS
  • vendredi 4 HTS

Ainsi, la première offre du 5 au 7 janvier 2015 fait-elle 23 HTS cette semaine-là : Lundi 7 HTS, Mardi et mercredi 2 X 8 HTS.

Bonne journée

Deux fois le même sujet !!!!

Bonjour Amadeus

Et je découvre qu'Amadeus t'a déjà conseillé d'abandonner tes fonctions personnalisées ...

J'espère que tu considères ce sujet comme clos ...

Bonjour,

Et pourquoi tu les as faites volatiles ??? A chaque saisie tu les recalcules toutes !

On ne le fait uniquement que si c'est nécessaire.

Essaie en ajoutant zoneFerme en paramètre et enlève .volatile

Function HTS_Lun(DateDéb As Date, DateFin As Date, Datejour1 As Date, zoneFerm As Range) As Integer
    'Calcule les HTS par lundi inclus dans l'offre, si pas férié ou fermé
    If Application.CountIf(zoneFerm, Datejour1) = 0 Then
        If Datejour1 >= DateDéb And Datejour1 <= DateFin Then
            HTS_Lun = 7
        Else
            HTS_Lun = 0
        End If
    End If
End Function

=HTS_Lun(PLAN!$E13;PLAN!$F13;B$4;ZoneFerm)+...

A mon avis mettre tes 5 countif dans 1 fonction au lieu d'un countif dans 5 fonctions ne changera pas grand chose à moins d'avoir des centaines de cellules concernées.

eric

Merci Eriic

Tu as raison, c'est le principe même de la propriété "volatile" que de recalculer, si j'ai bien compris. Donc, en effet, c'est plus léger sans. Que n'y ai-je pensé ?

Je te remercie de ton aide.

Bien à toi.

Rechercher des sujets similaires à "serie fonction calculs application volatile"