VBA copier une ligne d'une feuille à une autre - erreur
Bonjour,
J'ai un fichier de gestion de formation.
Sur une première feuille, on colle la liste du personnel. On appui sur un bouton et on obtient l'indication personnel formé ou non. Cela en comparant cette première liste avec la liste des personnes formées, tenue à jour à chaque formation.
Pour des raisons pratiques, je veux garder la liste des gens formés mais partis de l'entreprise. Toujours pour des raisons pratiques, cette liste est A PART de la liste du personnel encore présent (=feuille archive).
Mon problème: au lieu de me copier vers l'archive la liste des gens partis ( = "Non" en J sur feuille Personnel formé JR), ça me copie la deuxième ligne de la feuille Personnel formé JR. Je retourne ça dans tous les sens et je ne trouve pas la solution.
Je précise que je suis absolument complétement novice en vba et que j'ai bidouillé le fichier grâce à tous les forums excel!
Merci d'avance à ceux qui voudraient bien regarder mon fichier et voir où il pèche...
Salut et bienvenue sur le Forum,
Il me semble que tes macros sont gratuitement compliquées. Comme je n’ai pas compris pourquoi tu veux faire ce transfert des collaborateurs qui ne sont plus actifs sur la feuille d’archive à l’ouverture du fichier, j’ai placé un bouton sur la feuille ‘Personnel formé JR’ pour lancer cette mise à jour. On pourra toujours corriger par la suite si nécessaire.
Je te propose cette nouvelle macro ‘’ Mettre_à_jour’’ car je n’ai pas trop l’envie de mettre mon nez dans tes anciens codes.
Cordialement.
Merci beaucoup Yvouille !
Je vais aller voir ça, et essayer de comprendre la logique ! Oui, je suis sure que mes macros sont très compliquées, pour rien... j'espère m'améliorer avec le temps!!
Merci encore.
Jai regardé votre solution, mais cela suppose deux manipulations au lieu d'une, et enlève le "oui" ou "non" de l'état formation... hors j'en ai besoin pour des TCD liés...
J'ai essayé d'intégrer votre code au mien, sans succès... : j'ai remplacé le critère j = 0 par j "'Non", pourtant cela me coopie TOUTES les entrées dans l'archive
' on affecte les choix aux boutons
' tri liste personnel pour formation JR
Private Sub BoutonTriJR_Click()
' 1. on sort le personnel parti de la liste des formés
Sheets("Personnel formé JR").Select
Range("J2").FormulaR1C1 = _
"=IF(ISNA(MATCH(RC[+4],'Liste du personnel'!C[-2],0)),""Non"",""Oui"")"
' archivage du personnel parti
Dim i As Integer, j As Integer, DerLig_Personnel As Integer, DerLig_Archive As Integer
Application.ScreenUpdating = False
DerLig_Personnel = Range("N" & Rows.Count).End(xlUp).Row
DerLig_Archive = Sheets("Archive Personnel formé JR").Range("H" & Rows.Count).End(xlUp).Row
With Sheets("Liste du personnel")
For i = DerLig_Personnel To 2 Step -1
On Error Resume Next
j = Application.WorksheetFunction.Match(Range("N" & i), .Range("H:H"), 0)
If j = "Non" Then
Range("A" & i & ":N" & i).Cut
Sheets("Archive Personnel formé JR").Select
DerLig_Archive = DerLig_Archive + 1
Range("A" & DerLig_Archive).Select
ActiveSheet.Paste
Sheets("Personnel formé JR").Select
Rows(i & ":" & i).Delete Shift:=xlUp
End If
' j = 0
Next i
End WithSalut,
Je ne comprends pas que tu dises qu’avec ma solution il faut deux étapes, puisqu’il suffit de cliquer sur le bouton (1 étape) et le tour est joué.
J’ai enlevé les Oui et Non de la colonne J de la feuille ‘Personnel formé JR’ puisque toutes les personnes qui ne sont plus présentes dans la liste du personnel sont effacées de la feuille ‘Personnel formé JR’ et ne se retrouvent plus que sur la feuille ‘Archive Personnel formé JR’. Donc les personnes qui restent sur la feuille ‘Personnel formé JR’ auraient toutes le code ‘Oui’ dans la colonne J, ce qui ne représente plus aucun intérêt.
S’il ne fallait pas effacer les personnes ne faisant plus partie du personnel et leur attribuer le code ‘Non’ dans la colonne J de la feuille ‘Personnel formé JR’, fais-le-moi savoir.
Avec ton instruction If j = "Non" Then, tu joues un peu à l’apprenti sorcier. Fais gaffe que la marmite ne t’explose pas à la figure
Dans la déclaration des variables, tu vois que la variable j est un Integer, donc un chiffre de – 32000 à + 32000 environ. Ca ne peut donc pas être un texte. Ensuite l’instruction d’avant j = Application.WorksheetFunction.Match(Range("N" & i), .Range("H:H"), 0) cherche la position d’une variable à l’intérieure d’une plage. Ca peut donc être la ligne 1, la ligne, 2, la ligne 3, etc., mais en aucun cas la ligne ‘Non’.
Amicalement.
Oui, clairement je bidouille un peu n'importe comment... et encore ça c'est un fichier simple... j'en ai un autre qui ferait hurler d'horreur tous les membres de ce forum!
Quand je dis deux étapes, c'est qu'il faut: 1. - trouver la liste des gens à former en cliquant sur ma boîte
2 - extraire les gens partis grace à ton bouton.
J'aimerai qu'un seul clic permette les deux actions.
Salut,
Dans le fichier ci-joint, j’ai rajouté deux lignes tout à la fin de à ton code ‘’ BoutonTriJR_Click’’. La prière instruction Unload Me referme ton UserForm et la deuxième Call Mettre_à_jour appelle mon code à la suite du tien.
Mon bouton a également été supprimé.
Je ne comprends toujours pas que tu appelles ces codes systématiquement à chaque ouverture de ton fichier et non pas ‘’au besoin’’.
Amicalement.
Merci beaucoup et désolée pour la réponse tardive!!!
Ca à l'air d'être parfait, c'est super!
Je le lance dès l'ouverture pour "simplifier" la tache des autres personnes qui l'utilisent... mais c'est peut-être pas une bonne solution en effet... disons que sur la version complète il y a en plus les instructions d'utilisations sur le formulaire qui s'ouvre.
Merci encore!!