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) ?
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
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
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
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é).
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é).
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
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 )
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 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 :
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.
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