Trier plage de donnée avec formule

Bonjour le forum

Voilà mon soucis qui je suis sur, vous n'en ferez qu'une bouchée de pain

J'ai un tableau structuré, dans la première colonne se trouve des références ayant pour format UnNombre-UneLettre. Dans deux colonnes du tableau il y à des formules.

Je voudrais d'abord effectuer un tri par ordre croissant (par rapport à la partie numérique de la référence) et après faire un tri par ordre alphabétique (par rapport à la partie littérale de la référence)

J'ai déjà codé quelque chose mais lors ce que les lignes sont déplacées suite au tri je perd les formules ! Comme si je faisais un copier / collage spéciale en valeur !

Pourriez vous m'aider à modifier mon code pour pouvoir déplacer les lignes tout en gardant les formules ?

Par avance, merci de l’intérêt porté au sujet

Sub Tri()

Max = Feuil3.Range("A" & Rows.Count).End(xlUp).Row

'Pour trier les parties numérique des références
For i = 3 To Max
    For j = i To Max
    ComparA = Split(Feuil3.Cells(i, 1), "-")
    ComparB = Split(Feuil3.Cells(j, 1), "-")
    TempA = Feuil3.Range(Cells(i, 1), Cells(i, 8))
    TempB = Feuil3.Range(Cells(j, 1), Cells(j, 8))
    If CDbl(ComparA(0)) > CDbl(ComparB(0)) Then
        Feuil3.Range(Cells(i, 1), Cells(i, 8)) = TempB
        Feuil3.Range(Cells(j, 1), Cells(j, 8)) = TempA
    End If
    Next j
Next i

'Pour trier les parties litérale des référence
For i = 3 To Max
    For j = i To Max
    ComparA = Split(Feuil3.Cells(i, 1), "-")
    ComparB = Split(Feuil3.Cells(j, 1), "-")
    TempA = Feuil3.Range(Cells(i, 1), Cells(i, 8))
    TempB = Feuil3.Range(Cells(j, 1), Cells(j, 8))

    'Pour effectuer le tri il faut que les deux valeurs numérique des références consécutives testées soit égale
    If UBound(ComparA) > 0 And UBound(ComparB) > 0 Then
    If CDbl(ComparA(0)) = CDbl(ComparB(0)) And ComparA(1) > ComparB(1) Then
        Feuil3.Range(Cells(i, 1), Cells(i, 8)) = TempB
        Feuil3.Range(Cells(j, 1), Cells(j, 8)) = TempA
    End If
    End If
    Next j
Next i

End Sub

Bonjour,

Tu manipules seulement les valeurs (propriété .Value d'un Range) et pas les formules (propriété .Formula d'un Range) avec ton code. Il faudrait peut-être doubler toutes tes variables tableaux pour faire aussi migrer les .Formula.

Merci du retour, qu'entend tu par

Il faudrait peut-être doubler toutes tes variables tableaux pour faire aussi migrer les .Formula.

?

Merci du retour, qu'entend tu par

Il faudrait peut-être doubler toutes tes variables tableaux pour faire aussi migrer les .Formula.

?
TempA = Feuil3.Range(Cells(i, 1), Cells(i, 8))
'équivaut implicitement à :
TempA = Feuil3.Range(Cells(i, 1), Cells(i, 8)).Value

Je n'ai jamais essayé, mais tu dois aussi pouvoir faire :

TempAbis = Feuil3.Range(Cells(i, 1), Cells(i, 8)).Formula

Effectivement, le

.Formula

répond tout à fait à mon besoin ! Merci

Et tant que j'y suis, si ce n'est pas trop demandé, est-il possible de simplifier mon code ?

EDIT : je met du coup le code fonctionnel

Sub Tri()

Max = Feuil3.Range("A" & Rows.Count).End(xlUp).Row

'Pour trier les parties numérique des références
For i = 3 To Max
    For j = i To Max
    ComparA = Split(Feuil3.Cells(i, 1), "-")
    ComparB = Split(Feuil3.Cells(j, 1), "-")
    'MsgBox Feuil3.Cells(j, 1)
    TempA = Feuil3.Range(Cells(i, 1), Cells(i, 8)).Formula
    TempB = Feuil3.Range(Cells(j, 1), Cells(j, 8)).Formula
    If CDbl(ComparA(0)) > CDbl(ComparB(0)) Then
        Feuil3.Range(Cells(i, 1), Cells(i, 8)) = TempB
        Feuil3.Range(Cells(j, 1), Cells(j, 8)) = TempA
    End If
    Next j
Next i

'Pour trier les parties litérale des référence
For i = 3 To Max
    For j = i To Max
    ComparA = Split(Feuil3.Cells(i, 1), "-")
    ComparB = Split(Feuil3.Cells(j, 1), "-")
    TempA = Feuil3.Range(Cells(i, 1), Cells(i, 8)).Formula
    TempB = Feuil3.Range(Cells(j, 1), Cells(j, 8)).Formula

    'Pour effectuer le tri il faut que les deux valeurs numérique des références consécutives testées soit égale
    If UBound(ComparA) > 0 And UBound(ComparB) > 0 Then
    If CDbl(ComparA(0)) = CDbl(ComparB(0)) And ComparA(1) > ComparB(1) Then
        Feuil3.Range(Cells(i, 1), Cells(i, 8)) = TempB
        Feuil3.Range(Cells(j, 1), Cells(j, 8)) = TempA
    End If
    End If
    Next j
Next i

End Sub

Je n'ai pas regardé en détail ton code, mais tu gagneras déjà en lisibilité en utilisant une structure :

With Feuil3...End With qui t'éviteras de répéter la feuille devant chaque plage.

Finalement j'ai trouvé

Sub Tri()

With Feuil3
    Max = .Range("A" & Rows.Count).End(xlUp).Row

    For i = 3 To Max 'Premier tri sur la partie numérique des références
        For j = i To Max
            ComparA = Split(.Cells(i, 1), "-")
            ComparB = Split(.Cells(j, 1), "-")
            TempA = .Range(Cells(i, 1), Cells(i, 8)).Formula
            TempB = .Range(Cells(j, 1), Cells(j, 8)).Formula
            If CDbl(ComparA(0)) > CDbl(ComparB(0)) Then
                .Range(Cells(i, 1), Cells(i, 8)) = TempB
                .Range(Cells(j, 1), Cells(j, 8)) = TempA
            End If
            If UBound(ComparA) > 0 And UBound(ComparB) > 0 Then 'Deuxième tri sur la partie alphabétique des références
            If CDbl(ComparA(0)) = CDbl(ComparB(0)) And ComparA(1) > ComparB(1) Then
                .Range(Cells(i, 1), Cells(i, 8)) = TempB
                .Range(Cells(j, 1), Cells(j, 8)) = TempA
            End If
            End If
        Next j
    Next i
End With

End Sub
Range(Cells(i, 1), Cells(i, 8)) 
'peut être remplacé par :
Range("A" & i & ":H" & i)

Sinon ça me semble très bien, et plus lisible !

Merci sujet résolu !

Merci sujet résolu !

Tu as fait tout le boulot !

J'aurais pas pensé au truc le plus simple, au final c'est toi qui m'a débloqué

Bonne soirée

Rechercher des sujets similaires à "trier plage donnee formule"