• Initiateur de la discussion Initiateur de la discussion machin
  • 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 !

M

machin

Guest
Bonjour à tous,

Voila plusieurs jours que je galère sur mon planning. Dans le fichier plusieurs onglets, l'onglet test qui montre le problème, les 2 autres onglets sont les résultats attendus selon le bouton coché.
J'ai noté les explications (j'espère suffisante) dans le fichier, une explication a la "cantonade" serait inutile sans support (je pense)

Merci par avance

Cordialement
 
Dernière modification par un modérateur:
Re : Planning

Bonsoir,

pourquoi les 15 et 16 juin ont un B c'est pas vendredi ?
le 25 juin t'es de garde ?
vérifie tes plages pour les formules AB21 et AB22
la mfc jaune(gardes) de l'onglet test s’arrête à la date en ac5 (04/05); tu mets un B le 20/05 ?

la formule que tu colle
Code:
=SI(F8="";"";SI(ET(JOURSEM(F8)=6;F8<$AC$4);"B";SI(ET(F8>=$AC$4;F8<$AC$3);"A";"")))
ne tient pas compte des gardes. J'en tiendrai compte comme çà
Code:
=SI(F8="";"";SI(ET(JOURSEM(F8)=6;F8<$AC$4;(NB.SI(AG3:AN12;F8=0)));"B";SI(ET(F8>=$AC$4;F8<$AC$3);"A";"")))
@te lire
 

Pièces jointes

Dernière édition:
Re : Planning

Bonjour à tous,

@st007:
L'onglet "Vendredi + cumule" est le résultat à obtenir si choisi. Les 15 et 16 juin sont typés "B" parce qu'il y a 23 "B" à caser hors gardes. En commençant du 01/01/ii, nécessité d'avoir uniquement 21 "B", c'est pourquoi les 2 "B" restant sont positionnés à partir de la date de fin et en remontant. C'est pourquoi nous avons notre petit écart entre le nombre alloué de "B" en (AB7) qui est différent de "B" pointé en (AB21). Idem pour les "A" écart entre alloué en (AB6) et pointé en (AB22). Je suis coupable j'aurai du insister sur ce point.

@bbb38:
Merci pour votre code, en effet permet de compter le nombre de "A" et "B"

Merci pour vos contributions

Nota: De plus je viens juste de me rendre compte qu'il y a également un écart entre le résultat des formules AC4, AC5 et le comptage réel des "A" et "B".

Cordialement
 
Dernière modification par un modérateur:
Re : Planning

Bonsoir,

Tes formules originales considéraient la date en AC3 comme point de départ de la mise en place des A et B puis remonter
de plus tes B ne sont sensés se placer que sur des vendredi
dans le même genre tes écarts de A se justifie dans le cumulé puisque tu calcule AC4 en jours ouvrés et tu en places sur samedi et dimanche
 
Re : Planning

Bonjour à tous,

@st007: "A" et "B" correspondent a certain types de repos ou congés, c'est pourquoi à l'initial le "B" doit être placé uniquement sur le vendredi. Maintenant la personne est mutée à la date située en (AC3) sans perdre ses droits acquis, donc prendre tous les repos et congés accumulés, c'est pourquoi j'avais affecter des "B" les 15 et 16 juin. Pour résumer, la personne doit prendre entre le 01/01 et 25/06 "13 A" et "23 B", ce qui donne un départ le lundi 23/05 et une dernière garde du 18/05 au 24/06.
J'ai ajouté un autre exemple ou le départ est le 31/05. Avec un droit de "13 A" et "23 B", cette personne terminera le 21/04, et aura une garde du 14/05 au 21/05
Pour les placements de "A" et "B" sur les samedi dimanche, mon niveau Excel et VBA étant très très légèrement au dessus de zéro, et je n'avais pas pensé à chercher une formule pour cibler chaque jour de la semaine JOURSEM (x,y), votre participation m'a éclairé sur mon erreur.

Encore un grand merci pour votre patience, votre travail et le temps que vous passez

Cordialement
 

Pièces jointes

Re : Planning

Re,

@st007: La difficulté vient des exceptions en effet. Pour la contourner, il faudrait dans un premier temps appliquer les règles, installer un compteur pour les "pointés A" et un pour "pointés B" et tant que les écarts entre les alloués et les pointés ne sont pas a zéro alors affecter les A ou B en partant de la date de fin. Je vais tenter de faire par VBA. Pas sur d'avoir été clair !!!

Merci encore pour votre implication

Cordialement
 
Re : Planning

re,
c'est limpide, j'en suis aux mêmes conclusions puisque la modification de ta macro donne une partie du résultat escompté.
le compteur pour les pointés A et B, y sont déjà .
mon soucis est de dire à excel en vba de se placer sur la cellule du planning correspondant à la date en ac3
pour y placer une formule, vérifier le nombre de B, et si .....
 
Re : Planning

Bonjour,
juste pour dire que je sèche j'aurai bien essayer un bout de vba pour coller "B" si le nombre de B (ab21) < au nombre alloué (AB7)
dans la case correspondante à la date AC3

Au secours les pros du vba !!!

l'idée de départ est de placer un nombre (AB7) de "B" sur les vendredi non de "garde" en commençant par la date ac3 et antérieur
mais si je n'ai pas assez de vendredi dispo dans l'année, en placer sur la date AC3 et autant que nécessaire sur les jours antérieurs sans aucune contrainte

posé comme çà peut-être qu'une idée lumineuse nous viendra ...
 
Re : Planning

Bonsoir,

Je joins le petit bout de code réalisé (loin d’être parfait !!!), pour colorier les gardes et les "B". Maintenant je tente de partir de la date de fin et remonter a épuiser les quotas de "A" et "B" mais pas facile.

Cordialement

VB:
Option Explicit

Dim valtest As Date
Dim valid As Integer
Dim garde As Integer
Dim cpteurA As Integer
Dim cpteurB As Integer

Sub Valide() 'recherche si date est une garde
Dim c As Variant
 For Each c In [AG3:AN12]
     If c Like valtest Then
       c.Select
       valid = 1
       Exit Sub
     End If
   Next
   valid = 0
 End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub reposB()
Dim a%, b%

   For a = 0 To 30
        For b = 0 To 20 Step 4
        
            If Range("b4").Offset(a, b).Value = "" Then
            Exit For
            Else
            valtest = Range("b4").Offset(a, b).Value
            End If

            Valide
            garde = 0
 
            If valtest < Range("ac3").Value And valid = 1 Then
            Range("d4").Offset(a, b).Interior.ColorIndex = 6
            garde = 1
            End If
  
            If valtest < Range("ac3").Value And Weekday(valtest) = 6 And garde = 0 Then
            Range("d4").Offset(a, b) = "B"
            End If

        Next
    Next

compte 
 
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Sub compte()
Dim col%, lgn%

    cpteurA = 0
    cpteurB = 0
    
    For col = 4 To 24 Step 4
        For lgn = 4 To 68
          If Cells(lgn, col) = "A" Then cpteurA = cpteurA + 1
          If Cells(lgn, col) = "B" Then cpteurB = cpteurB + 1
        Next
    Next
    
    Range("AB25").Value = cpteurB
    Range("AB26").Value = cpteurA
    
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Assembleur()' a lancer 
Dim a%, b%
    Application.Calculation = xlManual
   
If Range("AC13").Value = 1 Then
For a = 0 To 30
    For b = 0 To 20 Step 4
    
    Range("D4").Offset(a, b).FormulaR1C1 = _
     "=IF(RC[-2]="""","""",IF(WEEKDAY(RC[-2],2)>5,"""",IF(COUNTIF(R4C31:R16C31,RC[-2])=1,"""",IF(AND(RC[-2]>=R4C29,RC[-2]<R3C29),""A"",IF(AND(RC[-2]>=R5C29,RC[-2]<R4C29),""B"","""")))))"
    
    'Range("D38").Offset(a, b).FormulaR1C1 = _
     "=IF(RC[-2]="""","""",IF(WEEKDAY(RC[-2],2)>5,"""",IF(COUNTIF(R4C31:R16C31,RC[-2])=1,"""",IF(AND(RC[-2]>=R4C29,RC[-2]<R3C29),""A"",IF(AND(RC[-2]>=R5C29,RC[-2]<R4C29),""B"","""")))))"
       
    Next
Next
End If

If Range("AC13").Value = 2 Then
reposB
End If

If Range("AC13").Value = 3 Then
MsgBox " Caler vos jours de repos "
End If

    Application.Calculation = xlAutomatic
    
End Sub
 
Dernière modification par un modérateur:
Re : Planning

Bonsoir,

Je pense avoir réussi a traiter le cas 2, par contre mon niveau VBA est très faible et si une âme charitable pouvait vérifier les incohérences se serait génial

Merci par avance

VB:
Option Explicit

Dim valtest As Date
Dim valid As Integer
Dim garde As Integer
Dim cpteurA As Integer
Dim cpteurB As Integer


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Assembleur()
Dim a%, b%

Application.ScreenUpdating = False
Application.Calculation = xlManual
Effacer

   For a = 0 To 30
        For b = 0 To 20 Step 4
        
            If Range("b4").Offset(a, b).Value = "" Then
            Exit For
            Else
            valtest = Range("b4").Offset(a, b).Value
            End If

            Valide
            garde = 0
 
            If valtest < Range("ac3").Value And valid = 1 Then
            Range("d4").Offset(a, b).Interior.ColorIndex = 6
            garde = 1
            End If
  
            If valtest < Range("ac3").Value And Weekday(valtest) = 6 And garde = 0 Then
            Range("d4").Offset(a, b) = "B"
            End If

        Next
    Next
    
compte

repos

Application.Calculation = xlAutomatic
Application.ScreenUpdating = True

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Valide() 'recherche si date est une garde
Dim c As Variant
valid = 0
 For Each c In [AG3:AN12]
     If c Like valtest Then
       c.Select
       valid = 1
       Exit Sub
     End If
   Next
   valid = 0
 End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub compte()
Dim col%, lgn%

    cpteurA = 0
    cpteurB = 0
    
    For col = 4 To 24 Step 4
        For lgn = 4 To 68
          If Cells(lgn, col) = "A" Then cpteurA = cpteurA + 1
          If Cells(lgn, col) = "B" Then cpteurB = cpteurB + 1
        Next
    Next
    
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub repos()
Dim col%, lgn%
Dim maxA%, maxB%

maxA = Range("ab6").Value
maxB = Range("ab7").Value

    For col = 22 To 2 Step -4
        For lgn = 34 To 4 Step -1
            
            If Cells(lgn, col) = "" Then
                valtest = Range("ac3").Value
            Else
                valtest = Cells(lgn, col)
            End If

            Valide

            compte

                If Range("ac3").Value > valtest And cpteurB < maxB And valid = 0 And Cells(lgn, col + 2) = "" And Weekday(valtest, 2) < 5 Then
                    Cells(lgn, col + 2) = "B"
                End If

                If Range("ac3").Value > valtest And cpteurA < maxA And valid = 0 And Cells(lgn, col + 2) = "" And Weekday(valtest, 2) < 5 Then
                    Cells(lgn, col + 2) = "A"
                End If

                If cpteurB = maxB And cpteurA = maxA Then Exit For

        Next
    Next
    
End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Effacer()
Dim a%
For a = 0 To 20 Step 4
    Range("D4:D34").Offset(0, a).Select
    Selection.ClearContents
    With Selection.Interior
        .Pattern = xlNone
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With
Next
End Sub
 
- 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
Assurez vous de marquer un message comme solution pour une meilleure transparence.

Discussions similaires

Réponses
4
Affichages
265
  • Question Question
XL 2021 planning
Réponses
5
Affichages
433
  • Question Question
Microsoft 365 sos planning
Réponses
6
Affichages
1 K
Réponses
0
Affichages
305
Réponses
12
Affichages
803
Retour