Améliorer code VBA Classement automatique

Bonsoir,

Pour le classement automatique de mes données j'utilise ce code VBA :

Private Sub CommandButton1_Click()

On Error Resume Next

If Not Intersect(Target, Range("B:B")) Is Nothing Then

Range("B1").Sort Key1:=Range("B2"), _

Order1:=xlAscending, Header:=xlYes, _

OrderCustom:=1, MatchCase:=False, _

Orientation:=xlTopToBottom

End If

End Sub

L'inconvénient est que le classement se fait sur la colonne A et la colonne B ; j'aimerais qu'il se fasse sur la colonne B en prenant en compte les colonnes C à H.

Il ne faut en revanche surtout pas que le classement se fasse sur la colonne A.

Vous pourriez m'aider à compléter ce code ?

Merci de votre attention,

Bonne soirée !

Bonsoir,

ceci devrait être mieux :

Range("B:H").Sort Key1:=Range("B2"), 

Eh bien merci, je mettais B:H ici :

If Not Intersect(Target, Range("B:H")) Is Nothing Then

Du coup ça pouvait pas marcher...

Merci beaucoup !

Bonsoir,

Je rouvre ce sujet car ma requête est proche de la précédente.

J'ai toujours la même macro :

Private Sub CommandButton1_Click()

On Error Resume Next

If Not Intersect(Target, Range("B:B")) Is Nothing Then

Range("B:B").Sort Key1:=Range("B2"), _

Order1:=xlAscending, Header:=xlYes, _

OrderCustom:=1, MatchCase:=False, _

Orientation:=xlTopToBottom

End If

End Sub

Le traitement se fait actuellement uniquement sur la colonne B.

Comment faire pour qu'il se fasse également sur les colonnes H à N (sans impacter bien sur les colonnes A et C-F).

J'ai également une petite erreur... les données se classent bien dans l'ordre mais ne remontent pas en haut de la colonne.

En l'occurrence, les données proviennent d'une autre colonne (je les fait arriver sur cette colonne via cette formule ='Traitement saisie'!L:L) ; c'est très important car les données situées dans la colonne L de la feuille "traitement saisie" ne doivent pas être utilisées.

Sur la feuille "traitement saisie", les données apparaissent à partir de la ligne 12.

Dans la colonne B où j'applique la macro, les données sont classées de A à Z, mais restent cantonnées à la ligne 12 ; une idée pour qu'elle remontent en haut ? (cellule B2)

Merci encore !

En espérant ne pas avoir à envoyer de document allégé encore

Bonne soirée.

bonjour à tous

un fichier exemple de 4 colonnes et 5 lignes de données, ainsi que le résultat attendu serait parfait

En voici un !

Merci !

27exemple-03.xlsm (24.65 Ko)

Bonsoir

Comment faire pour qu'il se fasse également sur les colonnes H à N (sans impacter bien sur les colonnes A et C-F).

,

La méthode "Sort" ne fonctionnant pas sur des plages discontinues, une solution c'est :

1- de copier la colonne B en colonne O

2- d'effectuer un tri des colonnes à H à O avec pour clé la colonne O

3- de remettre à vide la colonne O

4- d'effectuer le tri sur la colonne B

ci-dessous code

Private Sub CommandButton1_Click()

    On Error Resume Next
    If Not Intersect(Selection, Range("B:B")) Is Nothing Then
        Columns("B").Copy Range("O1")
        Range("H:O").Sort Key1:=Range("O2"), Order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
        Columns("O").Clear
        Range("B:B").Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom
    End If
End Sub

NB : l'objet Target n'étant pas défini, il faut le remplacer par l'objet Selection

Si vous mettez Key1 en 2ème ligne, la 2ème ligne ne sera pas triée avec l'option Header:=xlYes

Dans la colonne B où j'applique la macro, les données sont classées de A à Z, mais restent cantonnées à la ligne 12 ; une idée pour qu'elle remontent en haut ? (cellule B2)

il suffit de modifier vos formules car en l'état actuel, elles ne peuvent qu'être le reflet exact de la feuille source :

='Feuille qui ne doit pas bouger'!B2

='Feuille qui ne doit pas bouger'!B3

……………………………………………………………

Bonsoir,

Merci beaucoup pour la réponse ; en effet, après test ça fonctionne, il reste donc le "problème" des données qui restent à leur place au lieu d'aller en haut. (Ici c'est pas problématique, mais dans le cas d'un document de dizaines de milliers de lignes, ça va m’embêter)

Ne sachant pas tellement coder en VBA, j'ai utilisé l'enregistreur de macro pour voir ce que ça donne.

Il s'avère que ça donne un bon résultat !

Je me suis basé sur les remarques que vous avez donné et ai opté pour un classement automatique dans une nouvelle feuille.

Le Drosophile a écrit : ↑Hier, 17:25

Dans la colonne B où j'applique la macro, les données sont classées de A à Z, mais restent cantonnées à la ligne 12 ; une idée pour qu'elle remontent en haut ? (cellule B2)

il suffit de modifier vos formules car en l'état actuel, elles ne peuvent qu'être le reflet exact de la feuille source :

='Feuille qui ne doit pas bouger'!B2

='Feuille qui ne doit pas bouger'!B3

Je suis obligé de conserver ces formules (du moins en l'état de mes connaissances) car elles reflètent le calcul d'une autre formule "RECHERCHEV" (elle même liée à des formules, liées des formules, liées à des formules, etc.).

J'ai été confronté à divers problèmes lorsque j'essayais de classer directement les données issues de la RECHERCHEV ; pour palier à ce problème j'ai juste créé un nouveau tableau qui fait renseigne les mêmes infos que celles données par les formules "RECHERCHEV" (peut-être est-ce brouillon, mais ça fonctionne bien !)

Voici le code qu'Excel me propose :

Private Sub CommandButton1_Click()

Sheets("Classement des données").Select

Cells.Select

Selection.ClearContents

Sheets("Correspondances").Select

Range("B:B,H:N").Select

Range("H1").Activate

Selection.Copy

Sheets("Classement des données").Select

Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _

:=False, Transpose:=False

Cells.Select

Application.CutCopyMode = False

ActiveWorkbook.Worksheets("Classement des données").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("Classement des données").Sort.SortFields.Add Key:= _

Range("A2:A1000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption _

:=xlSortNormal

With ActiveWorkbook.Worksheets("Classement des données").Sort

.SetRange Range("A1:H1000")

.Header = xlYes

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With

End Sub

Hélas, il trouve une erreur (bout de code surligné).

Il fonctionne 1 fois avec erreur, le second essai conduit à la disparition de toutes les données de la feuille...

Je vais essayer de trouver une solution.. mais je vais probablement revenir déposer un nouveau document Excel.

Bonne soirée / nuit.

A plus tard !

Bonsoir,

En fait, pour faire plus simple, est-ce que vous pourriez m'expliquer comment, via une macro (puisqu'il n'y a que cette alternative), comment copier les données des colonnes B, D, E, F, H, I, J, K, L, M et N de la feuille "Correspondances" vers la feuille "Classement des données" (qui est vide). Puis classer la colonne "E" (= colonne C dans la feuille "Classement des données") dans l'ordre croissant.

J'ai testé diverses macro, tenté d'écrire quelques lignes à partir de ce que j'ai pu apprendre ici et là sur internet, mais j'ai constamment la même erreur. D'ailleurs, j'ai pu lire que VBA ne gère pas bien la copie de données d'une feuille vers une autre et qu'il faut passer par un module. Quelle est la différence ?

Merci,

Bonne soirée !

Bonsoir,

Exemple de tri de colonnes discontinues:Dans le champ A2:E10, on veut trier A,B,D,E mais pas C

Sub TriColonnesDiscontinues()
  Set Rng = Range("A2:E10")
  n = Rng.Rows.Count
  Tbl = Application.Index(Rng, Evaluate("Row(1:" & n & ")"), Array(1, 2, 4, 5))
  Tri Tbl, 1, LBound(Tbl), UBound(Tbl)
  b = Application.Index(Tbl, Evaluate("Row(1:" & n & ")"), Array(1, 2))
  [a2].Resize(UBound(b), UBound(b, 2)) = b
  b = Application.Index(Tbl, Evaluate("Row(1:" & n & ")"), Array(3, 4))
  [d2].Resize(UBound(b), UBound(b, 2)) = b
End Sub

Boisgontier

Bonsoir,

Pour le classement automatique des colonnes j'ai ce code :

Private Sub CommandButton1_Click()

On Error Resume Next

If Not Intersect(Selection, Range("B:B")) Is Nothing Then

Columns("B").Copy Range("O1")

Range("H:O").Sort Key1:=Range("O2"), Order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom

Columns("O").Clear

Range("B:B").Sort Key1:=Range("B2"), Order1:=xlAscending, Header:=xlNo, Orientation:=xlTopToBottom

End If

End Sub

Ce qui pose surtout problème c'est la copie des colonnes B, D, E, F, H, I, J, K, L, M et N de la feuille "Correspondances" vers la feuille "Classement des données".

Concernant cette macro :

Sub TriColonnesDiscontinues()

Set Rng = Range("A2:E10")

n = Rng.Rows.Count

Tbl = Application.Index(Rng, Evaluate("Row(1:" & n & ")"), Array(1, 2, 4, 5))

Tri Tbl, 1, LBound(Tbl), UBound(Tbl)

b = Application.Index(Tbl, Evaluate("Row(1:" & n & ")"), Array(1, 2))

[a2].Resize(UBound(b), UBound(b, 2)) = b

b = Application.Index(Tbl, Evaluate("Row(1:" & n & ")"), Array(3, 4))

[d2].Resize(UBound(b), UBound(b, 2)) = b

End Sub

J'ai modifié une valeur pour voir comment réagissait le classement ; la colonne C s'est classée, les colonnes D et E ont affiché #VALEUR! et la colonne A ne s'est pas triée.

Merci d'avoir répondu,

Bonne soirée.

En fait, pour faire plus simple, est-ce que vous pourriez m'expliquer comment, via une macro (puisqu'il n'y a que cette alternative), comment copier les données des colonnes B, D, E, F, H, I, J, K, L, M et N de la feuille "Correspondances" vers la feuille "Classement des données" (qui est vide). Puis classer la colonne "E" (= colonne C dans la feuille "Classement des données") dans l'ordre croissant.

une solution :

    
    With Sheets("Classement des données")
        Sheets("Correspondances").Range("B:B,D:F,H:N").Copy .Range("A1")
        .Range("A:K").Sort Key1:=Range("C1"), Order1:=xlAscending, Header:=xlYes, Orientation:=xlTopToBottom
    End With

Oh bah super ! En 3 lignes tout fonctionne parfaitement

Merci beaucoup !

Rechercher des sujets similaires à "ameliorer code vba classement automatique"