Problème d'utilisation d'une fonction

  • Initiateur de la discussion Initiateur de la discussion MERLIN
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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é 😕

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 🙂)
 
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

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

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
 
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é.
 
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 !
 
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

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

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

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
5
Affichages
241
  • Question Question
Microsoft 365 Probléme VBA
Réponses
8
Affichages
318
  • Question Question
Microsoft 365 worksheet_change
Réponses
29
Affichages
481
Réponses
4
Affichages
179
Retour