Range Plage Relative

Bonjour,

Dans un tableau j'effectue un tri sur les noms grâce à la macro suivante :

Sub Tri_Par_Noms()

'

' Tri_Par_Noms Macro

'

' Touche de raccourci du clavier: Ctrl+Maj+Y

Range("A5:L717").Select

ActiveWorkbook.Worksheets("Feuille des Engagements").Sort.SortFields.Clear

ActiveWorkbook.Worksheets("Feuille des Engagements").Sort.SortFields.Add Key _

:=Range("B5:B717"), SortOn:=xlSortOnValues, Order:=xlAscending, _

DataOption:=xlSortNormal

With ActiveWorkbook.Worksheets("Feuille des Engagements").Sort

.SetRange Range("A5:L717")

.Header = xlGuess

.MatchCase = False

.Orientation = xlTopToBottom

.SortMethod = xlPinYin

.Apply

End With

Range("C4").Select

End Sub

Tout va bien tant que je n'insère aucune ligne dans le tableau. Dés une insertion, je dois modifier manuellement la macro : Range("A5:L717")Select devient Range("A5:L718") ... etc. Il en est de même pour B5:B717 et A5:B717.

Question : comment rendre la modification de la macro automatique en fonction de l'insertion de lignes dans le tableau

Merci d'avance.

P.S. Je suis quasi nul en VBA, mais ça tout le monde l'avait compris

Bonjour Krist-Rider,

Voici un essai:

Sub Tri_Par_Noms()
Dim ws As Worksheet
'
' Tri_Par_Noms Macro
'
' Touche de raccourci du clavier: Ctrl+Maj+Y

    Set ws = Sheets("Feuille des Engagements")
    derlgn = ws.Range("A" & Rows.Count).End(xlUp).Row

    ws.Range("A5:L" & derlgn).Select

    ws.Sort.SortFields.Clear
    ws.Sort.SortFields.Add Key _
    :=ws.Range("B5:B717"), SortOn:=xlSortOnValues, Order:=xlAscending, _
    DataOption:=xlSortNormal

    With ws.Sort
        .SetRange Range("A5:L" & derlgn)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ws.Range("C4").Select
End Sub

Bonjour Florian,

Merci pour l'efficacité !!!

Je n'ai pas encore testé mais j'ai une question : dans ta macro, est-ce que l'expression Range("B5:B717") ne doit pas être modifiée également en Range("B5:B" & derlgn), à l'instar des autres ?

Cordialement

Si dsl c'est un oubli de ma part

Bonjour,

Une autre proposition à étudier.

Cdlt.

Public Sub SortByNames()
Dim lastRow As Long
Dim Rng As Range
Const lRow As Long = 5
    With Worksheets("Feuille des Engagements")
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set Rng = .Cells(lRow, 1).Resize(lastRow - lRow + 1, 12)
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=Rng(1, 2)
            .SetRange Rng
            .Header = xlYes
            .Apply
        End With
        .Cells(4, 3).Select
    End With
End Sub

Bonjour Jean-Eric

Bonjour Florian53,

Pour Jean-Eric : erreur 1004 sur la ligne : Set Rng = .Cells(lRow, 1).Resize(lastRow - lRow + 1, 12)

Mon faible niveau en VBA ne me permet pas de corriger !

Pour Florian53 : j'ai modifié l'expression Range("B5:B717") par Range("B5:B" & derlgn) et la macro fonctionne, mais uniquement si j'ai des données dans la colonne A. Or, il se trouve que les cellules de la colonne A peuvent contenir ou pas des données. Bien évidemment, pour les cellules qui contiennent des données, elles doivent être triées. Je joins un petit fichier d'exemple : si la colonne A est renseignée cela fonctionne. En fait, je souhaite effectuer le tri même dans le cas ou la colonne A est vide ou partiellement renseignée.

Encore merci à vous

Cordialement

5classeur1.xlsm (85.23 Ko)

Bonjour,

Une mis à jour.

Ctrl + Maj +Y pour exécuter la procédure de tri.

Cdlt.

8classeur1.xlsm (48.55 Ko)

Bonjour Jean-Eric

Merci pour la réactivité.

Ta macro fonctionne uniquement si la colonne A contient une valeur ou un caractère.

Comment expliqué précédemment, dans ma feuille la colonne A (qui contient des n° de dossards), peut-être totalement vide au partiellement rempli et pas de manière consécutive (attribution d'un n°de dossard à une personne). En fait, je souhaite effectuer le tri même dans le cas ou la colonne A est vide ou partiellement renseignée.

Merci pour ton implication à ma problématique

Cordialement

Re,

Essaie ainsi :

Public Sub SortByNames()
' Touche de raccourci du clavier: Ctrl+Maj+Y
Dim lastRow As Long
Dim Rng As Range
Const lRow As Long = 5
    With Worksheets("Feuille des Engagements")
        lastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
        Set Rng = .Cells(lRow, 2).Offset(, -1).Resize(lastRow - lRow + 1, 12)
        With .Sort
            .SortFields.Clear
            .SortFields.Add Key:=Rng(1, 2)
            .SetRange Rng
            .Header = xlNo
            .Apply
        End With
        .Cells(4, 3).Select
    End With
End Sub

Re,

C'est absolument parfait, la problématique est résolue !!!

Merci beaucoup

Cordialement

Re,

Pense à clore le sujet.

Bon weekend.

Cdlt.

Rechercher des sujets similaires à "range plage relative"