Comment trier ou filtrer dans un tableau les éléments qui sont en gras ?
Le tri ou le filtre sur des critères de mise en forme n'est pas prévu de base dans les versions antérieures à 2007. Dans cette dernière version on peut trier sur la couleur du fond ou de la police mais pas sur la présence de gras.
Disons que ton tableau est en A1:D10 avec les éléments en gras dans la colonne A
Plusieurs possibilités :
*************************
Par VBA : tu fais appel à une fonction :
Function EstGras(c As Range)
If c.Font.Bold Then
EstGras = True
Else
EstGras = False
End If
End Function
tu peux bien entendu l'adapter pour d'autres critères.
Tu peux utiliser cette fonction de différentes façons : tout simplement en ajoutant une colonne à ton tableau. En E1 tu écris simplement =estgras(A1). La fonction renvoie vrai ou faux. Il te reste ensuite à trier sur vrai ou faux.
Tu peux de même l'utiliser pour faire un filtre élaboré et ainsi extraire les lignes du tableau qui t'intéressent : en F1 tu écris "critère" en F2=estgras(A1) et tu utilises F1:F2 comme zone de critère dans le filtre élaboré.
***************************
Sans VBA on peut utiliser cette astuce qui utilise des macros XL4. Bien qu'elles ne soient plus documentées, elles fonctionnent toujours, y compris dans XL2007
Tu mets ton curseur dans F1 et dans le menu insertion/nom/définir (ou gestionnaire des noms dans l'onglet formules sous xl2007) tu inscris estgras dans la zone de nom et =lire.cellule(20; )
ensuite en E1 tu écris =estgras cette formule te renvoie faux ou vrai mais cette fois sans macro.
Il te reste comme ci-dessus à trier ou à utiliser un filtre automatique pour récupérer les valeurs qui t'intéressent. Attention cependant, le fitre élaboré ne fonctionne pas avec cette astuce.
Disons que ton tableau est en A1:D10 avec les éléments en gras dans la colonne A
Plusieurs possibilités :
*************************
Par VBA : tu fais appel à une fonction :
Function EstGras(c As Range)
If c.Font.Bold Then
EstGras = True
Else
EstGras = False
End If
End Function
tu peux bien entendu l'adapter pour d'autres critères.
Tu peux utiliser cette fonction de différentes façons : tout simplement en ajoutant une colonne à ton tableau. En E1 tu écris simplement =estgras(A1). La fonction renvoie vrai ou faux. Il te reste ensuite à trier sur vrai ou faux.
Tu peux de même l'utiliser pour faire un filtre élaboré et ainsi extraire les lignes du tableau qui t'intéressent : en F1 tu écris "critère" en F2=estgras(A1) et tu utilises F1:F2 comme zone de critère dans le filtre élaboré.
***************************
Sans VBA on peut utiliser cette astuce qui utilise des macros XL4. Bien qu'elles ne soient plus documentées, elles fonctionnent toujours, y compris dans XL2007
Tu mets ton curseur dans F1 et dans le menu insertion/nom/définir (ou gestionnaire des noms dans l'onglet formules sous xl2007) tu inscris estgras dans la zone de nom et =lire.cellule(20; )
ensuite en E1 tu écris =estgras cette formule te renvoie faux ou vrai mais cette fois sans macro.
Il te reste comme ci-dessus à trier ou à utiliser un filtre automatique pour récupérer les valeurs qui t'intéressent. Attention cependant, le fitre élaboré ne fonctionne pas avec cette astuce.
Jacques Boisgontier, CousinHub,
Ajouté ou modifié le 25/08/2007 (N°1876)
Ajouté ou modifié le 25/08/2007 (N°1876)
J'ai une liste de mots (1 par cellule) sur une feuille. Comment récupérer la liste triée et sans doublons de ces mots ?
Tu peux utiliser un dictionnaire (scripting.dictionary, voir le lexique) et le trier de la façon suivante :
Sub triermondico()
'création de la collec
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In Range("B1:M2000") 'si tes mots sont dans cette zone
If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value
Next c
temp = MonDico.items
Call Tri(temp, LBound(temp), UBound(temp)) ' voir module mod_tri
'pour afficher la liste triée
a = 1
For Each i In temp
Range("A" & a) = i
a = a + 1
Next i
End Sub
Sub Tri(a, gauc, droi) ' Quick sort
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call Tri(a, g, droi)
If gauc < d Then Call Tri(a, gauc, d)
End Sub
Sub triermondico()
'création de la collec
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In Range("B1:M2000") 'si tes mots sont dans cette zone
If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value
Next c
temp = MonDico.items
Call Tri(temp, LBound(temp), UBound(temp)) ' voir module mod_tri
'pour afficher la liste triée
a = 1
For Each i In temp
Range("A" & a) = i
a = a + 1
Next i
End Sub
Sub Tri(a, gauc, droi) ' Quick sort
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call Tri(a, g, droi)
If gauc < d Then Call Tri(a, gauc, d)
End Sub
Jacques Boisgontier, Flo cabon,
Ajouté ou modifié le 15/07/2007 (N°1867)
Ajouté ou modifié le 15/07/2007 (N°1867)
Comment classer une tableau par VBA selon une liste personnelle ?
Le principe, chercher si la liste personnelle existe, sinon, la créer :
Sub trierlisteperso()
n = Application.GetCustomListNum(Array("Ligue 1", "Ligue 2", "National", "CFA 1", "CFA 2", "DH"))
If n = 0 Then
Application.AddCustomList ListArray:=Array("Ligue 1", "Ligue 2", "National", "CFA 1", "CFA 2", "DH")
n = Application.CustomListCount
End If
Range("A1:B7").Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=n, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End Sub
Sub trierlisteperso()
n = Application.GetCustomListNum(Array("Ligue 1", "Ligue 2", "National", "CFA 1", "CFA 2", "DH"))
If n = 0 Then
Application.AddCustomList ListArray:=Array("Ligue 1", "Ligue 2", "National", "CFA 1", "CFA 2", "DH")
n = Application.CustomListCount
End If
Range("A1:B7").Select
Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=n, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
End Sub
cousinhub,
Ajouté ou modifié le 12/05/2007 (N°1827)
Ajouté ou modifié le 12/05/2007 (N°1827)
J'ai une liste de mois dans excel et je voudrais la trier mais je n'obtiens que l'ordre
alphabétique et pas janv, fev, mars...
Il faut utiliser une liste personnalisée qui d'ailleurs est toute faite :
Menu Données, Trier, Options
et tu choisis la liste kivabien...
Menu Données, Trier, Options
et tu choisis la liste kivabien...
Circé,
Ajouté ou modifié le 16/02/2005 (N°1576)
Ajouté ou modifié le 16/02/2005 (N°1576)
Quand je trie mes cellules, seules les valeurs sont triées mais les formules ne suivent
pas. Pourquoi ? et comment faire ?
Je ne pense pas qu'il s'agisse d'un bug mais d'un choix dicté par un
problème de vitesse. Si les cellules étaient réordonnées "physiquement"
ça prendrait beaucoup plus de temps que simplement remplacer les valeurs
d'origine par les valeurs triées. Le fait de déplacer une seule cellule
-et c'est ce qu'il faut faire si l'on veut que les formules suivent-
entraîne pour le tableur beaucoup plus d'opérations que le simple fait
de changer son contenu. Le tri se contente donc de modifier les valeurs
de la plage sans toucher aux cellules en tant qu'objets, c'est pourquoi
les formules ne sont pas ajustées.
J'ai fait un petit test par macro de ce que pourrait donner un tri
"physique" des cellules, qui ne perturberait pas les formules:
Sub TestTri()
Dim S, I As Integer, Calc As Long, P As Range
Calc = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Set P = Application.InputBox("Référence de la plage à trier " _
& "(1 seule colonne, sans en-tête)", Type:=8)
If P.Columns.Count > 1 Then Exit Sub
S = P.Value
P.Offset(, 1).Insert xlShiftToRight
P.Offset(, 1).Value = Evaluate("""" & Left(P.Address(0, 0), _
(P.Column < 27) + 2) & """&ROW(" & P.Address & ")")
P.Resize(, 2).Sort P.Item(1)
P.Value = S
S = P.Offset(, 1)
For I = 1 To UBound(S)
Range(S(I, 1)).Cut P.Item(I, 2)
Next I
P.Delete xlShiftToLeft
Application.Calculation = Calc
End Sub
Tant que la colonne à trier est de petite taille (une centaine de
cellules) c'est assez rapide. Mais par exemple avec une plage de 4000
cellules le tri prend déja une bonne vingtaine de secondes sur un XP+
1700 alors qu'un tri normal est quasi-instantané. Ce serait bien sûr
plus rapide se ce type de tri était codé dans Excel lui-même plutôt que
dans une procédure VBA bricolée, mais les opérations de base -déplacer
des cellules- seraient les mêmes.
problème de vitesse. Si les cellules étaient réordonnées "physiquement"
ça prendrait beaucoup plus de temps que simplement remplacer les valeurs
d'origine par les valeurs triées. Le fait de déplacer une seule cellule
-et c'est ce qu'il faut faire si l'on veut que les formules suivent-
entraîne pour le tableur beaucoup plus d'opérations que le simple fait
de changer son contenu. Le tri se contente donc de modifier les valeurs
de la plage sans toucher aux cellules en tant qu'objets, c'est pourquoi
les formules ne sont pas ajustées.
J'ai fait un petit test par macro de ce que pourrait donner un tri
"physique" des cellules, qui ne perturberait pas les formules:
Sub TestTri()
Dim S, I As Integer, Calc As Long, P As Range
Calc = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Set P = Application.InputBox("Référence de la plage à trier " _
& "(1 seule colonne, sans en-tête)", Type:=8)
If P.Columns.Count > 1 Then Exit Sub
S = P.Value
P.Offset(, 1).Insert xlShiftToRight
P.Offset(, 1).Value = Evaluate("""" & Left(P.Address(0, 0), _
(P.Column < 27) + 2) & """&ROW(" & P.Address & ")")
P.Resize(, 2).Sort P.Item(1)
P.Value = S
S = P.Offset(, 1)
For I = 1 To UBound(S)
Range(S(I, 1)).Cut P.Item(I, 2)
Next I
P.Delete xlShiftToLeft
Application.Calculation = Calc
End Sub
Tant que la colonne à trier est de petite taille (une centaine de
cellules) c'est assez rapide. Mais par exemple avec une plage de 4000
cellules le tri prend déja une bonne vingtaine de secondes sur un XP+
1700 alors qu'un tri normal est quasi-instantané. Ce serait bien sûr
plus rapide se ce type de tri était codé dans Excel lui-même plutôt que
dans une procédure VBA bricolée, mais les opérations de base -déplacer
des cellules- seraient les mêmes.
Laurent Longre,
Ajouté ou modifié le 02/05/2004 (N°1373)
Ajouté ou modifié le 02/05/2004 (N°1373)
Je voudrais faire 100 tirages de loto (6 numéros uniques + 1 complémentaire parmi les
nombres de 1 à 49) et trier chaque tirage par ordre croissant des 6 numéros.
Utilise cette macro qui utilise une méthode de tri extrêmement rapide :
Sub Loto()
Dim i As Integer, j As Integer, k As Integer
Dim Tblo(), Rg As Range
ReDim Tblo(1 To 100, 1 To 7)
Randomize
'Application.ScreenUpdating = False
For i = 1 To UBound(Tblo, 1)
Tblo(i, 1) = Int((49 * Rnd) + 1)
For j = 2 To 7
a = Int((49 * Rnd) + 1)
For k = 1 To j - 1
If a = Tblo(i, k) Then a = Int((49 * Rnd) + 1): k = 0
Next
Tblo(i, j) = a
Next
Next
With Worksheets("Feuil1")
Set Rg = .Range("A1").Resize(UBound(Tblo, 1), UBound(Tblo, 2))
End With
Rg = Tblo
Trier Rg.Resize(, Rg.Columns.Count - 1)
Set Rg = Nothing
End Sub
'--------------------------------------
Sub Trier(Rg As Range)
Dim R As Range
For Each R In Rg.Rows
With R
a = a + 1
.Sort Key1:=Rg(a, 1), Order1:=xlAscending, Header:=False _
, OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, _
DataOption1:=xlSortNormal
End With
Next
Set R = Nothing: Set Rg = Nothing
End Sub
Sub Loto()
Dim i As Integer, j As Integer, k As Integer
Dim Tblo(), Rg As Range
ReDim Tblo(1 To 100, 1 To 7)
Randomize
'Application.ScreenUpdating = False
For i = 1 To UBound(Tblo, 1)
Tblo(i, 1) = Int((49 * Rnd) + 1)
For j = 2 To 7
a = Int((49 * Rnd) + 1)
For k = 1 To j - 1
If a = Tblo(i, k) Then a = Int((49 * Rnd) + 1): k = 0
Next
Tblo(i, j) = a
Next
Next
With Worksheets("Feuil1")
Set Rg = .Range("A1").Resize(UBound(Tblo, 1), UBound(Tblo, 2))
End With
Rg = Tblo
Trier Rg.Resize(, Rg.Columns.Count - 1)
Set Rg = Nothing
End Sub
'--------------------------------------
Sub Trier(Rg As Range)
Dim R As Range
For Each R In Rg.Rows
With R
a = a + 1
.Sort Key1:=Rg(a, 1), Order1:=xlAscending, Header:=False _
, OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight, _
DataOption1:=xlSortNormal
End With
Next
Set R = Nothing: Set Rg = Nothing
End Sub
Denis Michon,
Ajouté ou modifié le 02/05/2004 (N°1370)
Ajouté ou modifié le 02/05/2004 (N°1370)

J'ai des plages de données discontinues, séparées par au moins une ligne vide, qui s'étendent
de la colonne A à la colonne D. Je voudrais une macro qui me permette de trier chacune de ces
plages, indépendamment les unes des autres, mais en une seule fois, sur la colonne A, Excel
trouvant tout seul le début et la fin de chaque plage.
Dans cette première solution, les 4 colonnes de chaque plage sont triées séparément.
Sub Tri1()
For i = 1 To 4 ' Quatre colonnes à trier (A à D)
Cells(1, i).Select
ActiveCell.End(xlDown).Select
While ActiveCell.Row < 65536
ActiveCell.Resize(ActiveCell.End(xlDown).Row - ActiveCell.Row +
1, 1).Select
Selection.Sort Key1:=Cells(1, i), Order1:=xlAscending,
Header:=xlGuess
ActiveCell.End(xlDown).Select
ActiveCell.End(xlDown).Select
Wend
Next i
Range("a1").Select
End Sub
Laurent Mortézai
*************************************
Dans ces 3 autres procédures, les colonnes A à D sont triées ensemble sur le critère
de la colonne A.
Sub TrierParPlages() 'Frédéric Sigonneau
Dim i%
i = 1
Do While i < Range("A65536").End(xlUp).Row
If Not IsEmpty(Range("A" & i)) Then
Range("A" & i).CurrentRegion.Resize(, 4).Sort Range("A" & i) 'cols A:D
i = i + Range("A" & i).CurrentRegion.Rows.Count
Else: i = i + 1
End If
Loop
End Sub
***************************************
Sub TriParPlages1()
Dim C As New Collection, i%
i = 1
Do While i < Range("A65536").End(xlUp).Row
If Not IsEmpty(Range("A" & i)) Then
C.Add Range("A" & i).CurrentRegion.Resize(, 4) 'cols A:D
i = i + Range("A" & i).CurrentRegion.Rows.Count
Else: i = i + 1
End If
Loop
For i = 1 To C.Count
C(i).Sort C(i).Range("A1")
Next
End Sub
**************************************
Sub TrierSurPlusieursPlages() ' Denis Michon
Dim MyRange As Range
Set MyRange = ActiveSheet.UsedRange
Dim Tbl()
On Error Resume Next
For A = 1 To MyRange.Rows.Count
If Cells(A, 1) = "" Then
B = B + 1
ReDim Preserve Tbl(B)
Tbl(B) = Cells(A + 1, 1).Address
Else
If A = 1 Then
B = B + 1
ReDim Preserve Tbl(B)
Tbl(B) = Cells(A, 1).Address
End If
End If
Next
For A = 1 To B
With Range(Tbl(A)).CurrentRegion
.Sort Key1:=Range(Tbl(A)), order1:=xlAscending
End With
Next
End Sub
Sub Tri1()
For i = 1 To 4 ' Quatre colonnes à trier (A à D)
Cells(1, i).Select
ActiveCell.End(xlDown).Select
While ActiveCell.Row < 65536
ActiveCell.Resize(ActiveCell.End(xlDown).Row - ActiveCell.Row +
1, 1).Select
Selection.Sort Key1:=Cells(1, i), Order1:=xlAscending,
Header:=xlGuess
ActiveCell.End(xlDown).Select
ActiveCell.End(xlDown).Select
Wend
Next i
Range("a1").Select
End Sub
Laurent Mortézai
*************************************
Dans ces 3 autres procédures, les colonnes A à D sont triées ensemble sur le critère
de la colonne A.
Sub TrierParPlages() 'Frédéric Sigonneau
Dim i%
i = 1
Do While i < Range("A65536").End(xlUp).Row
If Not IsEmpty(Range("A" & i)) Then
Range("A" & i).CurrentRegion.Resize(, 4).Sort Range("A" & i) 'cols A:D
i = i + Range("A" & i).CurrentRegion.Rows.Count
Else: i = i + 1
End If
Loop
End Sub
***************************************
Sub TriParPlages1()
Dim C As New Collection, i%
i = 1
Do While i < Range("A65536").End(xlUp).Row
If Not IsEmpty(Range("A" & i)) Then
C.Add Range("A" & i).CurrentRegion.Resize(, 4) 'cols A:D
i = i + Range("A" & i).CurrentRegion.Rows.Count
Else: i = i + 1
End If
Loop
For i = 1 To C.Count
C(i).Sort C(i).Range("A1")
Next
End Sub
**************************************
Sub TrierSurPlusieursPlages() ' Denis Michon
Dim MyRange As Range
Set MyRange = ActiveSheet.UsedRange
Dim Tbl()
On Error Resume Next
For A = 1 To MyRange.Rows.Count
If Cells(A, 1) = "" Then
B = B + 1
ReDim Preserve Tbl(B)
Tbl(B) = Cells(A + 1, 1).Address
Else
If A = 1 Then
B = B + 1
ReDim Preserve Tbl(B)
Tbl(B) = Cells(A, 1).Address
End If
End If
Next
For A = 1 To B
With Range(Tbl(A)).CurrentRegion
.Sort Key1:=Range(Tbl(A)), order1:=xlAscending
End With
Next
End Sub
Laurent Mortézai, Denis Michon, Frédéric Sigonneau, (N°743)
Comment trier les onglets d'un classeur par ordre alphabétique ?
Sub TriChaqueFeuille()
Dim X As Variant
Dim I As Variant
For Each X In ActiveWorkbook.Sheets
For I = 2 To ActiveWorkbook.Sheets.Count
If Sheets(I - 1).Name > Sheets(I).Name Then
Sheets(I - 1).Move After:=Sheets(I)
End If
Next
Next
End Sub
Dim X As Variant
Dim I As Variant
For Each X In ActiveWorkbook.Sheets
For I = 2 To ActiveWorkbook.Sheets.Count
If Sheets(I - 1).Name > Sheets(I).Name Then
Sheets(I - 1).Move After:=Sheets(I)
End If
Next
Next
End Sub
Daniel Josserand, (N°742)
Dans un userform, je reprends les données d'une liste ; Comment trier cette listbox sans
toucher à celle d'origine et en éliminant les doublons ?
Supposons que tu as dans un classeur
- une feuille nommée MaListe sur laquelle
tu as ta liste d'origine.
- une feuille nommée Feuil2 sur laquelle tu vas
copier la liste présente sur
MaListe
- un Userform1 avec une zone de liste
ListBox1
Dans le code ci-dessous, à l'initialisation du formulaire :
1 - les
données de la liste "épurée" sur la feuille Feuil2 sont effacées
2 - les
données de la liste "brute" sur la feuille MaListe sont copiées sur
la feuille
Feuil2 à partir de A1
3 - Ces données sont ensuite triées
4 - les doublons
trouvés sont supprimés
5 - la nouvelle liste est sélectionnée
6 - on définit
son "adresse"
7 - on applique cette adresse à la propriété RowSource de
ListBox1
Option Explicit
Private Sub UserForm_Initialize()
If
Sheets("Feuil2").Range("A2").Value <> "" Then
Sheets("Feuil2").Select
Range("A1", Range("A1").End(xlDown)).Select
Selection.ClearContents
End
If
Dim Plage_Nette
Sheets("MaListe").Select
Range("A1",
Range("A1").End(xlDown)).Select
Selection.Copy
Sheets("Feuil2").Select
Range("A1").Select
ActiveSheet.Paste
Selection.Sort Key1:=Range("A1"),
Order1:=xlAscending,
Orientation:=xlTopToBottom
Dim i
For i = 1 To
Selection.Cells.Count
If Cells(i + 1, 1).Value = Cells(i, 1).Value Then
Cells(i + 1, 1).EntireRow.Delete
End If
Next i
Sheets("Feuil2").Range("A1",
Range("A1").End(xlDown)).Select
Plage_Nette = Selection.Address(True, True,
xlA1, True)
UserForm1.ListBox1.RowSource = Plage_Nette
End Sub
- une feuille nommée MaListe sur laquelle
tu as ta liste d'origine.
- une feuille nommée Feuil2 sur laquelle tu vas
copier la liste présente sur
MaListe
- un Userform1 avec une zone de liste
ListBox1
Dans le code ci-dessous, à l'initialisation du formulaire :
1 - les
données de la liste "épurée" sur la feuille Feuil2 sont effacées
2 - les
données de la liste "brute" sur la feuille MaListe sont copiées sur
la feuille
Feuil2 à partir de A1
3 - Ces données sont ensuite triées
4 - les doublons
trouvés sont supprimés
5 - la nouvelle liste est sélectionnée
6 - on définit
son "adresse"
7 - on applique cette adresse à la propriété RowSource de
ListBox1
Option Explicit
Private Sub UserForm_Initialize()
If
Sheets("Feuil2").Range("A2").Value <> "" Then
Sheets("Feuil2").Select
Range("A1", Range("A1").End(xlDown)).Select
Selection.ClearContents
End
If
Dim Plage_Nette
Sheets("MaListe").Select
Range("A1",
Range("A1").End(xlDown)).Select
Selection.Copy
Sheets("Feuil2").Select
Range("A1").Select
ActiveSheet.Paste
Selection.Sort Key1:=Range("A1"),
Order1:=xlAscending,
Orientation:=xlTopToBottom
Dim i
For i = 1 To
Selection.Cells.Count
If Cells(i + 1, 1).Value = Cells(i, 1).Value Then
Cells(i + 1, 1).EntireRow.Delete
End If
Next i
Sheets("Feuil2").Range("A1",
Range("A1").End(xlDown)).Select
Plage_Nette = Selection.Address(True, True,
xlA1, True)
UserForm1.ListBox1.RowSource = Plage_Nette
End Sub
Pascal Engelmajer, (N°741)
Mes données sont réparties sur trois lignes. Comment les trier sans séparer ces groupes ?
Tu peux utiliser cette macro
Sub TriLie() 'Flo Cabon d'après une macro d'Isabelle, MPFE
Dim NbLié As Integer
Dim nblignes As Integer
Dim CleTri As Variant
Dim I, n
'les deux premières colonnes sont remplies, les deux suivantes doivent être vides
NbLié = InputBox("Nb de lignes par groupe de tri ?", , 3)
Range("A1").Select
Selection.CurrentRegion.Select
nblignes = Selection.Rows.Count
For I = 1 To nblignes
If I Mod NbLié = 1 Then CleTri = Cells(I, 1).Value
Cells(I, 3) = CleTri
Cells(I, 4) = I
Next
Range("A1").Select
Selection.Sort Key1:=Range("c1"), Order1:=xlAscending, _
Key2:=Range("d1"), Order2:=xlAscending, _
Header:=xlNo, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
Range("c:d").ClearContents
End Sub
Sub TriLie() 'Flo Cabon d'après une macro d'Isabelle, MPFE
Dim NbLié As Integer
Dim nblignes As Integer
Dim CleTri As Variant
Dim I, n
'les deux premières colonnes sont remplies, les deux suivantes doivent être vides
NbLié = InputBox("Nb de lignes par groupe de tri ?", , 3)
Range("A1").Select
Selection.CurrentRegion.Select
nblignes = Selection.Rows.Count
For I = 1 To nblignes
If I Mod NbLié = 1 Then CleTri = Cells(I, 1).Value
Cells(I, 3) = CleTri
Cells(I, 4) = I
Next
Range("A1").Select
Selection.Sort Key1:=Range("c1"), Order1:=xlAscending, _
Key2:=Range("d1"), Order2:=xlAscending, _
Header:=xlNo, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
Range("c:d").ClearContents
End Sub
Isabelle, (N°740)

Dans une colonne j'ai des formules. Je voudrais trier cette colonne en fonction des résultats
mais sans perdre les formules. Je n'y parviens pas. Est-ce un bug ?
Je ne pense pas qu'il s'agisse d'un bug mais d'un choix dicté par un
problème de vitesse. Si les cellules étaient réordonnées "physiquement"
ça prendrait beaucoup plus de temps que simplement remplacer les valeurs
d'origine par les valeurs triées. Le fait de déplacer une seule cellule
-et c'est ce qu'il faut faire si l'on veut que les formules suivent-
entraîne pour le tableur beaucoup plus d'opérations que le simple fait
de changer son contenu. Le tri se contente donc de modifier les valeurs
de la plage sans toucher aux cellules en tant qu'objets, c'est pourquoi
les formules ne sont pas ajustées.
J'ai fait un petit test par macro de ce que pourrait donner un tri
"physique" des cellules, qui ne perturberait pas les formules:
Sub TestTri()
Dim S, I As Integer, Calc As Long, P As Range
Calc = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Set P = Application.InputBox("Référence de la plage à trier " _
& "(1 seule colonne, sans en-tête)", Type:=8)
If P.Columns.Count > 1 Then Exit Sub
S = P.Value
P.Offset(, 1).Insert xlShiftToRight
P.Offset(, 1).Value = Evaluate("""" & Left(P.Address(0, 0), _
(P.Column < 27) + 2) & """&ROW(" & P.Address & ")")
P.Resize(, 2).Sort P.Item(1)
P.Value = S
S = P.Offset(, 1)
For I = 1 To UBound(S)
Range(S(I, 1)).Cut P.Item(I, 2)
Next I
P.Delete xlShiftToLeft
Application.Calculation = Calc
End Sub
Tant que la colonne à trier est de petite taille (une centaine de
cellules) c'est assez rapide. Mais par exemple avec une plage de 4000
cellules le tri prend déja une bonne vingtaine de secondes sur un XP+
1700 alors qu'un tri normal est quasi-instantané. Ce serait bien sûr
plus rapide se ce type de tri était codé dans Excel lui-même plutôt que
dans une procédure VBA bricolée, mais les opérations de base -déplacer
des cellules- seraient les mêmes.
problème de vitesse. Si les cellules étaient réordonnées "physiquement"
ça prendrait beaucoup plus de temps que simplement remplacer les valeurs
d'origine par les valeurs triées. Le fait de déplacer une seule cellule
-et c'est ce qu'il faut faire si l'on veut que les formules suivent-
entraîne pour le tableur beaucoup plus d'opérations que le simple fait
de changer son contenu. Le tri se contente donc de modifier les valeurs
de la plage sans toucher aux cellules en tant qu'objets, c'est pourquoi
les formules ne sont pas ajustées.
J'ai fait un petit test par macro de ce que pourrait donner un tri
"physique" des cellules, qui ne perturberait pas les formules:
Sub TestTri()
Dim S, I As Integer, Calc As Long, P As Range
Calc = Application.Calculation
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Set P = Application.InputBox("Référence de la plage à trier " _
& "(1 seule colonne, sans en-tête)", Type:=8)
If P.Columns.Count > 1 Then Exit Sub
S = P.Value
P.Offset(, 1).Insert xlShiftToRight
P.Offset(, 1).Value = Evaluate("""" & Left(P.Address(0, 0), _
(P.Column < 27) + 2) & """&ROW(" & P.Address & ")")
P.Resize(, 2).Sort P.Item(1)
P.Value = S
S = P.Offset(, 1)
For I = 1 To UBound(S)
Range(S(I, 1)).Cut P.Item(I, 2)
Next I
P.Delete xlShiftToLeft
Application.Calculation = Calc
End Sub
Tant que la colonne à trier est de petite taille (une centaine de
cellules) c'est assez rapide. Mais par exemple avec une plage de 4000
cellules le tri prend déja une bonne vingtaine de secondes sur un XP+
1700 alors qu'un tri normal est quasi-instantané. Ce serait bien sûr
plus rapide se ce type de tri était codé dans Excel lui-même plutôt que
dans une procédure VBA bricolée, mais les opérations de base -déplacer
des cellules- seraient les mêmes.
Laurent Longre, (N°739)
Comment trier les feuilles suivantes dans l'ordre présenté ici ?
"01";"02";"010";"1";"2";"100";"
1Feuil";"2Feuil";"Feuil01";"Feuil04";"Feuil1"
;"Feuil2";"Feuil10";"ZAZA" Autrement dit, je voudrais que les 0
soient prioritaires sur les 1, prioritaires sur les 2...
Utilise ce code :
Const MAXCAR_NOMFEUILLE = 32 ' Max caractères dans un nom de feuille
Const MAXSÉRIES = MAXCAR_NOMFEUILLE + 2
' Combinaisons maximum de SÉRIES de lettres puis chiffres
' Ça veut dire que pour un nom de feuille valide comme:
' "1 JPS peut être têtu comme 1000"
' possède 3 séries.
' En effet :
' 1 série chiffres [1]
'+ 1 série lettres [ JPS peut être têtu comme ]
'+ 1 série chiffres [1000]
' En mettant à 2 de plus que MAXCAR_NOMFEUILLE, il ne devrait jamais
' arriver de remplir complètement les indices de V (voir ci-dessous)
' TriFeuillesDM :Procédure qui trie les feuilles de façon à mettre
' les nombres avant les lettres, qui est sensible au nombre de
' zéros avant un chiffre.
' Daniel M. Octobre 2002
' Résultat : Les feuilles triées selon leur nom (onglet) en
' considérant que les numéros ont priorité. C'est tout.
'
' Exemple d'un ordre ascendant avec
' Priorité par Numéros (ParNum=true), sans tenir compte de la casse
' {"001";"0010";"01";"02";"010";"1";"2";"12";"100";"0Feuille";
' "1F";"1Feuil";"2F";"2Feuil";" Feuille";"_Feuille";"Feuil01";
' "feuil04";"Feuil1";"Feuil2";"Feuil10";"za02za";"za010za";
' "zaza";"ZAZA_"}
'
' Exemple d'un ordre ascendant avec
' Priorité par Noms (ParNum=false), sans tenir compte de la casse
' {"001";"0010";"01";"02";"010";"1";"2";"12";"100";" Feuille";
' "_Feuille";"1F";"2F";"Feuil01";"feuil04";"Feuil1";"Feuil2";
' "Feuil10";"1Feuil";"2Feuil";"0Feuille";"za02za";"za010za";
' "zaza";"ZAZA_"}
'
Sub TriFeuillesDM()
Dim i%, j%, k%, DébutFeuille%
Dim TriAscendant As Boolean, ParNum As Boolean
Dim Casse As Boolean, Calc As Long
TriAscendant = True ' False: Tri Descendant
ParNum = False ' True: Tri par numéros. False :Tri par Noms
Casse = False ' True: 'A' < 'a' False: 'A' = 'a'
DébutFeuille = 1 ' Première feuille à trier, pourrait être 3
k = Worksheets.Count ' Dernière feuille à trier
With Application
'.ScreenUpdating = False ' <=== Au choix, pour la rapidité
'Calc = .Calculation: .Calculation = xlCalculationManual ' <== Au choix
For i = DébutFeuille To k
For j = i To k
If TriAscendant Then
If NomDeTri(Worksheets(j).Name, Casse, ParNum) < _
NomDeTri(Worksheets(i).Name, Casse, ParNum) Then
Worksheets(j).Move Before:=Worksheets(i)
End If
Else
If NomDeTri(Worksheets(j).Name, Casse, ParNum) > _
NomDeTri(Worksheets(i).Name, Casse, ParNum) Then
Worksheets(j).Move Before:=Worksheets(i)
End If
End If
Next j
Next i
'.Calculation = Calc ' Au choix (en fonction du choix précédent)
'.ScreenUpdating = True ' Non-requis mais plus précis.
End With
End Sub
' Fonction NomDeTri
' Paramètre: Une chaîne (Normalement, un nom d'onglet valide)
' Retourne une chaîne qui permettra la comparaison textuelle exacte
' y compris lorsque la chaîne initiale contenait des chiffres.
Public Function NomDeTri$(S$, _
Optional SensibleALaCasse As Boolean = False, _
Optional TriParNuméros As Boolean = True)
Dim i%, j%, len1%, nz%, V$(0 To MAXSÉRIES - 1), c As String * 1
Dim prev_is_num As Boolean, is_num As Boolean
len1 = Len(S): i = 1: j = LBound(V)
prev_is_num = True ' V(0) ==> chiffres, V(1) ==> lettres, etc.
For i = 1 To len1
' classe S en Tableau V, où indices pairs = nombres, impairs = texte
c = Mid(S, i, 1)
is_num = IsNumeric(c) ' chiffre ou lettre?
' Change d'indice si on passe de chiffre à lettre (ou vice-versa)
If is_num <> prev_is_num And j < MAXSÉRIES - 1 Then j = j + 1
V(j) = V(j) & c ' ajoute le caractère à la chaîne appropriée de V
prev_is_num = is_num
Next i
' V contient la chaîne S divisée en séries (chiffres,lettres,...)
' Traite les chiffres en générant une chaîne qui respectera
' leur valeur instrinsèque (tenant compte des Zéros et s'il y
' a des mots qui suivent).
For i = LBound(V) To j
If i Mod 2 = 0 Then ' Les chiffres (indices pairs)
If V(i) <> "" Then ' si rien, on laisse tel quel
nz = ZéroAuDébut(V(i))
If V(i) <= 0 Then
V(i) = Format(MAXCAR_NOMFEUILLE - nz, "00") & "000"
Else
V(i) = Format(MAXCAR_NOMFEUILLE - nz, "00") & _
Format(Int(Application.Log10(V(i))), "00") & _
Mid(V(i), 1 + nz, Len(V(i)))
End If
V(i) = IIf(V(i + 1) = "", "0", "1") & V(i)
' Si l'entrée suivante n'est pas vide, met un 1 (sinon 0)
' Ainsi "35" sera plus petit "2Feuil", car les résultats
' de NomDeTri sont : 0xx35 < 1xx2Feuille
End If
Else ' Les lettres
V(i) = Format(MAXCAR_NOMFEUILLE + 1, "00") & V(i)
End If
If V(i + 1) = "" Then Exit For ' Plus rien à traiter, on sort!
Next i
For i = LBound(V) To UBound(V) Step 2
NomDeTri = NomDeTri & _
IIf(TriParNuméros, V(i) & V(i + 1), V(i + 1) & V(i))
' concaténation chiffres + lettres OU lettres + chiffres
If V(i + 2) = "" Then Exit For
Next i
If SensibleALaCasse = False Then NomDeTri = UCase$(NomDeTri)
End Function
' Donne le nombre de zéros consécutifs au début d'une chaîne.
' En insérant au début de chaque nombre le complément
' de ce résultat (MAXCAR_NOMFEUILLE -nz), on s'assure de tenir
' compte du nombre de zéros. Et d'avoir 001 < 0010 < 01 < 010 < 1
Private Function ZéroAuDébut(S$) As Integer
Dim i%, j%
j = Len(S)
For i = 1 To j
If Mid(S, i, 1) <> "0" Then
ZéroAuDébut = i - 1
Exit Function
End If
Next i
ZéroAuDébut = j
End Function
Tu peux télécharger ici un classeur exemple de Denis Michon utilisant cette macro
Const MAXCAR_NOMFEUILLE = 32 ' Max caractères dans un nom de feuille
Const MAXSÉRIES = MAXCAR_NOMFEUILLE + 2
' Combinaisons maximum de SÉRIES de lettres puis chiffres
' Ça veut dire que pour un nom de feuille valide comme:
' "1 JPS peut être têtu comme 1000"
' possède 3 séries.
' En effet :
' 1 série chiffres [1]
'+ 1 série lettres [ JPS peut être têtu comme ]
'+ 1 série chiffres [1000]
' En mettant à 2 de plus que MAXCAR_NOMFEUILLE, il ne devrait jamais
' arriver de remplir complètement les indices de V (voir ci-dessous)
' TriFeuillesDM :Procédure qui trie les feuilles de façon à mettre
' les nombres avant les lettres, qui est sensible au nombre de
' zéros avant un chiffre.
' Daniel M. Octobre 2002
' Résultat : Les feuilles triées selon leur nom (onglet) en
' considérant que les numéros ont priorité. C'est tout.
'
' Exemple d'un ordre ascendant avec
' Priorité par Numéros (ParNum=true), sans tenir compte de la casse
' {"001";"0010";"01";"02";"010";"1";"2";"12";"100";"0Feuille";
' "1F";"1Feuil";"2F";"2Feuil";" Feuille";"_Feuille";"Feuil01";
' "feuil04";"Feuil1";"Feuil2";"Feuil10";"za02za";"za010za";
' "zaza";"ZAZA_"}
'
' Exemple d'un ordre ascendant avec
' Priorité par Noms (ParNum=false), sans tenir compte de la casse
' {"001";"0010";"01";"02";"010";"1";"2";"12";"100";" Feuille";
' "_Feuille";"1F";"2F";"Feuil01";"feuil04";"Feuil1";"Feuil2";
' "Feuil10";"1Feuil";"2Feuil";"0Feuille";"za02za";"za010za";
' "zaza";"ZAZA_"}
'
Sub TriFeuillesDM()
Dim i%, j%, k%, DébutFeuille%
Dim TriAscendant As Boolean, ParNum As Boolean
Dim Casse As Boolean, Calc As Long
TriAscendant = True ' False: Tri Descendant
ParNum = False ' True: Tri par numéros. False :Tri par Noms
Casse = False ' True: 'A' < 'a' False: 'A' = 'a'
DébutFeuille = 1 ' Première feuille à trier, pourrait être 3
k = Worksheets.Count ' Dernière feuille à trier
With Application
'.ScreenUpdating = False ' <=== Au choix, pour la rapidité
'Calc = .Calculation: .Calculation = xlCalculationManual ' <== Au choix
For i = DébutFeuille To k
For j = i To k
If TriAscendant Then
If NomDeTri(Worksheets(j).Name, Casse, ParNum) < _
NomDeTri(Worksheets(i).Name, Casse, ParNum) Then
Worksheets(j).Move Before:=Worksheets(i)
End If
Else
If NomDeTri(Worksheets(j).Name, Casse, ParNum) > _
NomDeTri(Worksheets(i).Name, Casse, ParNum) Then
Worksheets(j).Move Before:=Worksheets(i)
End If
End If
Next j
Next i
'.Calculation = Calc ' Au choix (en fonction du choix précédent)
'.ScreenUpdating = True ' Non-requis mais plus précis.
End With
End Sub
' Fonction NomDeTri
' Paramètre: Une chaîne (Normalement, un nom d'onglet valide)
' Retourne une chaîne qui permettra la comparaison textuelle exacte
' y compris lorsque la chaîne initiale contenait des chiffres.
Public Function NomDeTri$(S$, _
Optional SensibleALaCasse As Boolean = False, _
Optional TriParNuméros As Boolean = True)
Dim i%, j%, len1%, nz%, V$(0 To MAXSÉRIES - 1), c As String * 1
Dim prev_is_num As Boolean, is_num As Boolean
len1 = Len(S): i = 1: j = LBound(V)
prev_is_num = True ' V(0) ==> chiffres, V(1) ==> lettres, etc.
For i = 1 To len1
' classe S en Tableau V, où indices pairs = nombres, impairs = texte
c = Mid(S, i, 1)
is_num = IsNumeric(c) ' chiffre ou lettre?
' Change d'indice si on passe de chiffre à lettre (ou vice-versa)
If is_num <> prev_is_num And j < MAXSÉRIES - 1 Then j = j + 1
V(j) = V(j) & c ' ajoute le caractère à la chaîne appropriée de V
prev_is_num = is_num
Next i
' V contient la chaîne S divisée en séries (chiffres,lettres,...)
' Traite les chiffres en générant une chaîne qui respectera
' leur valeur instrinsèque (tenant compte des Zéros et s'il y
' a des mots qui suivent).
For i = LBound(V) To j
If i Mod 2 = 0 Then ' Les chiffres (indices pairs)
If V(i) <> "" Then ' si rien, on laisse tel quel
nz = ZéroAuDébut(V(i))
If V(i) <= 0 Then
V(i) = Format(MAXCAR_NOMFEUILLE - nz, "00") & "000"
Else
V(i) = Format(MAXCAR_NOMFEUILLE - nz, "00") & _
Format(Int(Application.Log10(V(i))), "00") & _
Mid(V(i), 1 + nz, Len(V(i)))
End If
V(i) = IIf(V(i + 1) = "", "0", "1") & V(i)
' Si l'entrée suivante n'est pas vide, met un 1 (sinon 0)
' Ainsi "35" sera plus petit "2Feuil", car les résultats
' de NomDeTri sont : 0xx35 < 1xx2Feuille
End If
Else ' Les lettres
V(i) = Format(MAXCAR_NOMFEUILLE + 1, "00") & V(i)
End If
If V(i + 1) = "" Then Exit For ' Plus rien à traiter, on sort!
Next i
For i = LBound(V) To UBound(V) Step 2
NomDeTri = NomDeTri & _
IIf(TriParNuméros, V(i) & V(i + 1), V(i + 1) & V(i))
' concaténation chiffres + lettres OU lettres + chiffres
If V(i + 2) = "" Then Exit For
Next i
If SensibleALaCasse = False Then NomDeTri = UCase$(NomDeTri)
End Function
' Donne le nombre de zéros consécutifs au début d'une chaîne.
' En insérant au début de chaque nombre le complément
' de ce résultat (MAXCAR_NOMFEUILLE -nz), on s'assure de tenir
' compte du nombre de zéros. Et d'avoir 001 < 0010 < 01 < 010 < 1
Private Function ZéroAuDébut(S$) As Integer
Dim i%, j%
j = Len(S)
For i = 1 To j
If Mid(S, i, 1) <> "0" Then
ZéroAuDébut = i - 1
Exit Function
End If
Next i
ZéroAuDébut = j
End Function
Tu peux télécharger ici un classeur exemple de Denis Michon utilisant cette macro
Daniel Maher, (N°738)
Comment trier une plage en fonction de la couleur de fond des cellules ?
Voici un exemple qui permet de trier une plage de cellules (sur une seule
colonne) selon la couleur :
1 - Crée la macro TriCoul (classique tri récursif)
2 - Crée la macro TriCoulRange (qui lancera TriCoul pour la plage
sélectionnée)
3 - Dans une feuille de calcul, sélectionne une plage (sur une seule
colonne) et exécute TriCoulRange.
Voila, tu peux modifier la macro pour trier plusieurs colonnes
Sub TriCoul(R As Range)
Dim Bas As Long, Haut As Long
Dim Col As Integer
Dim i As Long, j As Long
Dim Milieu As Variant, Echange As Variant
Col = R.Column
Bas = R.Row
Haut = R.Rows.Count + i - 1
i = Bas
j = Haut
Milieu = Cells((Int(Bas + Haut) / 2), Col).Interior.Color
Do
While Cells(i, Col).Interior.Color < Milieu
i = i + 1
Wend
While Milieu < Cells(j, Col).Interior.Color
j = j - 1
Wend
If i <= j Then
Echange = Cells(i, Col).Interior.Color
Cells(i, Col).Interior.Color = Cells(j, Col).Interior.Color
Cells(j, Col).Interior.Color = Echange
Echange = Cells(i, Col).Value
Cells(i, Col).Value = Cells(j, Col).Value
Cells(j, Col).Value = Echange
i = i + 1
j = j - 1
End If
Loop Until i > j
If Bas < j Then TriCoul Range(Cells(Bas, Col), Cells(j, Col))
If i < Haut Then TriCoul Range(Cells(i, Col), Cells(Haut, Col))
End Sub
Sub TriCoulRange()
TriCoul Selection
End Sub
colonne) selon la couleur :
1 - Crée la macro TriCoul (classique tri récursif)
2 - Crée la macro TriCoulRange (qui lancera TriCoul pour la plage
sélectionnée)
3 - Dans une feuille de calcul, sélectionne une plage (sur une seule
colonne) et exécute TriCoulRange.
Voila, tu peux modifier la macro pour trier plusieurs colonnes
Sub TriCoul(R As Range)
Dim Bas As Long, Haut As Long
Dim Col As Integer
Dim i As Long, j As Long
Dim Milieu As Variant, Echange As Variant
Col = R.Column
Bas = R.Row
Haut = R.Rows.Count + i - 1
i = Bas
j = Haut
Milieu = Cells((Int(Bas + Haut) / 2), Col).Interior.Color
Do
While Cells(i, Col).Interior.Color < Milieu
i = i + 1
Wend
While Milieu < Cells(j, Col).Interior.Color
j = j - 1
Wend
If i <= j Then
Echange = Cells(i, Col).Interior.Color
Cells(i, Col).Interior.Color = Cells(j, Col).Interior.Color
Cells(j, Col).Interior.Color = Echange
Echange = Cells(i, Col).Value
Cells(i, Col).Value = Cells(j, Col).Value
Cells(j, Col).Value = Echange
i = i + 1
j = j - 1
End If
Loop Until i > j
If Bas < j Then TriCoul Range(Cells(Bas, Col), Cells(j, Col))
If i < Haut Then TriCoul Range(Cells(i, Col), Cells(Haut, Col))
End Sub
Sub TriCoulRange()
TriCoul Selection
End Sub
Fripouillot, (N°737)
Avec Excel, on peut trier une liste dans l'ordre alphabétique et dans l'ordre alphabétique
inverse, mais existe-t-il une façon d'obtenir une liste aléatoire ?
une solution sans VBA :
Soit une colonne de questions (en A) et une colonne des réponses correspondantes
(en B), les deux sans en-tête.
en C1 saisir le nombre 1
en C2 saisir le nombre 2
en D1 saisir la formule =TRONQUE(ALEA()*400)
sélectionner C1:C2 double-cliquer pour numéroter les question dans l'ordre
initial (afin de pouvoir le rétablir)
sélectionner D1 double-cliquer pour copier la formule jusqu'à la fin des
lignes remplie (il faut double-cliquer sur le coin en bas à droite)
Il ne reste plus qu'à trier :
sélectionner les colonnes A,B,C et D
Données > Trier > par colonne D
le mélange est fait et le prochain préparé car la formule TRONQUE(ALEA()*400
est recalculée
Soit une colonne de questions (en A) et une colonne des réponses correspondantes
(en B), les deux sans en-tête.
en C1 saisir le nombre 1
en C2 saisir le nombre 2
en D1 saisir la formule =TRONQUE(ALEA()*400)
sélectionner C1:C2 double-cliquer pour numéroter les question dans l'ordre
initial (afin de pouvoir le rétablir)
sélectionner D1 double-cliquer pour copier la formule jusqu'à la fin des
lignes remplie (il faut double-cliquer sur le coin en bas à droite)
Il ne reste plus qu'à trier :
sélectionner les colonnes A,B,C et D
Données > Trier > par colonne D
le mélange est fait et le prochain préparé car la formule TRONQUE(ALEA()*400
est recalculée
Pascal Engelmajer, (N°736)
Est il possible par une astuce ou uniquement par VBA de contourner la boîte de dialogue de tri
qui ne propose que trois critères ?
Pas besoin de VBA pour trier sur plus de trois champs (mais le principe
est le même si tu y tiens). Il suffit de trier en ordre croissant
d'importance des champs. Par exemple, si tu veux trier en ordre
Continent, pays, région, ville, tu tries en commençant par la fin, donc
ville, région, puis pays, puis Continent. Pour aller plus vite tu peux
trier par groupe de trois, donc (pays, région, ville) puis un second tri
avec seulement (continent). La méthode peut donc s'appliquer à un nombre
quelconque de champs.
est le même si tu y tiens). Il suffit de trier en ordre croissant
d'importance des champs. Par exemple, si tu veux trier en ordre
Continent, pays, région, ville, tu tries en commençant par la fin, donc
ville, région, puis pays, puis Continent. Pour aller plus vite tu peux
trier par groupe de trois, donc (pays, région, ville) puis un second tri
avec seulement (continent). La méthode peut donc s'appliquer à un nombre
quelconque de champs.
Laurent Mortézai, (N°735)