Besoin d'aide, boucle, et cellule n+1

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

Clem13

XLDnaute Nouveau
Bonjour,

Je me suis fait un programme pour faire des plannings de congés.
J'ai quelques notions de VBA, mais cetaines choses me semblent bien loin.

Voici mon code VBA :

'PROCEDURE DE CONTROLE DE DATE :
If Jour_depart > jour_fin Then
MsgBox ("Attention erreur date")

' PROECEDURE D'ECRITURE EXCEL DES DATES DE CONGES :

'**** SCOLAIRES ****

ElseIf employe = Range("AC21") Then
If Range("AD21") = "" Or Range("AE21") = "" Then
'Petite magouille pour ne pas afficher les données au format texte
Range("AD21") = Jour_depart * 1
Range("AE21") = jour_fin * 1
Range("B2").Select
Else
Rep = MsgBox("Congés déjà présent, voulez vous remplacer ? ", vbYesNo, "Modification ?")
If Rep = vbNo Then
vacances.Hide
Menu.Show
Else
Range("AD21") = Jour_depart * 1
Range("AE21") = jour_fin * 1
Range("B2").Select
End If
End If
ElseIf employe = Range("AC22") Then
If Range("AD22") = "" Or Range("AE22") = "" Then
'Petite magouille pour ne pas afficher les données au format texte
Range("AD22") = Jour_depart * 1
Range("AE22") = jour_fin * 1
Range("B2").Select
Else
Rep = MsgBox("Congés déjà présent, voulez vous remplacer ? ", vbYesNo, "Modification ?")
If Rep = vbNo Then
vacances.Hide
Menu.Show
Else
Range("AD22") = Jour_depart * 1
Range("AE22") = jour_fin * 1
Range("B2").Select
End If
End If
ElseIf employe = Range("AC23") Then
If Range("AD23") = "" Or Range("AE23") = "" Then
'Petite magouille pour ne pas afficher les données au format texte
Range("AD23") = Jour_depart * 1
Range("AE23") = jour_fin * 1
Range("B2").Select
Else
Rep = MsgBox("Congés déjà présent, voulez vous remplacer ? ", vbYesNo, "Modification ?")
If Rep = vbNo Then
vacances.Hide
Menu.Show
Else
Range("AD23") = Jour_depart * 1
Range("AE23") = jour_fin * 1
Range("B2").Select
End If
End If
Evidemment, cela continu longtemps, puisque j'ai 150 personnes donc, 150 lignes ...

Comment faire un code plus simple que de recopier le code de base :

ElseIf employe = Range("AC23") Then
If Range("AD23") = "" Or Range("AE23") = "" Then
'Petite magouille pour ne pas afficher les données au format texte
Range("AD23") = Jour_depart * 1
Range("AE23") = jour_fin * 1
Range("B2").Select
Else
Rep = MsgBox("Congés déjà présent, voulez vous remplacer ? ", vbYesNo, "Modification ?")
If Rep = vbNo Then
vacances.Hide
Menu.Show
Else
Range("AD23") = Jour_depart * 1
Range("AE23") = jour_fin * 1
Range("B2").Select
End If
End If



Je sais qu'il y a moyen de faire une boucle, et qui permettrais d'avoir quelechose de beaucoup plus simple, mais je ne me souviens plus du tout comment faire ... Pire je me noie complétement dans les recherches que j'ai faites sur le sujet.


Merci d'avance, de vos réponses
 
Re : Besoin d'aide, boucle, et cellule n+1

bonjour,
bonjour Requin,


En essayant d'interpréter ce que ta macro me dit,

Cherche l'employe dans la plage AC21:ACXX (remplacer XX par le numéro de dernière ligne de recherche.

Code:
    [COLOR=blue]Dim[/COLOR] c [COLOR=blue]As[/COLOR] Range
    [COLOR=green]'Chercher employé dans la plage AC21:CAXX[/COLOR]
    [COLOR=blue]Set[/COLOR] c = Range([I]"AC21:ACXX"[/I]).Find(what:=employe, LookIn:=xlValues, lookat:=xlWhole, searchOrder:=xlByRows, MatchCase:=[COLOR=blue]False[/COLOR])
    [COLOR=blue]If[/COLOR] [COLOR=blue]Not[/COLOR] c [COLOR=blue]Is[/COLOR] [COLOR=blue]Nothing[/COLOR] [COLOR=blue]Then[/COLOR]
        [COLOR=green]'Supposer que l'[COLOR=blue]on[/COLOR] va renseigner les [COLOR=blue]dates[/COLOR] départ et fin[/COLOR]
        rep = vbYes
        [COLOR=green]'Si l'une ou l'autre est manquante demander le remplacement[/COLOR]
        [COLOR=blue]If[/COLOR] [COLOR=blue]Not[/COLOR] Range([I]"AD"[/I] & c.Row) = [I]""[/I] [COLOR=blue]Or[/COLOR] [COLOR=blue]Not[/COLOR] Range([I]"AE"[/I] & c.Row) = [I]""[/I] [COLOR=blue]Then[/COLOR]
            rep = MsgBox([I]"Congés déjà présent, voulez vous remplacer ? "[/I], vbYesNo, [I]"Modification ?"[/I])
        [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR]
        [COLOR=green]'si rep est toujour [I]"Oui"[/I][/COLOR]
        [COLOR=blue]If[/COLOR] rep [COLOR=blue]Then[/COLOR]
            Range([I]"AD"[/I] & c.Row) = Jour_depart * 1
            Range([I]"AE"[/I] & c.Row) = jour_fin * 1
        [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR]
    [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR]

Maintenant ce que ne dis pas ta macro c'est comment trouver employé.

A+
 
Dernière modification par un modérateur:
Re : Besoin d'aide, boucle, et cellule n+1

bonjour

est ce bien utile de garder tout les
Code:
Range("B2").Select
????

Cette ligne, me permet juste de centrer l'ecran sur le groupe de personne concernée.

En fait, j'ai 150 lignes employés, qui sont répartis dans un tableau général, qui me permet d'afficher une ligne de congés :

nom / Prénom / Date de debut de congé/ Date de fin de congé / jour de congé 1 / jour de congé 2, jouyr de congé 3 etc.
Cette ligne me permet d'incrementer un second tableau, afin de faire des lignes "colorés", pour avoir un visuel plus "pratique";

Mes employés sont différencier par type de client, ce qui donne 5 tableaux différents en fonction des types de clients, et des employés, me permettant de calculer mes besoins humain pour les périodes de congés scolaires.

J'espère être clair ....
 
Re : Besoin d'aide, boucle, et cellule n+1

bonjour,
bonjour Requin,


En essayant d'interpréter ce que ta macro me dit,

Cherche l'employe dans la plage AC21:ACXX (remplacer XX par le numéro de dernière ligne de recherche.

Code:
    [COLOR=blue]Dim[/COLOR] c [COLOR=blue]As[/COLOR] Range
    [COLOR=green]'Chercher employé dans la plage AC21:CAXX[/COLOR]
    [COLOR=blue]Set[/COLOR] c = Range([I]"AC21:ACXX"[/I]).Find(what:=employe, LookIn:=xlValues, lookat:=xlWhole, searchOrder:=xlByRows, MatchCase:=[COLOR=blue]False[/COLOR])
    [COLOR=blue]If[/COLOR] [COLOR=blue]Not[/COLOR] c [COLOR=blue]Is[/COLOR] [COLOR=blue]Nothing[/COLOR] [COLOR=blue]Then[/COLOR]
        [COLOR=green]'Supposer que l'[COLOR=blue]on[/COLOR] va renseingner les [COLOR=blue]date[/COLOR] départ et fin[/COLOR]
        rep = vbYes
        [COLOR=green]'Si l'une ou l'autre est manquante demander le remplacement[/COLOR]
        [COLOR=blue]If[/COLOR] [COLOR=blue]Not[/COLOR] Range([I]"AD"[/I] & c.Row) = [I]""[/I] [COLOR=blue]Or[/COLOR] [COLOR=blue]Not[/COLOR] Range([I]"AE"[/I] & c.Row) = [I]""[/I] [COLOR=blue]Then[/COLOR]
            rep = MsgBox([I]"Congés déjà présent, voulez vous remplacer ? "[/I], vbYesNo, [I]"Modification ?"[/I])
        [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR]
        [COLOR=green]'si rep est toujour [I]"Oui"[/I][/COLOR]
        [COLOR=blue]If[/COLOR] rep [COLOR=blue]Then[/COLOR]
            Range([I]"AD"[/I] & c.Row) = Jour_depart * 1
            Range([I]"AE"[/I] & c.Row) = jour_fin * 1
        [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR]
    [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR]

Maintenant ce que ne dis pas ta macro c'est comment trouver employé.
A+

Je ne comprend pas vraiement ce que vous voulez dire ?

Employe dans mon code, est une combobox, avec comme rowsource ma liste d'employé
 
Re : Besoin d'aide, boucle, et cellule n+1

Re,

D'accord, donc l'utilisateur cliques sur un élément de la liste. et il faut chercher cet element dans la plage de cellule 'Range("AC21:ACXX"), et si l'élément est trouvé, modifier éventuellement les Dates?

Si oui, teste ce que je t'ai donné.

Sinon, il faut être plus explicite.

Sans doute qu'un fichier exemple serait bienvenu, nous ne sommes pas devin.

A+
 
Dernière modification par un modérateur:
Re : Besoin d'aide, boucle, et cellule n+1

Re,

D'accord, donc l'utilisateur cliques sur un élément de la liste. et il faut chercher cet element dans la plage de cellule 'Range("AC21:ACXX"), et si l'élément est trouvé, modifier éventuellement les Dates?

Si oui, teste ce que je t'ai donné.

Sinon, il faut être plus explicite.

Sans doute qu'un fichier exemple serait bienvenu.

A+

J'essaierai d'envoyer mon fichier de mon domicile, car ici je suis bloqué pour uploader.
Mon code prend naissance au "clique" sur le bouton OK d'un suserform.

Le userform est composé de 3 listes combobox :

employe
jour_depart
jour_fin


J'ai essayé votre code, mais il plante, et reviens en mode debogage sur la ligne :
Set c = Range("AC21:ACXX").Find(what:=employe, LookIn:=xlValues, lookat:=xlWhole, searchOrder:=xlByRows, MatchCase:=False)

Tableau de donnée :
colonne AC : Nom des employé (Rowsource de la combox employe)
colonne AD : Jour de départ des congés
Colonne AE : Jour de fin des congés
connes AF à AU : Ligne de congés avec programmation Excel, me permettant d'afficher chaque jour de congés.

voici ce que j'avais imaginé en algo :

Si jour_fin<jour_depart alors
_____Message d'erreur
Sinon si jour_depart ou jour_fin non saisie alors,
_____message d'erreur
Sinon
_____Si congés déjà existant alors;
__________Proposer le remplacement
_______________Si remplacement accepter alors
____________________Remplacer
_______________Sinon
____________________Revenir au menu
_______________Fin si
_____Sinon
__________Ecrire congés dans Cellules ACXX et ADXX correspondant à l'employe
_____Fin si
Fin si
 
Dernière édition:
Re : Besoin d'aide, boucle, et cellule n+1

Re,

En lisant bien les réponses tu aurait vu que j'avais dis de changer XX dans ACXX par le dernier numéro de ligne dans laquelle la recherche doit se faire!!!!

J'ai essayé votre code, mais il plante, et reviens en mode debogage sur la ligne :
Set c = Range("AC21:ACXX").Find(what:=employe, LookIn:=xlValues, lookat:=xlWhole, searchOrder:=xlByRows, MatchCase:=False)

A+
 
Re : Besoin d'aide, boucle, et cellule n+1

Re,

En lisant bien les réponses tu aurait vu que j'avais dis de changer XX dans ACXX par le dernier numéro de ligne dans laquelle la recherche doit se faire!!!!



A+

Autant pour moi, j'essai de ce pas.
J'avais oublié que j'avais mon portable dans ma voiture, voici mon fichier.

je viens de tester, ca fonctionne impeccable, j'ai du par contre, changer légerement le code :

Private Sub OK_Click()

Dim c As Range
'Chercher employé dans la plage AC21:CAXX
Set c = Range("AC21:AC101").Find(what:=employe, LookIn:=xlValues, lookat:=xlWhole, searchOrder:=xlByRows, MatchCase:=False)
If Not c Is Nothing Then
'Supposer que l'on va renseingner les date départ et fin
rep = vbYes
'Si l'une ou l'autre est manquante demander le remplacement
If Not Range("AD" & c.Row) = "" Or Not Range("AE" & c.Row) = "" Then
rep = MsgBox("Congés déjà présent, voulez vous remplacer ? ", vbYesNo, "Modification ?")
If rep = vbYes Then
Range("AD" & c.Row) = Jour_depart * 1
Range("AE" & c.Row) = jour_fin * 1
vacances.Hide
Else
vacances.Hide
Menu.Show
End If

End If
'si rep est toujour "Oui"
If rep Then

End If
End If
End Sub

Merci encore de vos réponses.
 
Dernière édition:
- 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

Discussions similaires

Réponses
4
Affichages
550
Réponses
7
Affichages
621
Réponses
3
Affichages
584
Retour