Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Applications Excel de Franck
11 juin 2023

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

  1. 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.
  2. Les titres des tableaux comportent des comptages intégrés dans le texte.
  3. 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.

image

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

image

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

image image

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

 

Publicité
Publicité
Commentaires
Pages
Publicité
Applications Excel de Franck
Archives
Derniers commentaires

4

Visiteurs
Depuis la création 3 720
Publicité