Remplir un sous tableau automatiquement

Bonjour,

Non je n'ai pas fait de formation particulière et je n'ai pas de certification non plus

J'ai bien fait deux trois cours sur de la mise en forme conditionnelle vraiment basique en DUT mais rien de plus... J'apprends par moi-même avec le forum (j'ai pas vraiment d'autres choix en fait...)

Non je ne pense pas que tu devrais faire une autre feuille, je pense que tu devrais supprimer l'espace entre salariés et intérimaires et ajouter une colonne "type de contrat", tu mets CDI, intérim, et tu rajoutes cette colonne en critère de tri (on pourrait aller à la ligne en dessous par macro mais on n'aime pas trop corriger des défauts de fichier avec du code ou des formules...)

Ok je m'y emploi ...

Par contre c'est quoi la ligne de code a rajouter pour faire un tri par Type de contrat ?

Et meme j'y pense il faudra du coup une Imputbox pour le type de contrat car saura pas ou placer le nouvel employé ?

Bonjour,

En effet il faut aussi une inputbox pour demander CDI ou CDD

voici le fichier avec modifications :

Idem je n'arrive pas a ouvrir le fichier ... c'est bizarre ca.

Peux tu m'envoyer le code pour que je le recopie dans mes macro ?

Peut-être un problème windows / mac, je suis en version windows excel 2010...

Attention si tu veux utiliser mon code et que ça marche il faudra que tu aies aussi la même structure de fichier que moi

Je te passe donc le code:

Sub Nouvel_employe_CDICDD()
der_lig = Range("A4").End(xlDown).Row - 1
Rows(5).Insert Shift:=xlDown, CopyOrigin:=xlfromabove
Range("A5") = InputBox("Saisir le nom du nouvel employé.")
Range("B5") = InputBox("Quel est son type de contrat? (CDI/CDD)")

ActiveSheet.Sort.SortFields.Clear
ActiveSheet.Sort.SortFields.Add Key:=Range _
        ("B4:B" & der_lig + 1), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "CDI,CDD", DataOption:=xlSortNormal
ActiveSheet.Sort.SortFields.Add Key:=Range _
        ("A4:A" & der_lig + 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("PLANNING SALARIES").Sort
        .SetRange Range("A4:AJ" & der_lig + 1)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Et un aperçu écran:

capture

Et une explication du code:

En fait il s'agit d'un tri à plusieurs niveaux (on tri d'abord d'après le premier critère, puis l'autre, puis l'autre...), donc nous on met le tri d'après le type de contrat en premier, pour bien séparer CDI et CDD, ça se fait via la fonction "ActiveSheet.Sort.SortFields.Add"

La petite différence avec l'autre tri c'est qu'on utilise pas un simple tri de A à Z, on utilise un tri suivant une liste personnalisée, c'est pour ça qu'on a CustomOrder:= "CDI,CDD" qui vient s'ajouter aux critères de filtres, je veux d'abord les CDI, puis les CDD, comme sur le fichier initial

Le reste est identique, j'ai juste rajouté une Inputbox à un endroit

J'ai l'impression que je me suis trompé quelque part mais je sais pas ou ...

Ca fait des lignes en plus c'est bizarre ...

Voici le code :

Sub Nouvel_employé()

der_lig = Range("A5").End(xlDown).Row - 1

Rows(5).Insert Shift:=xlDown, CopyOrigin:=xlfromabove

Range("A6") = InputBox("Saisir le nom du nouvel employé.")

Range("C6") = InputBox("Quel est son type de contrat? (CDI/CDD ou Interim)")

ActiveSheet.Sort.SortFields.Clear

ActiveSheet.Sort.SortFields.Add Key:=Range _

("C5:C" & der_lig + 1), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _

"CDD/CDI", DataOption:=xlSortNormal

ActiveSheet.Sort.SortFields.Add Key:=Range _

("A5:A" & der_lig + 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _

xlSortNormal

With ActiveWorkbook.Worksheets("PLANNING SALARIES").Sort

.SetRange Range("A5:AI" & der_lig + 1)

.Header = xlGuess

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With

End Sub

et

capture d ecran 2018 10 18 a 15 31 14

Bonjour,

Sub Nouvel_employé()
 der_lig = Range("A5").End(xlDown).Row - 1
 Rows(6).Insert Shift:=xlDown, CopyOrigin:=xlfromabove 'ici ligne 6, pas 5
 Range("A6") = InputBox("Saisir le nom du nouvel employé.")
 Range("C6") = InputBox("Quel est son type de contrat? (CDI/CDD ou Interim)")

 ActiveSheet.Sort.SortFields.Clear
 ActiveSheet.Sort.SortFields.Add Key:=Range _
 ("C5:C" & der_lig + 1), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
 "CDD/CDI", DataOption:=xlSortNormal
 ActiveSheet.Sort.SortFields.Add Key:=Range _
 ("A5:A" & der_lig + 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
 xlSortNormal
 With ActiveWorkbook.Worksheets("PLANNING SALARIES").Sort
 .SetRange Range("A5:AI" & der_lig + 1)
 .Header = xlGuess
 .MatchCase = False
 .Orientation = xlTopToBottom
 .SortMethod = xlPinYin
 .Apply
 End With
 End Sub
 

A part ce que j'ai mis en commentaire tout me semble bon

Le soucis c'est que tu écrivais sur la ligne que tu venais de décaler vers le bas, et non sur la ligne vide qui se crée ensuite, du coup ça te donne forcément l'impression d'avoir une ligne en plus, c'est normal d'avoir une ligne en plus, mais pas normal d'écrire sur une ligne contenant déjà des données, maitenant qu'on bouge bien la ligne 6 en dessous, tu peux écrire sur la ligne 6 qui sera vide

Oui effectivement ca marche mieux.

Par contre j'ai vu que ca me copie pas les formules qui sont dans les cases.

Je peux le faire avec l'enregistreur ou pas ?

Le mieux pour copier les formules c'est peut-être de déclarer ton tableau dans le gestionnaire de noms en faisant Accueil -> mettre sous forme de tableau. Puis de refaire les formules en terme de références pour que ça te fasse des formules de tableau, après ça devrait automatiquement te mettre les formules à chaque ajout de ligne

C'est possible aussi d'y faire par macro mais bon, autant faire ça bien

Rechercher des sujets similaires à "remplir tableau automatiquement"