calculer taux dispo

calculer taux dispo - VB/VBA/VBS - Programmation

Marsh Posté le 05-01-2012 à 11:02:39    

Bonjour à tous et toutes ,  
 
 
Donc je suis en train d'essayer de terminer mon jolie programme mais je suis vraiment coincé sur le dernier code à effectuer donc je m'explique
 
il faut que je calcule le taux de diponibilité du parc ,
le nombre de machines sera donc une saisie écran,l'utilisateur donnera donc un nombre de machines  
 
 
les contraintes sont aussi qu'une journée fait 10 heures :de 8heures à 18heures
Les week ends et jours féries ne sont pas compté également.
 
*Taux de disponibilité du parc 98%  
les pénalités associés sont entre 97 et 97.99% 2000€
entre 96 et 96.99% 4250€
entre 0 et 95.99% 6890€
 
 
*Plafond pénalités annuelles 21000€
 
 
le code associé :
 
 
 

Code :
  1. Public colDateEnv, colDateClot, objJferies, ForWriting, nbmachines
  2. Sub calculPE()
  3. Const ForReading = 1, ForWriting = 2, ForAppending = 8
  4.              nbmachines = Application.InputBox(" Combien de machines a saisir", Type:=1)
  5. colDateEnv = 16
  6. colDateClot = 18
  7. Set objJferies = CreateObject("Scripting.Dictionary" )
  8. objJferies.CompareMode = vbTextCompare
  9. 'On ouvre le classeur
  10. Dim monClasseur As Workbook
  11. Set monClasseur = ActiveWorkbook
  12. monClasseur.Worksheets("JFériésExcep" ).Activate
  13. ' On lit la feuille des jours fériés
  14. For ligne = 2 To ActiveSheet.UsedRange.Rows.Count
  15.   objJferies.Add Cells(ligne, 1).Value, True
  16. Next
  17. 'on ouvre la feuille
  18. Dim maFeuille As Worksheet
  19. Set maFeuille = monClasseur.Worksheets("etat" )
  20. 'on active la feuille
  21. monClasseur.Worksheets("etat" ).Activate
  22. 'appel la fonction HeuresT
  23. Call HeuresT
  24. End Sub
  25. Function Work_Days(BegDate As Date, EndDate As Date, _
  26.                    Optional bAvecJFerie As Boolean = True) As Variant
  27.     Dim dt As Date
  28. On Error GoTo Work_Days_Error
  29.     If IsNull(BegDate) Or IsNull(EndDate) Then err.Raise vbObjectError + 1
  30.     If Not IsDate(BegDate) Or Not IsDate(EndDate) Then err.Raise vbObjectError + 2
  31.     If BegDate > EndDate Then err.Raise vbObjectError + 3
  32.     dt = BegDate
  33.     Work_Days = 0
  34.     While dt <= EndDate
  35.         If DatePart("w", dt, vbMonday) < 6 And Not objJferies.exists(dt) Then
  36.             Work_Days = Work_Days + 1
  37.         End If
  38.         dt = DateAdd("d", 1, dt)
  39.     Wend
  40.     Exit Function
  41. Work_Days_Error:
  42.     Select Case err.Number
  43.         Case vbObjectError + 1: Work_Days = "Les 2 dates sont obligatoires."
  44.         Case vbObjectError + 2: Work_Days = "Format de date incorrect."
  45.         Case vbObjectError + 3: Work_Days = "La date de fin doit être postérieure à la date de début."
  46.         Case Else: Work_Days = err.Description
  47.     End Select
  48. End Function
  49. Public Function HeuresT()
  50.     'les variables
  51.     Dim nbJoursComplets As Long
  52.     Dim nbHeuresAvant As Double
  53.     Dim nbHeuresApres As Double
  54.     Dim nbHeuresTotal As Double
  55.     Dim nbJours As Integer
  56.     Dim heuresRestantes As Double
  57.     Dim minutesRestantes As Integer
  58.     Dim leMois As String
  59.     'ici il faut saisir un mois entre 1 et 12 ce qui correspond de janvier à Decembre
  60.     leMois = Application.InputBox("Quel est le mois pour lequel vous souhaitez calculer les pénalités? (MM/AAAA)" )
  61.     If leMois = "" Or Len(leMois) <> 7 Then
  62.       Exit Function
  63.     End If
  64.     'le compteur va servir à compter le nombre d'interventions d'un mois donné
  65.     Dim compteur As Byte
  66.     compteur = 0
  67.     Dim PenaliteDeCeDossier As Long
  68.     PenaliteDeCeDossier = 0
  69.     Dim JoursSupplementaires As Long
  70.     JoursSupplementaires = 0
  71.     Dim SommePenaliteDuMois As Long
  72.     SommePenaliteDuMois = 0
  73.     StrPenalite = "Réparation" & vbTab & "Date d'envoi" & vbTab & vbTab & "Date clôture" & vbTab & vbTab & "Temps écoulé" & vbTab & vbTab & vbTab & "Pénalité (euros)"
  74.     'ici j'indique en dur qu'il y a uniquement les 10 lignes dans le fichier (A modifier)
  75.     For ligne = 2 To ActiveSheet.UsedRange.Rows.Count
  76.     ' on recupere le mois de la date indiquée dans la cellule
  77.         x = Right("0" & Month(Cells(ligne, colDateClot).Value), 2)
  78.         x = x & "/" & Year(Cells(ligne, colDateClot).Value)
  79.         If x = leMois Then
  80.                 'ici reste a verifier si la date est dans la liste des feries exceptionnels.
  81.                 'si c'est le cas ,on ne prend pas en compte cette date sinon,on peut continuer le calcul
  82.                 'condition qui servira a recuperer les cellules dont le mois correspond a celui dont on souhaite
  83.                 'y calculer ses pénalités
  84.             'servira pour le nombre d'intervention
  85.             compteur = compteur + 1
  86.             'Le nombre de jours ouvrés total entre date1 à minuit "du soir" et date2 à minuit "du matin" !
  87.             nbJoursComplets = Work_Days(DateValue(Cells(ligne, colDateEnv).Value), DateValue(Cells(ligne, colDateClot).Value), True) - 2
  88.            'Le nombre d'heures travaillées entre date1 et date1 à 18h
  89.            nbHeuresAvant = 0
  90.            If Hour(Cells(ligne, colDateEnv).Value) < 18 Then
  91.                If Hour(Cells(ligne, colDateEnv).Value) < 8 Then
  92.                    nbHeuresAvant = 10
  93.                Else
  94.                    nbHeuresAvant = 18 - (Hour(Cells(ligne, colDateEnv).Value) + Minute(Cells(ligne, colDateEnv).Value) / 60)
  95.                End If
  96.            End If
  97.            'Le nombre d'heures travaillées entre date2 à 8h et date2
  98.            If Hour(Cells(ligne, colDateClot).Value) >= 8 Then
  99.                 If Hour(Cells(ligne, colDateClot).Value) >= 18 Then
  100.                     nbHeuresApres = 10
  101.                 Else
  102.                     nbHeuresApres = Hour(Cells(ligne, colDateClot).Value) + Minute(Cells(ligne, colDateClot).Value) / 60 - 8
  103.                 End If
  104.             End If
  105.             nbHeuresTotal = 10 * nbJoursComplets + nbHeuresAvant + nbHeuresApres
  106.             'ici on recupere la partie entiere de nbHeuresTotal pour indiqué en nombre de jours
  107.             nbJours = Int(nbHeuresTotal / 10)
  108.             nbj = nbHeuresTotal / 10
  109.             heuresRestantes = nbHeuresTotal - nbJours * 10
  110.             minutesRestantes = (heuresRestantes - Int(heuresRestantes)) * 60
  111.             HeuresT = nbJours & " jours, " & Int(heuresRestantes) & " heures et " & minutesRestantes & " minutes"
  112.             PenaliteDeCeDossier = 0
  113.                    '  Indisponibilité > = à 1jours ou 10heures = 10€
  114.                     If nbJours = 1 Then
  115.                         PenaliteDeCeDossier = 10
  116.                     ' Indisponibilité entre 1 et 2 jours => 10€ +18 € = 28€
  117.                     ElseIf nbJours = 2 Then
  118.                         PenaliteDeCeDossier = 10 + 18
  119.                     ' Indisponibilité entre 2  et  3jours => 10€ +18€ + 25€  =53€
  120.                     ElseIf nbJours = 3 Then
  121.                         PenaliteDeCeDossier = 10 + 18 + 25
  122.                     ' Indisponibilité supérieur à 3jours  => 53€ + 25€/jour supplémentaire
  123.                     ElseIf nbJours >= 4 Then
  124.                         JoursSupplementaires = nbJours - 3 ' pour avoir le nombre de jours supplementaires
  125.                         PenaliteDeCeDossier = 10 + 18 + 25 + 25 * JoursSupplementaires
  126.                     End If
  127.             If PenaliteDeCeDossier <> 0 Then
  128.                 StrPenalite = StrPenalite & vbCrLf & Cells(ligne, 1).Value & vbTab & Cells(ligne, colDateEnv).Value & _
  129.                             vbTab & Cells(ligne, colDateEnv).Value & vbTab & HeuresT & vbTab & _
  130.                             Right("        " & PenaliteDeCeDossier, 7)
  131.             End If
  132.             PenaliteMois = PenaliteMois + PenaliteDeCeDossier
  133.         End If
  134. End If
  135.     Next
  136.              'VOICI LA PARTIE OU JE TENTE DE CALCULER LE TAUX DE DISPONIBILTE
  137.             'Pour le calcul taux de disponibilités
  138.              If (DateDiff("n", Cells(ligne, colDateClot).Value, "01/" & leMois) Or DateDiff("n", Cells(ligne, colDateEnv).Value, "31/" & leMois)) Then
  139.             MsgBox "rien du tout"
  140.             Else
  141.            date1 = Max(Cells(ligne, colDateEnv).Value, "01/" & leMois)
  142.            date2 = Min(Cells(ligne, colDateClot).Value, "31/" & leMois)
  143.                 'pour avoir le taux de disponibilités.
  144.                 x = nbjoursOuvre * nbmachines / 10
  145.               ' Taux de disponibilité du parc 98%
  146.                If tauxDisponibilteParc >= 98 Then
  147.                MsgBox "RIEN"
  148.                e
  149.                 ' entre 97 et 97.99% 1500€
  150.                ElseIf tauxDisponibilteParc >= 97 And tauxDisponibilteParc < 98 Then
  151.                MsgBox " cela coute 1500"
  152.                ' entre 96 et 96.99% 3000€
  153.                ElseIf tauxDisponibilteParc >= 96 And tauxDisponibilteParc < 97 Then
  154.                MsgBox "cela coute 3000 euros "
  155.                ElseIf tauxDisponibilteParc >= 0 And tauxDisponibilteParc < 96 Then
  156.                MsgBox "cela coute   4500€ "
  157.                End If
  158.     If compteur = 0 Then
  159.        MsgBox "Bizarre!: aucun dossier trouvé pour la date de clôture choisie: " & leMois
  160.     End If
  161.     StrPenalite = StrPenalite & vbCrLf & vbCrLf & "Pénalité totale pour " & compteur & " dossiers: " & PenaliteMois & " euros"
  162.     MsgBox StrPenalite
  163.     ForWriting = 2
  164.     'Pour creer le fichier texte
  165.     Set FSys = CreateObject("Scripting.FileSystemObject" )
  166.     Set MonFic = FSys.OpenTextFile("C:\Users\US12\Desktop\fichier.txt", ForWriting, True)
  167.     MonFic.WriteLine StrPenalite
  168.     MonFic.Close
  169.     End Function

Reply

Marsh Posté le 05-01-2012 à 11:02:39   

Reply

Marsh Posté le 08-01-2012 à 14:43:43    

Si tu veux une réponse:

  • explique ton problème correctement. J'ai à peu près compris ce que tu voulais faire, mais je ne vois pas ton problème.
  • met juste l'extrait de code où tu as un problème.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed