Retrouver le tri original d'un tableau grâce à une colonne de numérotation
Bonjour,
Je me permet d'ouvrir un nouveau sujet car je n'en ai pas trouver qui parle d'une problématique similaire à la mienne.
Intro:
J'ai un tableau qui ressemble en version simplifié à celui ci-dessous (Tableau original : 796 lignes par 9 colonnes):
Il n'y a pas de logique informatique dans la chronologie des lignes, mais il est important que leur placement dans le tableau reste ainsi. Pour l'explication du problème, on va appeler ce tri "aléatoire original"
Ce tableau est consulté par plusieurs utilisateurs
Pour retrouver les informations, les utilisateurs peuvent filtrer ou trier par colonne.
Des utilisateurs ont aussi la possibilité de modifier ce document et d'ajouter des lignes que ce soit en fin de tableau ou au milieu de celui-ci. Il est arrivé fréquemment, lors de l'enregistrement du document par un utilisateur, qu'un tri sur une colonne soit resté actif et, après enregistrement il est ensuite impossible de revenir au tri "aléatoire original".
Je veux ajouter une colonne numérotée pour pouvoir retrouver le tri "aléatoire original".
Solution N°1 et sa problématique:
J'ajoute simplement une colonne avec des chiffres, statique, sans formules ou marcos.
Mais lorsqu'un ligne est ajoutée au milieu du tableau, il faut renuméroter cette ligne et ainsi que toutes les suivantes (tirer la numérotation tout en bas (800 lignes)).
Solution N°2 et sa problématique:
J'ajoute une numérotation dynamique. (J'ai testé les différents types ci-dessous):
Quand on ajoute une ligne au milieu du tableau, la numérotation s'incrémente =>bien
Mais lorsqu'un tri est appliqué, la numérotation se met à jour. Le numéro "2" n'est plus attribué à la ligne N°2 du tri de base "aléatoire original".
Il y a-t-il un moyen d'incrémenter la numérotation automatiquement lorsqu'une ligne est ajoutée,
tout en gardant les numéros liées à leurs lignes quand on applique un tri?
1. de préférence sans macros (je ne maîtrise pas)
2. avec une macro
Merci d'avance pour vos réponses
J'espère avoir été assez clair et ne pas vous avoir perdu en route
Bonjour,
En désactivant le calcul automatique des formules, elles ne devraient pas s'actualiser au moment du tri, mais cela risque d'être pénible pour tout autre utilisation d'Excel...
Sinon, ce sera une macro. Peux-tu joindre ton exemple au format ".xlsx" que je ne perde pas de temps à le reproduire, ce qui nous permettra ensuite de te proposer des codes.
Merci pour la réponse rapide!!!
Effectivement désactiver le calcul automatiques des formules pourraient être une solution.
Mais il faudrait ne pas oublier de réactiver le calcul à l'ajout d'une ligne, etc.
Les autres utilisateurs ont déjà de la peine à se souvenir d'enlever les tris avant d'enregistrer… je doute que ça soit la solution idéale.
Si vous avez une solution automatisé avec une macro, je suis preneur!
Ci-joint le fichier exemple.
Il serait peut-être préférable de travailler directement sur le fichier original, mais je ne veux pas trop qu'il soit accessible à n'importe qui.
Merci d'avance pour votre aide
Une solution en macro (elle se déclenche automatiquement en cas de modification sur la feuille concernée) :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("Tableau1")) Is Nothing Then 'Si la cellule modifiée fait partie du tableau
'Si l'ID est vide, on affecte l'ID max + 1 à la ligne
If IsEmpty(Range("A" & Target.Row)) Then Range("A" & Target.Row) = Application.Max(Range("Tableau1[ID]")) + 1
End If
End SubJ'ai au préalable transformé tes données en tableau structuré (infos complémentaires ici).
Ton fichier modifié :
C'est déjà top, merci mais...
Je m'explique:
1. Si j'ajoute une ligne au milieu du tableau, la cellule "A" & target.row prend la valeur max de la colonne [ID] et pas la valeur ("A" & target.row -1)+1
Et donc le jour ou je trie du plus petit au plus grand la colonne ID, (pour récupérer, si quelqu'un a enregistré avec un tri), cette ligne ne va pas rester à sa bonne position mais se retrouver au fond du tableau.
2. Si je modifie le code comme suit:
Ca fonctionne pour cette ligne, mais les lignes suivantes ne sont pas renumérotées, incrémentées.
2.1 Même si j'arrive a coder correctement une boucle pour renuméroter les suivants:
(oui je n'ai jamais fait de macros et je suis nul
….il ne faut pas que la renumérotation se fasse si un tri est actif.
Est ce qu'il y a pas un moyen tout simplement d'interdire l'enregistrement du document si un tri est actif ?
Merci pour le temps consacré
Il suffit de modifier la plage de la fonction max pour la limiter du début du tableau à la ligne en cours. Mais le problème est que si l'ID est présent plus bas dans le tableau, on aura alors des doublons... Du coup, cette colonne perd de son intérêt !
Aussi, avec cette méthode, il ne devrait jamais y avoir plusieurs lignes sans ID, puisqu'il est automatiquement ajouté à chaque modification.
Enfin pour l'enregistrement, il suffit d'ajouter une macro liée à l'enregistrement et/ou la fermeture afin de trier le tableau sur l'ID à ce moment.
Nouvel essai :
Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
Dim i As Long, Rech As Range
If Not Intersect(Target, Range("Tableau1")) Is Nothing Then 'Si la cellule modifiée fait partie du tableau
'Si l'ID est vide, on affecte l'ID max des lignes précédentes + 1
If IsEmpty(Range("A" & Target.Row)) Then
Application.EnableEvents = False
Range("A" & Target.Row) = Application.Max(Range("A1:A" & Target.Row)) + 1
'Parcourir les ID du max de tout le tableau jusqu'à celui que l'on vient d'ajouter
For i = Application.Max(Range("Tableau1[ID]")) To Range("A" & Target.Row) Step -1
'Si on trouve cette idée sur les lignes suivantes, on lui ajoute 1 (évite les ID en doublon)
Set Rech = Range("Tableau1[ID]").Find(i, Target, LookIn:=xlValues, LookAt:=xlWhole)
If Not Rech Is Nothing Then Rech = Rech + 1
Next i
Application.EnableEvents = True
End If
End If
End Sub