Tri automatique d'une zone excel dès que l'on change une valeure.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 044 fois - Téléchargée 28 fois

Contenu du snippet

Bonjour,
ce code permet d'effectuer un tri automatique dès que l'on modifie une valeur de la colone à trier.

Il suffit de mettre ce code dans la feuille et de renseigner les trois valeurs.
Cellule du début de la colone de tri.
Nombre de colones à prendre après la colone à trier.
Nombre de colones à prendre avant la colone à trier.

Je m'en suis servi pour garder les 25 meilleurs années pour le calcule de la retraite.

Source / Exemple :


Private Sub Worksheet_Change(ByVal Target As Range)
 Dim i As Integer 'indice de parcours de toutes les valeurs du trie
 Dim temp As String '
 Dim cell As Variant
 Dim lettreCellule As String
 Dim lettreColone As String
Dim nbColonesApres As Integer
Dim nbColonesAvant As Integer
Dim derCellule As String
Dim premCellule As String
  '''''''''''''''''''''''''''''''''''''à modifier'''''''''''''''''''''''
  '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  'cellule du début du trie
  cell = "D2"
  'nombre de colone apres la cellule pour le tri
  nbColonesApres = 3
   'nombre de colone avant la cellule pour le tri
  nbColonesAvant = 3
'''''''''''''''''''''''''''''''fin modification'''''''''''''''''''''''''''''''

 'colone où l'on effectue le trie
lettreColone = Mid(cell, 1, 1)
 
 'adresse de la cellule modifiée
 temp = ActiveCell.Address

'on récupere la lettre de la cellule modifiée
 lettreCellule = Mid(temp, 2, 1)
 
 'on regarde si l'on a modifié une valeur
 'de notre colone où on veut effectuer le tri.
 If lettreCellule = lettreColone Then
 
    'on compte le nombre de cellules jusqu'à ce que l'on en trouve une vide
    Range(cell).Select
    i = 0
    While ActiveCell.Offset(i, 0).Text <> ""
        i = i + 1
    Wend
 
 'on selection toute la zone
 premCellule = Range(cell).Offset(0, -nbColonesAvant).Address
 derCellule = Range(cell).Offset(i - 1, nbColonesApres).Address
 Range(premCellule & ":" & derCellule).Select
    
    
    'on trie notre séléction
   Selection.Sort Key1:=Range(cell), Order1:=xlAscending, Header:=xlNo, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

   
End If
End Sub

Conclusion :


Attention il faut qu'il y ait une cellule vide sous la dernière valeur de la colone à trier.

A voir également

Ajouter un commentaire

Commentaires

docjfnoel
Messages postés
1
Date d'inscription
mercredi 16 mai 2007
Statut
Membre
Dernière intervention
17 mai 2007

Bonjour,
Je suis néophite en programmation. C'est exactement la fonction que je cherche. Pourrait-on m'expliquer pas à pas comment la mettre dans mon tableur?
Merci
mortalino
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
Salut BPM12,

beh en fait son but dans sa boucle c'est de rechercher la première cellule vide.

Concernant ma fonction, DerLigne sera égale à la dernière ligne utilisée car la fonction Find recherche "", donc rien, donc cellule vide.
Tout ceci à partir de B65536 et en remontant.
Sachant que j'ai mis moins 1 à la fin, le résultat sera donc la dernière ligne utilisée.

Tu dis "Mais ensuite, tu as nothing en retour à un Find avec argument "" pour valeur recherchée"
>> beh non, si dans la colonne B, il n'y a aucune valeur, tu auras une erreur, facilement gérable, sinon, tu auras bien la derniere ligne utilisée.
Je t'invite à faire le test, place qques données dans la colonne B, et place même des cellules vides entre plusieurs :
Dim DerLigne

DerLigne = Sheets(1).Columns(2).Find("", [B65536], , , xlByRows, xlPrevious).Row - 1

Pour le Column, oui, c'est une faute d'orthographe.

Sinon, pour l'auteur de cette source, en me relisant j'y suis allé un peu fort sur un terme "ambigüe" :
Quand je dis "code inutile, ce n'est pas vraiment une source...", il faut entendre plutôt "source inutile, ce n'est pas vraiment une source... mais plutôt un snippet".

Exemple de qques snippets que j'ai déposé (et pas en source) :
http://www.codyx.org/snippet_rechercher-ligne-vide-dans-excel_205.aspx
http://www.codyx.org/snippet_rechercher-premiere-ligne-ou-colonne-vide-partir-cellule_206.aspx

@++
bpm12
Messages postés
10
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
28 octobre 2006

Mortalino,

As-tu pris le temps de vérifier ta proposition ?

Si elle fonctionne, dis nous comment?

En premier, ce n'est pas Column mais Columns (une faute de synthaxe est toujours excusable),
Mais ensuite, tu as nothing en retour à un Find avec argument "" pour valeur recherchée.

@+
mortalino
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
16
Salut,

code inutile, ce n'est pas vraiment une source....

De plus, ta boucle
While ActiveCell.Offset(i, 0).Text <> ""
i = i + 1
Wend
bouffe des resources pour rien :
il faut préférer :
DerLigne = Sheets(N°).Column(N°).Find("", [B65536], , , xlByRows, xlNext).Row - 1

Tout ton code est perfectible et là ça calcul même quand la mauvaise colonne est sélectionnée (perd du temps et des ressources).

Bref, t'as encore des choses à travailler...

++

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.