XL 2016 Inserer ligne dans une feuille et trier toutes les feuilles d'un classeur

jalucyne

XLDnaute Occasionnel
Bonjour aux membres du forum,
Comment dans un classeur :
1) insérer un nouveau nom dans chaque feuille à partir de la feuille liste de Noms?
2) Effectuer un tri Alphabétique dans Liste de noms ET trier toutes colonnes de toutes les autres feuilles du classeur?
Sans doute macro tris….
(Fichier joint noms fictifs)
 

Pièces jointes

  • Inserer ligne dans chaque feuille sans affecter le resultat.xlsx
    135.1 KB · Affichages: 27

job75

XLDnaute Barbatruc
Bonjour jalucyne,

Prenez votre temps et tâchez de comprendre ces 2 macros dans ThisWorkbook :
Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim P As Range
If Sh.ListObjects.Count Then Set P = Sh.ListObjects(1).Range _
    Else Set P = Sh.[A5].Resize(Sh.UsedRange.Rows.Count, Sh.Cells(5, Sh.Columns.Count).End(xlToLeft).Column)
If Intersect(Target, P.Resize(, 2)) Is Nothing Then Exit Sub
Application.EnableEvents = False 'désactive les évènements
P.Sort P(1), xlAscending, Header:=xlYes 'tri alphabétique
On Error Resume Next 'si aucune SpecialCell
Intersect(P.Offset(2).Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow, P).Delete xlUp 'supprime les noms vides
If P(2, 1) = "" Then P.Rows(2).SpecialCells(xlCellTypeConstants).ClearContents 'traitement particulier de la 2ème ligne
On Error GoTo 0
P.RemoveDuplicates Array(1, 2), Header:=xlYes 'supprime les doublons
Application.EnableEvents = True 'réactive les évènements
With Sh.UsedRange: End With 'actualise la barre de défilement verticale
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim t, d As Object, i&, P As Range, derlig&, x$, s
'---liste des noms et prénoms (avec séparateur)---
With Sheets("Liste Noms")
    If Sh.Name = .Name Then Exit Sub
    If .ListObjects.Count Then t = .ListObjects(1).Range.Resize(, 2) _
        Else t = .[A5].Resize(.UsedRange.Rows.Count, 2) 'matrice, plus rapide
    Set d = CreateObject("Scripting.Dictionary")
    For i = 2 To UBound(t)
        If t(i, 1) <> "" Then d(t(i, 1) & Chr(1) & t(i, 2)) = ""
    Next
End With
'---traitement de la feuille activée---
If Sh.ListObjects.Count Then Set P = Sh.ListObjects(1).Range Else _
    Set P = Sh.[A5].Resize(Sh.UsedRange.Rows.Count, Sh.Cells(5, Sh.Columns.Count).End(xlToLeft).Column)
derlig = P.Rows.Count
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
For i = 2 To derlig
    x = P(i, 1) & Chr(1) & P(i, 2)
    If d.exists(x) Then d.Remove x Else P(i, 1) = ""
Next
If d.Count Then
    t = d.keys
    For i = 0 To UBound(t)
        s = Split(t(i), Chr(1))
        P(derlig + i + 1, 1) = s(0)
        If UBound(s) Then P(derlig + i + 1, 2) = s(1)
    Next
End If
'---mise à jour---
Workbook_SheetChange Sh, P 'lance la macro
End Sub
Fichier joint.

Remarques :

- il ne faut pas créer de liaisons entre la 1ère feuille et les autres pour les noms et prénoms

- pour les 3 dernières feuilles (Rdv) il faut du texte en AG5 pour que la colonne AG soit traitée.

A+
 

Pièces jointes

  • Inserer ligne dans chaque feuille sans affecter le resultat(1).xlsm
    147.1 KB · Affichages: 15
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour jalucyne, le forum,

Je viens de modifier le code du fichier précédent, en particulier pour le traitement de la 2ème ligne.

Par ailleurs dans ce fichier (2) j'ai ajouté une MFC sur les colonnes A:AG des 3 dernières feuilles (Rdv).

En effet leurs tableaux ne sont pas organisés en tableau Excel, la MFC colore les lignes.

Bonne journée.
 

Pièces jointes

  • Inserer ligne dans chaque feuille sans affecter le resultat(2).xlsm
    146.9 KB · Affichages: 21
Dernière édition:

job75

XLDnaute Barbatruc
Re,

Je viens encore de modifier le code de mes fichiers (1) et (2) aux posts #2 et #4, utilisez le dernier code...

Pour ce qui est de ceci :
Oups…. Re bonjour Job75, dans le fichier initial il y a 3 feuilles d'explication des contenus: Notice, Liste Cptences, Maitr.Satisf.
Si je les insère cela bug….
Problème?
Amicalement
Jalucyne
c'est enfantin, insérez au début de chacune des 2 macros cette ligne de code :
Code:
If Sh.Name = "Notice" Or Sh.Name = "Liste Cptences" Or Sh.Name = "Maitr.Satisf." Then Exit Sub
A+
 

jalucyne

XLDnaute Occasionnel
Re ,Désolé de te déranger Job75, en suivant ta proposition (Alt F11) j'arrive à cette page ….vide...
upload_2018-9-10_12-25-46.png
upload_2018-9-10_12-25-46.png
 

jalucyne

XLDnaute Occasionnel
Re OUPS….
Visiblement il faut que je trouve une formation VBA....
Je suis plus à l'aise sans les Macros….
Bon j'ai trouvé la bonne page, il suffisait d'être plus attentif aux conseils de Job75.
Je lui présente mes excuses.
Mais maintenant suivant ses instructions:

Insérez au début de chacune des 2 macros cette ligne de code :
Code (Text):
If Sh.Name = "Notice" Or Sh.Name = "Liste Cptences" Or Sh.Name = "Maitr.Satisf." Then Exit Sub

Ok, j'ai testé au début de la page….mais création d'erreur, j'avoue ne pas trouver avant quelles phrases coller.
En espérant ne pas être trop insistant.
Cordialement
Jalucyne
PS: Incompétent ne me gène pas mais insistant me generait beaucoup vis à vis de vous tous
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 811
dernier inscrit
caroline29260