Recherches et Sélection en VBA

Bonjour à tous.

Je viens à vous car je suis plutôt embêté. En effet, je souhaiterai créer un planning "automatisé" et simple à utiliser.

Je vous fournis un exemple de ce que j'aimerai faire avec un extrait du planning.

En gros, j'aimerai que :

  • quand on clique sur le bouton Ajout/Supprimer, l'Userform s'ouvre en conséquence [OK]
  • dans l'Userform, quand on clique sur Fermer, l'Userform se ferme [OK]
  • dans l'Userform, il faut remplir les différents champs (Personne, Date début, Moment Début, Date fin, Moment fin et Type Absence) avant de cliquer sur Ajouter. Là, la macro tourne, va sélectionner la/les cellule(s) correspondante(s) aux critères et écrit la valeur du type d'absence (1 ou 2 dans notre cas) [Non Résolu]
  • dans l'Userform, il faut remplir les différents champs (Personne, Date début, Moment Début, Date fin et Moment fin) avant de cliquer sur Supprimer. Là, la macro tourne, va sélectionner la/les cellule(s) correspondante(s) aux critères et efface les valeurs inscrites [Non Résolu]

Comme vous pourrez le voir dans le fichier, j'ai réussi à faire une première fonction Find pour trouver la ligne correspondante à la personne sélectionnée. Seulement, je ne sais pas trop comment l'utiliser et surtout si ma façon de faire est la bonne.

Et quand j'essaye de trouver la colonne correspondante à la date de début, je n'arrive pas à adapter la formule.

Pour le bouton Supprimer, je suppose que le code sera assez proche du bouton Ajouter. Donc, s'il est possible à quelqu'un de m'aider pour le bouton Ajouter, je ferai de mon mieux pour le bouton Supprimer.

Merci d'avance à qui voudra bien, ne serait-ce que, me guider.

Bonne soirée.

23planning-gene.xlsm (29.88 Ko)

Bonjour

Un essai à tester.

Te convient-il ?

Bonjour

Mon petit boulot

Bonjour,

Déjà pour commencer, merci à tous les deux de vous être penché sur mon cas. Je suis content d'avoir eu des réponses si rapidement. Etant donné que j'ai un "choix", je vais me baser sur les codes de Banzai64 car ils semblent plus complets et plus adaptés pour mon réel fichier, bien plus lourd.

Je me suis amusé à ajouter quelques commentaires et à créer le code pour le bouton Supprimer à partir de ce qui a été fait pour Ajouter. J'aurai juste deux questions :

For Col = ColDep To ColFin
.Cells(ligne, Col) = IIf(Me.OpbAbs1 = True, 1, 2)
Next Col

Si je comprends bien, ça fonctionne comme un =SI() dans la feuille Excel. Est-ce bien ça ?

Il faut que je vois pour l'adapter sur mon fichier où j'ai pas moins de 12 types de codes à entrer avec une mise en forme associée. Sinon je pense utiliser un If ElseIf.

Ensuite, j'ai vu ce code :

Private Sub UserForm_Initialize()
Dim Cel As Range

Set Ws = Worksheets("2015")

'Tableau2[[Dates]]
For Each Cel In Range("Tableau2[[Dates]]")
    Me.CbbDatedébut.AddItem Cel.Text
    Me.CbbDatefin.AddItem Cel.Text
Next Cel

End Sub

Me concernant, j'avais mis les sources via les propriétés du Combobox et avec le champ RowSource.

Je me demande juste quelle est la différence entre les deux façons de faire (s'il y a un avantage à utiliser une méthode ou l'autre).

Merci encore d'avoir répondu si vite et de m'avoir débloquer tout ça.

Bonne journée

Bonjour

Oui le IIF fonctionne comme un SI()

IIf(Condition,Si_Condition_Vrai,Si_Condition_Fausse)

Ensuite avec la propriété RowsSource tu vais biens les jours du mois dans la liste, mais quand tu en choisissais un tu n'avais que le nombre représentant la date, et j'avais cette solution pour avoir une vrai date lors de la sélection

C'est tout

Bonjour.

Merci pour ces explications. Je vois mieux comment ça marche du coup.

Par contre, maintenant j'ai un deuxième soucis avec le code. Si ce n'est pas trop abusé, je demande à nouveau un peu d'aide.

Sur mon fichier réel, les personnes sont réparties dans diverses équipes, et grâce à un autre bouton et une macro on peut choisir de faire apparaître telle ou telle équipe. Seulement, certaines personnes font parties de deux équipes (pas plus normalement). Du coup il faudrait que j'ajoute une boucle (je pense) dans les codes ci-dessus afin de remplir deux lignes différentes si nécessaire.

Serait-il donc possible de me guider car pour le moment, tout ce qui est boucle, je n'ai pas encore bien compris comment ça fonctionne.

Merci.

Bonjour

A vérifier

Bonjour,

Merci ça marche du tonnerre. J'ai même réussi à comprendre rapidement le principe (même si je ne pense pas être capable de le retranscrire seul pour le moment) et le transposer pour le bouton Supprimer.

Du coup, le sujet est terminé. Merci

Bonjour,

Je me permets de revenir vers vous dans la suite de ce qui a déjà été fait ci-dessus.

Je vais essayer d'expliquer simplement quelles sont mes difficultés.

Ce qu'il se passe c'est que, quand je suis arrivé avec le fichier précédent, mes collègues ont demandé à ce qu'il y ait une feuille par mois (afin que ce soit plus facile et pratique à lire) et de modifier la façon d'entrer la date dans l'userform AjoutSupprAbs. Du coup, je m'y suis lancé mais je bloque.

Tous mes soucis portent sur les macros des boutons Ajouter et Supprimer de l'Userform AjoutSupprAbs.

Dans cet Userform, j'ai du modifié l'affichage des dates de "jeudi 1 janvier 2015" en cases : "01" & "Janvier". Depuis, à chaque fois que je clique sur le bouton Ajouter ou Supprimer, je bug. Du coup, j'ai eu pour idée d'instaurer deux variables s'appelant Début et Fin qui donneraient une valeur type 01/01/2015 en fonction de ce qui est rempli dans les champs mais je n'y arrive pas.

Est-ce une bonne idée ? Comment puis-je opérer ?

Sinon, quelle serait la solution selon vous ?

Désolé, je me doute que je ne suis pas très clair dans mes explications. Mon problème me semble compliqué à expliquer...

Je remercie par avance toute personne qui prendrait le temps de m'aider.

Bonne soirée.

Bonjour

Sharney a écrit :

Sinon, quelle serait la solution selon vous ?

Déjà dire "tu"

Ensuite changer de collègues

Il ne t'ont pas fait un cadeau

A tester

Bonjour,

Je disais vous par politesse (au cas où d'autres personnes viendraient m'aider aussi) mais merci beaucoup. Tu viens de me dépanner une nouvelle fois, ça marche du feu de dieu.

Si j'ai bien vu, tu as modifié les codes des boutons Ajouter et Supprimer. Merci !

J'ai essayé un truc, je ne suis pas sûr que ça fonctionne... Apparemment, quand je rentre un champ qui commence l'après-midi (comme l'astreinte qui est du jeudi après-midi au jeudi matin suivant), le premier après-midi n'est pas pris en compte. (J'ai fait le test au mois de février). Je me demande si c'est pas le fait que la date soit sur deux cellules fusionnées dans la ligne 1 qui fait ça.

De plus, je remarque que dans la feuille Janvier, il y a une ligne en plus avec des M et des A (pour Matin et Après-Midi). Est-ce toi qui l'a ajouté ? Faut-il que je l'ajoute sur toutes les feuilles ?

Bonjour

Sharney a écrit :

Je me demande si c'est pas le fait que la date soit sur deux cellules fusionnées dans la ligne 1 qui fait ça.

Toujours ces cellules fusionnées avec VBA

Sharney a écrit :

il y a une ligne en plus avec des M et des A (pour Matin et Après-Midi). Est-ce toi qui l'a ajouté ?

Je pense qu'elle y est dans toutes les pages, il suffit de la démasquer

Et ce n'est pas moi qui l'ai ajoutée

Voilà, je viens de tester cette nouvelle version et c'est impeccable. Merci encore pour ton aide qui m'aura été très précieuse.

J'ai plus qu'à regarder en détail pour comprendre tout ce que chacun des codes effectue.

Concernant le bouton supprimer, oui ça copie-colle la ligne 4 et c'est normal. C'est pour être sûr qu'il reprend bien les mises en forme de base (fond rouge pour férié, gris pour week-end et jours ouvrables en blanc). Comme ça la macro reste très simple.

Du coup, je considère que tu as amplement répondu à mes attentes. Je considère mon problème comme étant résolu.

(Reste plus qu'à demander aux chefs de changer de collègues ^^)

Bonne journée à toi !

Bonjour,

Je relance encore une fois ce sujet. Il y a un petit détail qui gêne mes collègues dans la macro élaborée précédemment.

En fait, quand ils ajoutent leur tour d'astreinte, il ne s'ajoute pas tout seul les week-ends, c'est à eux de le faire manuellement.

Donc j'ai commencé à me pencher sur ce détail et je pense que cela vient du code suivant :

For Col = ColonneDebut To ColonneFin
            'Entrée du type d'absence dans cellules sélectionnées
            If Weekday(.Cells(1, Col - (Col Mod 2)), vbMonday) < 6 Then
              If Me.BtnForm = True Then
                  .Cells(ligne, Col).Value = "F"
                  .Cells(ligne, Col).Interior.Color = RGB(255, 255, 0)
              ElseIf Me.Btn21 = True Then
                  .Cells(ligne, Col).Value = "21"
                  .Cells(ligne, Col).Interior.Color = RGB(255, 102, 204)
              ElseIf Me.Btn10 = True Then
                  .Cells(ligne, Col).Value = "10"
                  .Cells(ligne, Col).Interior.Color = RGB(255, 102, 204)
              ElseIf Me.BtnRE = True Then
                  .Cells(ligne, Col).Value = "RE"
                  .Cells(ligne, Col).Interior.Color = RGB(9, 106, 9)
              ElseIf Me.BtnRD = True Then
                  .Cells(ligne, Col).Value = "RD"
                  .Cells(ligne, Col).Interior.Color = RGB(9, 106, 9)
              ElseIf Me.Btn15 = True Then
                  .Cells(ligne, Col).Value = "15"
                  .Cells(ligne, Col).Interior.Color = RGB(9, 106, 9)
              ElseIf Me.BtnAst = True Then
                  .Cells(ligne, Col).Value = "A"
                  .Cells(ligne, Col).Interior.Color = RGB(0, 102, 255)
              ElseIf Me.BtnAbs = True Then
                  .Cells(ligne, Col).Value = AbsAutr.Value
                  .Cells(ligne, Col).Interior.Color = RGB(255, 102, 204)
              ElseIf Me.BtnAutr = True Then
                  .Cells(ligne, Col).Value = CodAutr.Value
                  .Cells(ligne, Col).Interior.Color = RGB(129, 20, 83)
              End If
              If Col Mod 2 = 0 Then                           ' Colonne paire
                If Col = ColonneFin And .Name = Me.MoisFin Then
                Else
                  With .Cells(ligne, Col).Resize(1, 2)
                    .Merge
                    .HorizontalAlignment = xlCenter
                  End With
                  Col = Col + 1
                End If
              End If
            End If
          Next Col

Le BtnAst = True (bouton ajouter astreinte) est dans une entrée WeekDay. Mon idée serait donc de l'en exclure. C'est juste que je ne vois pas trop comment faire et j'ai peur de tout planter. Serait-il possible à quelqu'un de me guider ?

Merci.


Oups,

Au final, j'ai essayé de faire ce que je pensais de mon côté et ça a marché.

Plus besoin d'aides.

Bonne journée

Bonjour la compagnie, me voilà de retour.

Je préfère reprendre le fils de la discussion ici plutôt qu'ouvrir un nouveau sujet, puisqu'il s'agit du fichier précédent que je souhaite perfectionner pour 2016 (suis un peu en avance mais au moins c'est fait). Les améliorations que je souhaite mener sont :

  • Utiliser l'outil DTPicker de VBA afin de sélectionner les dates de début et dates de fin (et faciliter l'ergonomie) ;
  • Permettre aux utilisateurs d'ajouter directement un commentaire lorsqu'ils ajoutent des absences.

Cela m'amène à devoir modifier la macro afin de prendre en compte ces améliorations, mais cela bug en différents endroits :

  • 1er bug : la macro ne trouve plus quelle sont les cellules de départ et les cellules de fin, or je ne vois pas comment corriger...
  • 2e bug : la macro n'arrive pas à insérer le commentaire (alors que j'utilise un codage similaire sur un autre excel et ça fonctionne...)

Concernant le 1er bug, je suppose que cela vient de cette partie du code (début ligne 61) :

ColDep = (Day(DTPicker1) * 2) + Me.MomentDebut.ListIndex
ColFin = (Day(DTPicker2) * 2) + Me.MomentFin.ListIndex

For I = Month(DTPicker1) To Month(DTPicker2)
With Sheets(MonthName(I)) '!!!!!!!!!!!!BUG général
Set Cel = .Columns("A").Find(what:=Me.ChoixNom, LookIn:=xlValues, lookat:=xlWhole)
If Not Cel Is Nothing Then
    depart = Cel.Address
    Do
    ligne = Cel.Row

    If Sheets(MonthName(I)).Name = Month(DTPicker1) Then '!!!!!!!!!!!!!! BUG
        ColonneDebut = ColDep
    Else
        ColonneDebut = 2
    End If
    If Sheets(MonthName(I)).Name = Month(DTPicker2) Then '!!!!!!!!!!!!!! BUG
        ColonneFin = ColFin
    Else
        ColonneFin = 1 + (Day(DateSerial(2016, I + 1, 0)) * 2)
    End If

Et concernant le 2e bug, voici le code que j'ai actuellement écris (début ligne 115) :

'Entrée du commentaire (Bug global pour le moment)
        If Me.BoxComm <> "" Then '!!!!!!!!!!!!!! BUG
            commentaire = BoxComm.Value '!!!!!!!!!!!!!! BUG
            .Cells(ligne, col).Comment.Text Text:=commentaire '!!!!!!!!!!!!!! BUG
        End If '!!!!!!!!!!!!!! BUG

Merci d'avance à toute personne en capacité de m'aider et prenant le temps de le faire.

Bonne journée à vous !

Bonjour

A vérifier

Bonjour Banzai,

Comme d'habitude, cela semble fonctionner à merveille, à mois d'adapter sur le véritable fichier pour voir si c'est ok. Je te tiens au courant.

Bonne soirée et encore merci !


Bonjour Banzai.

Je viens d'essayer de transférer ton code sur mon fichier réel, et il semble que cela fonctionne à merveille !

Ne me reste plus qu'à adapter/créer le code pour le bouton Supprimer.

Merci pour l'aide !

Rechercher des sujets similaires à "recherches selection vba"