Sélection jours fériés sur jours de présence
Bonjour le forum ,je reviens vers vous avec une partie de mon fichier car je ne trouve pas de solution à mon problème.Je m'explique :lorsque je sélectionne les cellules de AE15 à AG19 et que je clique sur le bouton CT ,je souhaiterais que la colonne AG18 soit vide c'est à dire pas de pointage car jours fériés.Merci de votre aide .
- Messages
- 1'089
- Excel
- 2021 FR
- Inscrit
- 17/12/2018
- Emploi
- Technicien maintenance robot Retraité
Bonsoir,
Je m'explique :lorsque je sélectionne les cellules de AE15 à AG19 et que je clique sur le bouton CT ,je souhaiterais que la colonne AG18 soit vide
En fait avec le code que je te propose il faut sélectionner que la partie à supprimer c'est à dire AG15:AG19 puis sur le bouton CT
Slts
Bonjour Cfab6, le fil, le forum,
Un essai à dynamiser :
Private Sub CommandButton8_Click() ' << Bouton CT
Dim TheDate As Long, Index As Variant
Dim Cel As Range
For Each Cel In Range("AE:AG")
TheDate = Cells(Cel.Row, "AE")
Index = Application.Match(TheDate, Range("Fériés3"), 0)
If IsError(Index) Then
' "Résultat négatif. Rien trouvé."
Else
Cells(Cel.Row, "AG").ClearContents
End If
Next Cel
End SubBizz
Bonjour le forum ,
Bonjour boss_68 ,merci pour ton retour mais ce n'est pas ce que je recherche ,je ne souhaite pas supprimer toute la sélection mais simplement quand je sélectionne par exemple de AE15 à AG19 mais ça peut être plus large de J4 à AS34 et que je clique sur CT pour pointer des jours sur les jours de travail ,je ne veux pas de pointage "CT" sur les jours fériés .
Bonjour Bizarre ,j'ai tenté de modifier ma programmation de mon bouton "CommandButton8_Click()" avec ton code mais ça provoque un conflit et ça plante excel.Je cherche à comprendre pourquoi .
Bonjour Cfab6, le fil, le forum,
Ici, le code fonctionne bien sur le fichier que tu nous as soumis. Teste-le.
Si ce code fait planter ton Excel, il doit y avoir une interférence quelconque.
Serait-il possible d'avoir un fichier avec tout ton code afin de vérifier la source du souci ?
Bizz
Re Bizarre voici mon fichier ,chez moi quand je sélectionne de AE15 à AG19 et que je clique sur mon bouton CT ça plante.
Bonjour Cfab6,
Je n'ai pas trouvé comment lire l'adressage d'une plage déjà sélectionnée. Mais, on peut utiliser une cellule "Activecell".
Si une plage est sélectionnée, c'est la cellule en haut à droite de la plage qui sera lue.
Sélectionne une cellule (exemple : "AE15") puis lance la procédure (bouton "CT").
Un "InputBox" va demander sur combien de lignes il faut vérifier les dates à partir de la cellule sélectionnée.
Si la date est bien un jour férié, deux cellules à droite, le contenu est effacé.
Note : Si ce nombre de ligne est fixe, l''on pourrait sauter l'étape du "InputBox".
Ce code pourrait être amélioré.
Private Sub CommandButton8_Click() ' << Bouton CT
Dim findDate As Date, R As Range, C As Range
Dim PlageRech As Range, Cel As Range, NombreLigne As Variant, Active_Cel
test = ActiveCell.Address
test = Replace(test, "$", "")
NombreLigne = InputBox("Comblien de lignes à partir de la cellule : " & test & " ?", 1)
If NombreLigne = "" Then Exit Sub
'Si une valeur a été entrée et si l'utilisateur a cliqué sur OK
If NombreLigne > 0 Then Set PlageRech = Range(Cells(ActiveCell.Row, ActiveCell.Column), Cells(ActiveCell.Row + NombreLigne - 1, ActiveCell.Column))
For Each Cel In PlageRech
If IsError(Cel.Value) Then
Exit Sub
Else
Set R = Range("Fériés3")
For Each C In R
If C.Value2 = CDbl(Cel.Value2) Then
Debug.Print Cel.Address
Cel.Offset(0, 2).ClearContents
' Cel.Offset(0, 2).Address
Exit For
End If
Next C
End If
Next Cel
End SubBizz
Bonjour Bizarre j'ai testé ton code ça fonctionne mais uniquement sur une colonne ,est-ce possible de pouvoir faire un balayage depuis la cellule J4 jusqu'à AS34 par exemple ?. Merci
bonjour le fil,
@ Bizarre, "Selection" = "Je n'ai pas trouvé comment lire l'adressage d'une plage déjà sélectionnée."
Private Sub CommandButton8_Click() ' << Bouton CT
Dim findDate As Date, R As Range, C As Range, Isect As Range
Dim PlageRech As Range, Cel As Range, NombreLigne As Variant, Active_Cel
'test = ActiveCell.Address
'test = Replace(test, "$", "")
'NombreLigne = InputBox("Comblien de lignes à partir de la cellule : " & test & " ?", 1)
'If NombreLigne = "" Then Exit Sub
'Si une valeur a été entrée et si l'utilisateur a cliqué sur OK
'If NombreLigne > 0 Then Set PlageRech = Range(Cells(ActiveCell.Row, ActiveCell.Column), Cells(ActiveCell.Row + NombreLigne - 1, ActiveCell.Column))
Set Isect = Intersect(Range("J4:AS34"), Selection)'limiter "selection" à cette plage
If Isect Is Nothing Then MsgBox "rien sélectionné dans la plage correcte": Exit Sub
For Each Cel In Isect.Cells
If Cel.Column Mod 3 = 1 Then 'numéro de la colonne est un mulitple de 3 + 1
If Not IsError(Cel.Value) Then
Debug.Print Cel.Address
If WorksheetFunction.CountIf(Range("Fériés3"), CDbl(Cel.Value2)) > 0 Then
Cel.Offset(0, 2).ClearContents
End If
End If
End If
Next Cel
End SubBonjour Cfabf6, le fil, le forum,
Vérification de toute la plage (J4:AQ43).
Une version en passant par les "variable tableau" .
Private Sub CommandButton8_Click() ' << Bouton CT
Dim X As Integer, Tdate, TFerie, Zon1 As Integer, Zon2 As Integer
TFerie = Range("Fériés3").Value2
For X = 10 To 43 Step 3 ' colonne J à AQ avec un pas de 3
Tdate = Range(Cells(4, X), Cells(34, X)).Value2 ' colonne X de date à vérifier
' ici, passer par des variables tableau pour la rapidité du traitement
For Zon1 = LBound(Tdate, 1) To UBound(Tdate, 1)
For Zon2 = LBound(TFerie, 1) To UBound(TFerie, 1)
If Tdate(Zon1, 1) = TFerie(Zon2, 1) Then
Cells(Zon1 + 3, X + 2).ClearContents ' vider la cellule concerné
Exit For
End If
Next Zon2
Next Zon1
Erase Tdate ' vider la variable tableau pour changer de colonne de dates à vérifier
Next X
End SubBizz
re,
ce traitement vite ? Tout est relatif ... . Enlever le 2eme "For Next" et remplacer le par un "Countif" ???
Merci Bart et Bizarre pour votre aide mais je me posais une question ,est-il possible d'imaginer deux boutons ,le premier permet de faire le pointage sur les jours de présence que ce soit M ou AM sans se préoccuper des jours fériés et le deuxième de faire un pointage sur les présence sauf les jours fériés ,un peu comme dans le fichier joint ou j'ai créer deux boutons ,CT qui pointent tous les jours quand vous sélectionnez de J4 à AS34 et un bouton CA qui ne pointent que les jours AM .Est- ce possible ? Attention les suppressions se font uniquement à l'aide des boutons effacement mais ça je pense que vous l'avez vu
Bonjour Cfab6, le fil, le forum,
Un essai :
Note : Tester aussi une plage qui couvre les 19 et 20 mai 2024.
Bizz
Bonjour Cfab6, le fil, le forum,
Une version dont le code est légèrement différent après avoir été passé dans ChatGPT.
Bizz
Bonjour Bizz ,merci pour ton retour et ton travail ,les deux fichiers fonctionnent bien et je me posait la question ,est -il possible d'avoir un bouton qui intègre cette case d'option "sans les jours fériés" directement car si je sélectionne tout le mois mai avec la case jours fériés cochée ,j'obtiens le 19 mai pointé alors que ce jour là l'équipe ne travaille pas donc ce n'est pas utile pour moi .Mais peut -être que c'est plus difficile voir impossible .En attendant je peux déjà travailler avec ce que j'ai .
Bonjour Cfab6, le fil, le forum,
Le plus simple serait d'ajouter une condition si je comprenais comment détecter : "les jours où l'équipe ne travaille pas".
Si je comprends bien, ce sont des jours où la case concernée en regard de ces dates sera toujours vide.
Bizz
En fait je pars du principe que le salarié travaille toute l'année en fonction de son équipe ,3 jours matin et 2 jours après midi par semaine et inversement et avec mon fichier je sélectionne des jours ou des mois et je clique sur CT ou CA pour faire un pointage et lorsque le pointage d'un jour de semaine tombe sur un jours fériés alors pas de pointage CA ou CT .J'espère que vous comprenez mon raisonnement .
Bonjour Cfab6, le fil, le forum,
Donc, en résumé : pour fériés inclus, dans la plage, un mois contient 3 colonnes : Jour, les périodes "AM et "M" et les "CT" et "CA" et si le jour est férié et la période est vide, la 3e colonne devra rester vide.
Dans ce cas particulier : ajoutons une condition au moment de l'écriture ...
' Mise à jour des cellules pour les jours fériés
For Each Cellule_en_Cours In Test_Plage
On Error Resume Next
If WorksheetFunction.CountIf(Range("Fériés3"), CDbl(Cellule_en_Cours.Offset(0, -2).Value2)) > 0 Then
If Not OptionButton1.Value Then
Cellule_en_Cours.ClearContents
Else
' condition ajoutée
If Cellule_en_Cours.Offset(0, -1).Value = "AM" And _
Cellule_en_Cours.Offset(0, -1).Value = "M" Then
Cellule_en_Cours.FormulaR1C1 = Val_Indispo
End If
End If
End If
On Error GoTo 0
Next Cellule_en_Cours
...
...Bizz
Bonsoir Bizz c'est parfait ,ça fonctionne parfaitement c'est trop top ,je vais pouvoir l'essayer sur mon fichier de calcul des congés ,je reviendrais vers le forum si je rencontre un problème mais pour l'instant ça roule .Merci a tous et merci au forum ,bravo