XL 2016 Besoin d'aide - Problème VBA pour planning perpétuel

Ugodélires

XLDnaute Nouveau
Bonjour à tous,

Débutant en VBA, je me créé des petits exercices pour apprendre.
Je suis en train de créer un planning perpétuel avec la possibilité de démarrer l'année à n'importe quel mois.

Je veux que les jours fériés soient indiqués par des cases colorées (pas de problème pour ça avec la mise en forme conditionnelle) mais aussi que dans les colonnes Activité, le mot "FÉRIÉ" apparaisse quand le jour est férié.

Pour me faciliter les choses, j'ai créé une colonne entre la colonne de la date du jour et la colonne activité dans laquelle la lettre " F " doit apparaître si le jour est férié. Puis, j'ai réalisé mon code VBA pour que le mot "FÉRIÉ" apparaisse quand nécessaire.

Voici ce code :

Sub FERIE()

Application.ScreenUpdating = False

Dim ligne As Integer, col As Integer

Sheets("Planning").Activate

col = 4

Do While col <= 28

For ligne = 7 To 37

If Cells(ligne, col - 1) = "F" Then

Cells(ligne, col) = "FÉRIÉ"


End If

ligne = ligne + 1

Next ligne

For ligne = 42 To 72

If Cells(ligne, col - 1) = "F" Then

Cells(ligne, col) = "FÉRIÉ"


End If

ligne = ligne + 1

Next ligne

col = col + 4

Loop

Application.ScreenUpdating = True

End Sub

Il fonctionne mais, j'ai des jours comme le 8 Mai, le jeudi de l'Ascension, le 14 juillet... où le mot "FÉRIÉ" n'apparaît pas alors que la lettre " F " est bien présente dans sa colonne respective.

Je vous joint mon fichier pour que ce soit plus simple à comprendre.

Est-ce que quelqu'un peut m'aider SVP (ou au moins m'expliquer ce qui ne va pas) ?
 

Pièces jointes

  • Test Planning.xlsm
    62.3 KB · Affichages: 15

xUpsilon

XLDnaute Accro
Bonjour,

La fonction "for ... next" te permet d'incrémenter la variable entrée dans ton for à chaque fin de boucle.
Dès que for s'exécute une fois puis boucle, ta valeur de "ligne" va donc augmenter de 1. Sauf que toi, tu as rajouté une ligne "ligne = ligne + 1". Du coup, tu incrémentes de 2 en 2 ta variable ligne à chaque passage de ta boucle. Du coup, il y a certains jours que tu zappes.
VB:
    For ligne = 7 To 37

        If Cells(ligne, col - 1) = "F" Then
       
            Cells(ligne, col) = "FÉRIÉ"
         
                   
        End If

    ligne = ligne + 1
   
    Next ligne
   
    For ligne = 42 To 72

        If Cells(ligne, col - 1) = "F" Then
       
            Cells(ligne, col) = "FÉRIÉ"
         
                   
        End If

    ligne = ligne + 1
   
    Next ligne

Enlève les lignes "ligne = ligne + 1" et ça devrait tout de suite aller mieux ;)

Au passage, j'ai regardé un peu l'ensemble du fichier et il y a des conditions inutiles dans tes formules : Tu testes si chaque jour est égal au 1er mai par ex. Sauf que autant le Lundi de Pâques c'est normal de le recalculer chaque année, autant le 1er Janvier le 1er Mai ou le 8 Mai ils bougeront jamais, donc pour alléger ton document je te conseille d'enlever les conditions sur les jours fixes, qui rendent tes formules excessivement longues ;)

Bonne continuation
 
Dernière édition:

Ugodélires

XLDnaute Nouveau
Bonjour,

La fonction "for ... next" te permet d'incrémenter la variable entrée dans ton for à chaque fin de boucle.
Dès que for s'exécute une fois puis boucle, ta valeur de "ligne" va donc augmenter de 1. Sauf que toi, tu as rajouté une ligne "ligne = ligne + 1". Du coup, tu incrémentes de 2 en 2 ta variable ligne à chaque passage de ta boucle. Du coup, il y a certains jours que tu zappes.
VB:
    For ligne = 7 To 37

        If Cells(ligne, col - 1) = "F" Then
      
            Cells(ligne, col) = "FÉRIÉ"
        
                  
        End If

    ligne = ligne + 1
  
    Next ligne
  
    For ligne = 42 To 72

        If Cells(ligne, col - 1) = "F" Then
      
            Cells(ligne, col) = "FÉRIÉ"
        
                  
        End If

    ligne = ligne + 1
  
    Next ligne

Enlève les lignes "ligne = ligne + 1" et ça devrait tout de suite aller mieux ;)

Au passage, j'ai regardé un peu l'ensemble du fichier et il y a des conditions inutiles dans tes formules : Tu testes si chaque jour est égal au 1er mai par ex. Sauf que autant le Lundi de Pâques c'est normal de le recalculer chaque année, autant le 1er Janvier le 1er Mai ou le 8 Mai ils bougeront jamais, donc pour alléger ton document je te conseille d'enlever les conditions sur les jours fixes, qui rendent tes formules excessivement longues ;)

Bonne continuation
Bonjour
xUpsilon

Effectivement cela marche beaucoup mieux sans les lignes "ligne=ligne+1".

Merci beaucoup pour ton aide qui non seulement me dépanne mais en plus m'a appris le problème de l'incrémentation.

Et merci aussi pour le petit conseil pour les jours fériés. Effectivement, j'étais tellement pris par ce problème du mot "FÉRIÉ" qui ne s'affichait pas toujours que j'ai fait n'importe quoi dans mes formules

Encore un grand merci à toi et je te souhaite une bonne journée
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Ugodélires, @xUpsilon,

Pour déterminer si un jour est férié, vous pouvez utiliser la formule suivante en C7 puis la recopier sur l'ensemble des cellules concernées.
VB:
=SI(ET(B7<>"";ESTNUM(EQUIV(DECALER($A7;0;1+4*ENT((COLONNE(B7)-1)/4)); $AE$1:$AE$28; 0)));"F";"")


Si un jour est férié, la formule suivante suivante =ESTNUM(EQUIV(DECALER($A7;0;1+4*ENT((COLONNE(A7)-1)/4)); $AE$1:$AE$28; 0)) peut être utilisée pour la MFC sur la plage A7:AB72 et remplacer vos multiples conditions de MFC (pour un férié).
 

Ugodélires

XLDnaute Nouveau
Bonjour @Ugodélires, @xUpsilon,

Pour déterminer si un jour est férié, vous pouvez utiliser la formule suivante en C7 puis la recopier sur l'ensemble des cellules concernées.
VB:
=SI(ET(B7<>"";ESTNUM(EQUIV(DECALER($A7;0;1+4*ENT((COLONNE(B7)-1)/4)); $AE$1:$AE$28; 0)));"F";"")


Si un jour est férié, la formule suivante suivante =ESTNUM(EQUIV(DECALER($A7;0;1+4*ENT((COLONNE(A7)-1)/4)); $AE$1:$AE$28; 0)) peut être utilisée pour la MFC sur la plage A7:AB72 et remplacer vos multiples conditions de MFC (pour un férié).
Bonjour @mapomme

Merci beaucoup pour cette information.

Effectivement, je dois admettre que votre proposition est beaucoup plus courte tout en étant autant efficace.
Je ne connais pas les fonctions ESTNUM ni ENT mais je pense qu'après quelques recherches et quelques essais, je comprendrais mieux ces fonctions
 

xUpsilon

XLDnaute Accro
Bonjour Modeste, le fil,

Si je ne m'abuse, le List_FERIES attend des arguments, ou par défaut renvoie les jours fériés du pays dans lequel il est utilisé. Du coup, si Ugodélires ne travaille pas sur un Excel français, j'ai bien peur que les jours fériés ne soient pas corrects ;) (je travaille actuellement en Allemagne et ai dû recalculer tous les jours fériés pour un calendrier pour ma boite, c'est pour ça que je fais cette remarque )

Bonne continuation
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Bonjour Modeste, le fil,

Si je ne m'abuse, le List_FERIES attend des arguments
:rolleyes: list_feries n'est qu'un nom affecté à une plage ...
le contenu ici est le résultat de formules dépendantes de Date_Ref (Année choisie o_O qui rationnellement devrait être nommée AN_Ref ?)

l'exhaustivité des dates à y calculer dépend en effet de la volonté et capacité de l'utilisateur à savoir y traduire et affecter les formules relatives à sa contrée :

de nombreux exemples ont déjà été postés sur ce forum
 
Dernière édition:

Ugodélires

XLDnaute Nouveau
Bonjour

Merci @xUpsilon , @mapomme , @Modeste geedee pour vos réponses qui m'ont grandement aidé mais en plus m'ont appris des choses.

Je rencontre cependant un nouveau problème.
Voilà, à partir d'un Userform, je voudrai pouvoir saisir des activités dans une feuille, et ce à des dates données.

J'ai donc tapé ce code :

VB:
Private Sub CommandButton1_Click()

Dim CA As Range, Lg As Integer

If MsgBox("Voulez-vous ajouter cette activité à votre planning ?", vbYesNo) = vbYes Then

    With Sheets("Données")
        .Range("P1") = Me.TxBDate
        .Range("P2") = Me.TxBDateF
    End With
    
    If Me.TxBDate <> "" And Me.CbXActivité <> "" Then
    
        Set CA = Sheets("Données").Range("A:A").Find(Sheets("Données").Range("P1"), LookIn:=xlValues, lookat:=xlWhole)
        If Not CA Is Nothing Then
        
            Lg = CA.Row
            
            If Sheets("Données").Cells("B" & Lg) <> "" Then
            
                MsgBox ("Le " & Me.TxBDate & ", vous avez déjà " & Me.CbXActivité & " d'inscrit à votre planning")
            
            
            Else
            
                Sheets("Données").Cells("B" & Lg) = Me.CbXActivité
                ThisWorkbook.Save
                Unload UsFActivités
                
            End If
            
            
        Else
        
            MsgBox ("Date non valide !")
            
        End If
    
    
    Else
    
        MsgBox ("Les champs avec une * sont obligatoires")
        
    End If
    
End If


End Sub

Or à chaque fois que je l'exécute, en rentrant les bons critères dans l'userform, j'ai toujours la Msgbox "Date non valide !" comme résultat.

Ci-joint un fichier pour être plus clair.

PS : la textbox DateF ne sert pas pour le moment, elle me sera utile juste pour inscrire une activité qui se répète sur plusieurs jours (mais il faut avant que le problème que je viens de vous exposer soit résolu)

Donc pour conclure, si quelqu'un peut m'expliquer d'où provient le petit soucis que je rencontre.

Merci
 

Pièces jointes

  • Test Planning.xlsm
    28.9 KB · Affichages: 8

xUpsilon

XLDnaute Accro
Bonjour,

Le problème est visiblement dans le format de l'écriture de la date dans ta première textbox. En effet, si tu rentres une date au format "Excel" (43476 par ex), ça fonctionne (à condition que la colonne A:A soit au même format). Il faut donc faire attention que ce qui est récupéré soit bien compris comme une date.
Ensuite, tu as une erreur dans ton code au niveau de
VB:
Cells("B" & Lg)
Dans Excel, tu as deux possibilités pour récupérer la valeur d'une cellule : Range(Col & Lig) ou Cells(Lig, Col). Dans Range tu entres un argument qui correspond au "nom" de ta cellule entre guillemets (Range("A1") représente la cellule A1), alors que Cells attend deux arguments, d'abord l'index de la ligne puis l'index de la colonne, sous forme de NOMBRES (Cells(1,1) représente la cellule A1, Cells(2,1) la cellule A2 etc ...).
Ensuite, j'imagine que c'est juste un oubli, mais tu veux
Code:
Unload UsFActivités
Sauf qu'il n'existe pas, tu n'as qu'un UserForm1 ;) (pour être plus générique, tu pourrais utiliser simplement Unload Me, comme ça même si tu changes le nom du UserForm, ça fonctionnera toujours).

Je t'envoie ci-joint ma version revue et corrigée, mais qui tourne avec des dates au format Excel, et pas au format jj/mm/aaaa. Je te laisse adapter ça, et si tu ne trouves pas, reviens demander de l'aide ;)

Bonne continuation
 

Pièces jointes

  • Test Planning (1).xlsm
    30.7 KB · Affichages: 16

Discussions similaires

Réponses
6
Affichages
302