Problème d'utilisation d'une fonction

MERLIN

XLDnaute Junior
Bonsoir !!

Je travaille sur les durées de travail notamment avec mise en évidence des postes avec heures de nuit.
J'ai un petit souci avec la fonction [HNUIT].

Lorsque je l'utilise dans l'analyse de chacune des cellules j'ai un message d'erreur. Du coup, je suis obligé de passer par une étape transitoire.

Ici, par exemple, avec la macro "BOUCLE" pour le poste SE1-1800-0200-C07 que je casse en 18h00 en colonne 3 (heure de début) et en 02h00 en colonne 4 (heure de fin) je calcule les heures de nuit effectuées entre 21h00 et 06h00 en colonne 5. Si ce nombre est égal ou supérieure à 3 heures je prends le total du poste effectuée c'est-à-dire heure de fin moins heure de début soit 8 heures.

Je souhaiterais avoir directement le total de ces heures de nuit sans passer par l'étape des colonnes 3 et 4.

D'avance un grand merci.

Code :

Function HNUIT(DVac As Range, FVac As Range, Optional nd As Date = 7 / 8, Optional nf As Date = 1 / 4)

hd = DVac.Value
hf = FVac.Value

If hf > hd Then
Select Case hd
Case Is < nf: A = nf - hd
Case Is > nd: A = nd - hd
End Select
Select Case hf
Case Is < nf: A = hf - hd
Case Is > nd: A = A + hf - nd
End Select
ElseIf hf < hd Then
Select Case hd
Case Is < nd: A = 1 / 6
Case Is >= nd: A = 1 - hd
End Select
If hf > nf Then A = A - (hf - nf)
If hd < nf Then A = A + (nf - hd)
A = hf + A
Else
End If
HNUIT = A
End Function

Sub BOUCLE()

Dim heure_debut, heure_fin
Dim i, u As Integer

u = 2

For i = ActiveCell.Row To ActiveCell.End(xlDown).Row

If Len(Cells(i, u)) = 17 Then
heure_debut = CDate(Left(Mid(Cells(i, u), 5, 4), 2) & ":" & Right(Mid(Cells(i, u), 5, 4), 2))
heure_fin = CDate(Left(Mid(Cells(i, u), 10, 4), 2) & ":" & Right(Mid(Cells(i, u), 10, 4), 2))

Cells(i, u).Offset(0, 1) = heure_debut
Cells(i, u).Offset(0, 2) = heure_fin
'ici
Cells(i, u).Offset(0, 3) = HNUIT(Cells(i, u).Offset(0, 1), Cells(i, u).Offset(0, 2))

If heure_fin < heure_debut Then heure_fin = heure_fin + 1

If Cells(i, u).Offset(0, 3) >= 0.125 Then Cells(i, u).Offset(0, 4) = heure_fin - heure_debut

End If

Next i

End Sub
 

Pièces jointes

  • Calcul_poste_nuit.xlsm
    27 KB · Affichages: 42

Modeste

XLDnaute Barbatruc
Re : Problème d'utilisation d'une fonction

Bonsoir MERLIN,

Pas certain que tes explications soient vraiment en lien avec l'exemple que tu as déposé :confused:

Pour tenter de comprendre, j'ai essayé la fonction en G2, sous la forme =HNUIT(LC(-4);LC(-3)) ... et le résultat m'a semblé cohérent !?

Pourrais-tu repréciser le problème, avec des exemples concrets (illustrés dans le fichier, si possible :))
 

ROGER2327

XLDnaute Barbatruc
Re : Problème d'utilisation d'une fonction

Bonjour à tous.


Pas sûr d'avoir compris...
Un essai pifométrique tout de même.​


Bonne journée.


ℝOGER2327
#7739


Dimanche 15 Gueules 142 (Alice au Pays des Merveilles - fête Suprême Tierce)
21 Pluviôse An CCXXIII, 1,4382h - thlaspi
2015-W07-1T03:27:06Z
 

Pièces jointes

  • Calcul_poste_nuit-1.xlsm
    31.5 KB · Affichages: 35

job75

XLDnaute Barbatruc
Re : Problème d'utilisation d'une fonction

Bonjour MERLIN, Modeste, Roger,

Le calcul des heures de nuit (ou de jour) se fait sans difficulté majeure par formules, voir le fichier joint.

Il faut d'abord définir les noms deb et fin.

Ensuite entrer en C2 :

Code:
=SI(deb<=fin;(fin-deb-MAX(MIN(fin;21/24)-MAX(deb;6/24);));(1-deb-MAX(21/24-MAX(deb;6/24);))+(fin-MAX(MIN(fin;21/24)-6/24;)))
Et pour le total en D2 :

Code:
=SI(C2<3/24;"";fin+(deb>fin)-deb)
A+
 

Pièces jointes

  • Calcul_poste_nuit(1).xls
    53.5 KB · Affichages: 34

job75

XLDnaute Barbatruc
Re : Problème d'utilisation d'une fonction

Re,

Une manière plus simple de définir les noms deb et fin avec la fonction REMPLACER.

En l'occurence elle effectue l'insertion de ":".

Fichier (2).

A+
 

Pièces jointes

  • Calcul_poste_nuit(2).xls
    53 KB · Affichages: 33

MERLIN

XLDnaute Junior
Re : Problème d'utilisation d'une fonction

Bonsoir à tous !
Merci avant d'avoir consacré un peu de votre temps.
En l'état actuel, mon fichier fonctionne mais je ne souhaite pas passer par des intermédaires colonne 3 et 4 et surtout pas par des formules excel.

En fait,

J'ai le message d'erreur "Erreur de compilation : Type d'argument ByRef incompatible" si je fais comme cela :

Sub BOUCLE()

Dim heure_debut, heure_fin
Dim i, u As Integer

u = 2

For i = ActiveCell.Row To ActiveCell.End(xlDown).Row

If Len(Cells(i, u)) = 17 Then
heure_debut = CDate(Left(Mid(Cells(i, u), 5, 4), 2) & ":" & Right(Mid(Cells(i, u), 5, 4), 2))
heure_fin = CDate(Left(Mid(Cells(i, u), 10, 4), 2) & ":" & Right(Mid(Cells(i, u), 10, 4), 2))

Cells(i, u).Offset(0, 3) = HNUIT(heure_debut, heure_fin)

If heure_fin < heure_debut Then heure_fin = heure_fin + 1

If Cells(i, u).Offset(0, 3) >= 0.125 Then Cells(i, u).Offset(0, 4) = heure_fin - heure_debut

End If

Next i

End Sub

Merci ;) et bonne nuité !!
MERLIN
 

Modeste

XLDnaute Barbatruc
Re : Problème d'utilisation d'une fonction

Bonjour ROGER :)
Salut job :)

Des fois, j'ai l'impression d'être transparent.​
Visible vous êtes, très cher ... (peut-être cette pilosité couleur barbe-à-papa, sur teint olivâtre qui en effraie certains ;))

Ta proposition m'a même permis de comprendre ce que Merlin attendait. Pour pifométrique qu'il fût, l'essai m'avait semblé transformé.
 

MERLIN

XLDnaute Junior
Re : Problème d'utilisation d'une fonction

... bonjour à tous,

C'est pas que je n'aime pas les formules Excel c'est que je ne veux pas en mettre dans le fichier final ;)
Le VBA est beaucoup plus transparent... pas toi Roger ^^.

Mais merci d'avoir pris le temps de m'aider.

Bonne journée !
 

job75

XLDnaute Barbatruc
Re : Problème d'utilisation d'une fonction

Bonjour MERLIN, Modeste, Roger, le forum,

Le VBA est beaucoup plus transparent...

C'est un point de vue, alors voici mes formules précédentes utilisées en VBA :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address <> "$B$1" Then Exit Sub
Dim h&
Cancel = True
With ThisWorkbook
  .Names.Add "a", "=" & Target.Address(0, 1)
  .Names.Add "deb", "=--REPLACE(MID(a,FIND(""-"",a)+1,4),3,,"":"")"
  .Names.Add "fin", "=--REPLACE(MID(a,FIND(""-"",a)+6,4),3,,"":"")"
  h = Cells(Rows.Count, Target.Column).End(xlUp).Row - Target.Row
  If h < 1 Then Exit Sub
  With Target(2).Offset(, 1).Resize(h)
    .Formula = "=IF(deb<=fin,(fin-deb-MAX(MIN(fin,21/24)-MAX(deb,6/24),)),(1-deb-MAX(21/24-MAX(deb,6/24),))+(fin-MAX(MIN(fin,21/24)-6/24,)))"
    .Offset(, 1) = "=IF(RC[-1]<3/24,"""",fin+(deb>fin)-deb)"
    .Resize(, 2) = .Resize(, 2).Value 'supprime les formules
  End With
  .Names("a").Delete: .Names("deb").Delete: .Names("fin").Delete
End With
End Sub
Fichier joint.

A+
 

Pièces jointes

  • Calcul_poste_nuit par VBA(1).xls
    55.5 KB · Affichages: 29

ROGER2327

XLDnaute Barbatruc
Re : Problème d'utilisation d'une fonction

Re...


... bonjour à tous,

C'est pas que je n'aime pas les formules Excel c'est que je ne veux pas en mettre dans le fichier final ;)
Le VBA est beaucoup plus transparent... pas toi Roger ^^.

Mais merci d'avoir pris le temps de m'aider.

Bonne journée !

Ah ! ah ! ah !

Où qui n'y a des formules Excel dans la pièce jointe, s'il vous plait ? (Extrait de la pièce jointe du message #3.)

ROFLMAOGCB "Rolling On Floor Laughing My Ass Off Getting Carpet Burns"
 

Pièces jointes

  • Classeur.xlsm
    21.1 KB · Affichages: 38
  • Classeur.xlsm
    21.1 KB · Affichages: 50
  • Classeur.xlsm
    21.1 KB · Affichages: 43

job75

XLDnaute Barbatruc
Re : Problème d'utilisation d'une fonction

Re,

Il est toujours intéressant de comparer les durées d'exécution des solutions proposées.

Le fichier joint permet de comparer ma macro du post #10 et la macro BOUCLE de Roger.

J'ai quand même ajouté 2 tableaux VBA dans la macro BOUCLE pour la rendre plus rapide...

Avec cette modif c'est la solution la plus performante.

A+
 

Pièces jointes

  • Calcul_poste_nuit par VBA(2).xls
    422 KB · Affichages: 35
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 248
Messages
2 086 593
Membres
103 248
dernier inscrit
Happycat