Déplacement ligne par ligne d'un tableau sur un autre
Voici une belle réalisation qui permet de progresser à plusieurs titres avec ce sujet
- Les macros qui se déclenchent sur la saisie d'une donnée dans une cellule sont très intéressantes pour éviter de répéter des manipulations simples.
- Les titres des tableaux comportent des comptages intégrés dans le texte.
- Les mises en forme sur une cellule se font sur toute la ligne concernée.
Je vais expliquer tout ce que j'ai compris mais en profiterais pour demander un éclaircissement de certains points.
LA MACRO
1- Le fonctionnement de la macro sur Excel: la saisie d'un des chiffres des classes d'affectation (1,2,3) permet la recopie des données et format dans la bonne classe. La modification du chiffre dans la classe d'affectation permet de la réaffecter dans une autre des 3 classes en supprimant les données et format de la classe d'avant. Enfin, la suppression du chiffre dans une des 3 classes d'affectation permet de remettre la ligne dans les données de départ , en dernière ligne.
2-La décomposition de la macro vba:
les commentaires sont en vert dans le pdf et les décalages (if-end if) sont plus visilbles dans le vba du fichier.
La macro se déclenche à la saisie sur une cellule grâce à l'évènement Private Sub Worksheet_Change(ByVal Target As Range)
Private Sub Worksheet_Change(ByVal Target As Range)
'Déclaration des variables
Dim CelFind As Range, CelCut As Range
Dim ColCut As Long, LigCut As Long
Dim Lig As Long
' Sortir au cas ou : 2 questions :
If Target.Count > 1 Then Exit Sub 'Sélection de plus d'une cellule, on sort
'Comment atteindre le nombre de colonnes 105k de la feuille ?
If Target.Rows.Count = ActiveSheet.Rows.Count Then Exit Sub
'pareil pour le nombre de colonnes, 16k ?
If Target.Columns.Count = ActiveSheet.Columns.Count Then Exit Sub
If Target.Row < 4 Then Exit Sub 'si on clique avant la ligne 4 on sort
' Si saisie dans la colonne Classe (col H Q Z AI) end if en fin de page
If Cells(2, Target.Column) = "Classe" Then
Lig = Target.Row 'Récupére le numéro de ligne
' contrôle saisie d'une classe
If Target.Value <> "" Then
If Not IsNumeric(Target) Or Target.Value > 3 Then
MsgBox "La saisie doit être un chiffre de 1 à 3"
Exit Sub
End If
'recherche Celfind en ligne1: what= N° classe d'arrivée
'utilisation de set, fonctionne aussi avec seulement Set CelFind = Rows("1:1").Find(What:="Classe " & Target.Value..Des explications sont nécessaires sur le reste ;)
Set CelFind = Rows("1:1").Find(What:="Classe " & Target.Value, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False)
If Not CelFind Is Nothing Then 'si un chiffre a été saisit
' Désactiver les évènements
Application.EnableEvents = False
Réponse :
LookIn:=xlValues => permet de rechercher par valeur, on peut avoir aussi xlformulas pour rechercher dans les formules
LookAt:=xlPart => permet de rechercher une partie de la valeur, xlWhole effectue une recherche sur la totalité
SearchOrder:=xlByColumns => permet d'effectuer la rechercher de gauche à droite : par colonne
MatchCase:=False => permet de ne pas tenir compte des majuscules/minuscules
SearchFormat:=False => indique qu'on ne recherche pas un format particulier
'Mouvements de ligne
'Couper de colA (H-7) à H
Set CelCut = Range(Cells(Lig, Target.Column - 7), Cells(Lig, Target.Column))
ColCut = CelCut.Column: LigCut = CelCut.Row 'ColCut =1ére colonne départ
' Déplace la ligne dans la classe, à la ligne suivant la dernière ligne
Range("A" & Lig & ":H" & Lig).Cut Destination:=CelFind.Cells(Rows.Count).End(xlUp).Offset(1, 0)
Range("A" & Lig & ":H" & Lig).Resize(1, 8).Delete Shift:=xlUp
' Réactiver les évènements
Application.EnableEvents = True
End If
'Si on supprime le numéro de classe
ElseIf Target.Value = "" And Target.Column <> 8 Then 'touche suppr sauf en col.H
' Désactiver les évènements
Application.EnableEvents = False
' Remettre la ligne dans les premières colonnes
Set CelCut = Range(Cells(Lig, Target.Column - 7), Cells(Lig, Target.Column))
ColCut = CelCut.Column: LigCut = CelCut.Row 'ColCut =1ére colonne départ
' Déplace la ligne dans la classe, à la ligne suivant la dernière ligne
CelCut.Cut Destination:=Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
Cells(LigCut, ColCut).Delete Shift:=xlUp
' réactiver les évènements
Application.EnableEvents = True
End If
End If
End Sub
LES TITRES
Est donné par la formule: =" CM1-CM2 "&CAR(10)&NB.SI(D4:D481;"M")&" garçons - "&NB.SI(D4:D481;"F")&" filles"&CAR(10)&NB.SI(E4:E481;"Nationalité1")&" Nationalite1 "&NB.SI(E4:E481;"Nationalité2")&" Nationalite2 - "&NB.SI(E4:E481;"Nationalité3")&" Nationalité3"
Les & lient les différentes parties.
" CM1-CM2 " est le texte saisit et on le lie à un retour à la ligne avec CAR(10)
NB.SI(D4:D481;"M") compte le nombre de garçons entre D4 et D481, et on lie avec le texte &" garçons - " :
&NB.SI(D4:D481;"F") compte le nombre de filles entre D4 et D481, et on lie avec le texte &" filles - " : , puis avec un retour à la ligne &CAR(10)
&NB.SI(E4:E481;"Nationalité1") compte le nombre de nationalités1 en colonne E et le lie avec &" Nationalite1 "
&NB.SI(E4:E481;"Nationalité2") compte le nombre de nationalités2 en colonne E et le lie avec &" Nationalite2 "
&NB.SI(E4:E481;"Nationalité3") compte le nombre de nationalités3 en colonne E et le lie avec &" Nationalite3 "
LES MISES EN FORME
Pour une mise en forme sur toute la ligne de la cellule concernée, il faut :
Sélectionner la 1ere ligne du tableau.
Faire CTRL + SHIFT + flêche vers le bas, 2 fois
Dans le menu de la mise en forme conditionnelle, choisir la ligne d'entrer une formule.
Saisir $D4= "F" et sélectionner la couleur rose en format
Refaire la procédure avec :
Saisir $D4= "M" et sélectionner la couleur bleu en format
L'explication en vidéo en détail à la 8ème minute
Cela dit ce déplacement de ligne me fait penser au fichier que j'ai fait pour affecter des places de parking
explicatif en pdf
D_placement_ligne_par_ligne_sur_un_tableau_annexe
Fichier Excel
goglich_constit_classes_cm2_fronck