En VBA: Tri selon En-tête dont la place peut varier

Bonjour

Voilà apres plusieurs recherches sur les forums, je n'ai pas trouvé ce que je cherche malheureusement. Je ne doute pas qu'en faisant appel à vos services, je vais pouvoir trouver mon bonheur.

J'ai 2 problématiques:

1/ Je souhaite faire un tri selon le "Numéro d'article" qui est dans la colonne C de mon tableau en PJ.

Or comme les requetes provenant de l'ERP peuvent differer, la colonne "Numéro d'article" peut varier. C'est à dire ne pas forcément se trouver en colonne C.

J'ai donc fait une recherche sur le "Numéro d'article" et j'ai identifié la colonne où il se rouve dans une variable que j'ai appelé PUI.

J'ai ensuite fait un tri par apprentissage, que j'ai adapté avec la variable Pui.

Ca ne semble pas marcher.

Je précise que les tris doivent se faire sur le "Numéro d'article" mais que la totalité de la ligne doit bougé lors du tri avec toutes les données qui s'y trouvent. C'est à dire qu'on garde la totalité du contenu de la ligne une fois le tri réalisé.

2/ De plus, je fais un tri sur une plage allant de 1 à 5000. Peut on faire un tri sur la totalité des lignes actives, car si j'ai plus de 5000 lignes actives;, je risque de ne pas faire le tri sur la totalité des lignes actives (bien que ce soit peu probable, mais on ne sait jamais)

N'hésitez pas si vous avez des questions

Merci d'avance pour votre aide

Ci dessous la macro Tri, qui est aussi dans le fichier joint

Sub Tri()

Dim Pui

Cells.Find(What:="Numéro d'article", After:=ActiveCell, LookIn:= _

xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _

xlNext, MatchCase:=False, SearchFormat:=False).Activate

Pui = ActiveCell.Column

ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("Pui2:Pui1460" _

), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Feuil1").Sort

.SetRange Range("A1:V5000")

.Header = xlYes

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With

Range("A2").Select

End Sub

18classeur1.xlsm (17.32 Ko)

Bonsoir,

tiens un exemple :

Sub tri2()
  Dim sh As Worksheet ' création d'une variable permettant de définir facilement la feuille à traiter ..
  Dim cPui As Range
  Dim rPlageAtrier As Range
  Const COLONE_TRI = "Numéro d'article" 'Entête colonne tri
  Set sh = ThisWorkbook.Worksheets("Feuil1")
  ' Recherche entmete

  On Error Resume Next 'au cas ou la colonne n'existe pas
   Set cPui = sh.Rows(1).Find(What:=COLONE_TRI, After:=sh.Cells(1, 1), LookIn:= _
        xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
        xlNext, MatchCase:=False, SearchFormat:=False)
  On Error GoTo 0
  If cPui Is Nothing Then
        MsgBox "Entête colonne [" & COLONE_TRI & "] introuvable", vbCritical
        Exit Sub
  Else
       Set rPlageAtrier = sh.Cells(1, 1).CurrentRegion
       rPlageAtrier.Sort Key1:=cPui, Order1:=xlAscending, Header:=xlYes, SortMethod:=xlPinYin

  End If
End Sub

Bonjour,

Je te propose cette procédure à enregistrer dans ton classeur de macros personnelles (PERSONAL.xlsb).

Tu crées ensuite un bouton dans la barre d'accès rapide pour la lancer.

Cette procédure sera alors disponible dès l'ouverture d'Excel.

Pour résumer, on crée un tableau, avec en-têtes de colonnes. On n'a donc pas besoin de chercher la bonne colonne.

Dans le fichier joint, pour l'exemple, faire ALT F8 et exécuter la procédure SortData.

Cdlt.

13classeur1.xlsm (17.74 Ko)
Option Explicit

Public Sub SortData()
Dim wb As Workbook
Dim ws As Worksheet
Dim lo As ListObject

    Application.ScreenUpdating = False
    Set wb = ActiveWorkbook
    Set ws = wb.Worksheets(1)
    Set lo = ws.ListObjects.Add(xlSrcRange, ws.Cells(1).CurrentRegion, , xlYes)
    With lo
        .Sort.SortFields.Add .ListColumns("Numéro d'article").DataBodyRange, _
                xlSortOnValues, xlAscending, xlSortNormal
        .Sort.Apply
        .Sort.SortFields.Clear
    End With

    Set lo = Nothing: Set ws = Nothing: Set wb = Nothing

End Sub

Bonjour Jean Eric

Tout d'abord merci pour ta reponse rapide

Je ne suis pas sur d'avoir bien compris le principe. Est ce que tu auras l'amabilité de m'expliquer la demarche stp, c'est pour ma gouverne?

Pourquoi le fait de créer un tableau n'engendre pas qu'il faille trouver la colonne ou se situe le numero d'article?

Est ce qu'en fait, le fait ce créer un tableau, labelise chaque première ligne et qu'il est facile de retrouver ce lable une fois qu'il est dans un tableau plutot que dans une sheet?

Merci à vous tous

C'est super!

Bonjour,

Si ton sujet est clos et a obtenu une bonne réponse pour toi, peux tu le valider en cliquant sur le petit bouton vert ?

Est ce que c'est bon maintenant?

Nop, je ter joins une photo que quelqu'un a fait

resolu 4 1

La ce devrait etre bon?

C'est parfait !!

Merci, tu comprends ça permet de ne pas revenir dessus si le sujet est clos

good

N'hésites pas à revenir pour d'autres questions

Ok merci

Bonjour,

Désolé de na pas t'avoir donné les informations demandées.

Mais je suis en plein dans les comptes de ma copropriété et prépare une AG...

Si tu suis encore ce sujet, clos, je reviendrai vers toi rapidement.

Cdlt.

Rechercher des sujets similaires à "vba tri tete place varier"