tri avec insertion de ligne vide entre categorie

MikeBelgique

XLDnaute Occasionnel
Bonjour le Forum,

Est-il possible en vba de pouvoir insérer des lignes vides entre deux catégories lors d'un tri

exemple tri sur la colonne D
Celle-ci contiendra :
VS
1
2
3
et d'autres lignes de données mais qui ne contiendront rien en colonne d et donc qui devront être après le reste

donc par logique et tri croissant cela devrait rendre dans l'ordre ci-dessus d'abord les lignes comprenant VS en colonne D ensuite les lignes dont la données 1 en colonne D ensuite les lignes avec la mention 2, après 3 ... MAIS ENTRE CHAQUE CATEGORIE COMMENT PUIS JE LES SEPARER DE DEUX LIGNES VIDES PAR EXEMPLE, donc entre VS et 1 deux lignes vides, entre 1 et 2 deux lignes vides etc...

J'espère m'être bien fait comprendre, merci d'avance de votre aide
 

MikeBelgique

XLDnaute Occasionnel
Bonjour Zebanx,
Merci pour ton aide rapide, en testant il apparait bien laisser deux lignes vides entre chaque catégorie, toutefois si je mélange les lignes de mes données, il ne me regroupe pas les catégories ensemble, tous les vs ensemble, tous les 1 ensemble etc... mais me les laisse dans l'ordre tapé en laissant bien deux lignes vides entre chaque. Le but est de pouvoir introduire les lignes de données sans être déjà en colonne D dans le bon ordre en les tapant et de faire le tri après, contrairement à tes données en sav qui elles sont déjà toutes dans le bon ordre.
J'aurais du le spécifier au départ, désolé.
 

MikeBelgique

XLDnaute Occasionnel
Je sais je parais chinois, j'aurais dû commencer par cela

voici un fichier exemple, et du coup en le faisant j'ai rajouté une colonne donc le tri se fera sur E et non D, la bd est effacée chaque jour et les nouvelles données rentrées chaque jour peuvent variée sur un tableau comprenant plus de lignes. voir 3ème feuille "bd", merci
 

Pièces jointes

  • ESSAIS TRI 1.xls
    43.5 KB · Affichages: 18

zebanx

XLDnaute Accro
Re-
Un peu de difficulté à trier lettres et chiffres.
Ca devrait fonctionner. A tester sur une grosse plage.
Attention aux bornes à modifier dans le code (si tu ne t'arrêtes pas à la colonne " F" ou si la dernière ligne n'est pas sur la première colonne).
++
 

Pièces jointes

  • ESSAIS TRI 1.xls
    62.5 KB · Affichages: 27

job75

XLDnaute Barbatruc
Bonjour MikeBelgique, zebanx, le forum,

Bon travail zebanx mais si le tableau est vraiment grand l'insertion des lignes prendra beaucoup de temps.

Pour aller vite il faut utiliser des tableaux VBA :
Code:
Sub TRI()
Dim Tablo As Range, N° As Range, Voyage As Range, Heure As Range, t, ub&, numero(), i&, n&, p&, Auxiliaire As Range
'---à adapter éventuellement---
Set Tablo = Sheets("bd").[A:F]
Set N° = Tablo.Columns(1)
Set Voyage = Tablo.Columns(5)
Set Heure = Tablo.Columns(6)
Application.ScreenUpdating = False
On Error Resume Next 'si aucune SpecialCell
'---tris---
Tablo.Sort Voyage, xlAscending, N°, , xlAscending, Header:=xlYes
Intersect(Tablo, Voyage.SpecialCells(xlCellTypeBlanks).EntireRow).Sort Heure, xlAscending, N°, , xlAscending, Header:=xlNo
'---numérotation des lignes en colonne auxiliaire G---
With Tablo.CurrentRegion
  Intersect(.Offset(1), Voyage.SpecialCells(xlCellTypeConstants, 2).EntireRow).Cut 'coupe les lignes des textes en colonne E
  If Application.CutCopyMode Then .Rows(2).Insert 'insère les lignes des textes au début du tableau
  t = Voyage.Resize(.Rows.Count, 2) 'matrice plus rapide, au moins 2 éléments
  ub = UBound(t)
  ReDim numero(1 To Rows.Count, 1 To 1)
  numero(2, 1) = 0
  For i = 3 To ub
    If t(i, 1) <> t(i - 1, 1) Then 'ajoute 2 lignes au tableau numero
      n = n + 1: p = p + 1: numero(ub + p, 1) = n
      n = n + 1: p = p + 1: numero(ub + p, 1) = n
    End If
    n = n + 1
    numero(i, 1) = n
  Next
  Set Auxiliaire = Tablo.Columns(Tablo.Columns.Count + 1).Resize(ub + p)
  Auxiliaire = numero 'restitution
  .Resize(ub + p, Auxiliaire.Column).Sort Auxiliaire, xlAscending, Header:=xlYes 'tri final sur G
End With
'---bordures---
Tablo.Borders.LineStyle = xlNone 'RAZ
With Tablo.CurrentRegion.Resize(, Auxiliaire.Column - 1)
  .Borders.Weight = xlThin
  For i = 7 To 10: .Borders(i).Weight = xlMedium: Next
  Auxiliaire.Resize(ub + p).ClearContents 'efface la colonne auxiliaire G
  .Offset(.Rows.Count).Resize(Rows.Count - .Rows.Count).Delete xlUp 'nettoyage sous le tableau
End With
With Tablo.Parent.UsedRange: End With 'actualise les barres de défilement
End Sub
Il n'y a pas insertion de lignes, seulement des tris.

Nota : avec ce code la colonne "Voyage" doit toujours avoir un titre sinon le 2ème tri ne se fait pas.

Fichier joint.

Bonne journée.
 

Pièces jointes

  • ESSAIS TRI(1).xls
    94.5 KB · Affichages: 28
Dernière édition:

zebanx

XLDnaute Accro
Bonjour Job75, MikeBelgique, le forum

Merci @job75 pour ce code

Testé sur 30000 lignes :
ton code < 1s
le mien = 97s (avec l'ajout d'un xlcalulationmanual de surcroit).

Mike a son résultat, j'ai de la matière à utiliser pour bien comprendre ton code et savoir adapter le premier code proposé pour savoir surtout où sont les pertes de temps.

Pas pour proposer une autre solution, mais pour progresser dans ce type d'approche.
Un exemple : pas une seule fois "derniereligne" n'est utilisé dans ton code.
Pour moi, ça reste un incontournable.
Donc c'est intéressant à regarder.

Je te remercie donc beaucoup pour avoir travaillé sur le sujet et restitué un code aussi performant et dont on peut voir une grande partie de l'exécution en pas à pas détaillé (sans debug.Print).

Bonne journée
zebanx

ps : peux tu redonner le code complet stp ou un nouveau fichier (suite #10) ? Merci.
 

MikeBelgique

XLDnaute Occasionnel
Merci à tous deux pour votre implication et ce travail rendu, merci Job pour cette soluce supplémentaire et ce travail au top, décidément ce site ne pourrait être aussi fabuleux sans votre travail, astuce, soluces, donnés sans compté, qui depuis mon inscription ont pu me permettre d'établir au sein de ma profession des programmes qui aident grandement au quotidien mes collègues de travail. Merci à vous, à ce site et toutes les personnes qui ont contribué depuis tant d'années à l'élaboration d'un savoir mis à disposition et d'une aide rapide et efficace au néophyte comme moi.

Merci
 

zebanx

XLDnaute Accro
Bonjour Mike, Re- Job75

Merci pour ton retour -)

@job75
Je plussoie, gros code.

Quand tu auras un moment, pourrais-tu s'il te plait m'apporter quelques précisions sur les 3 lignes suivantes :

1.1 Intersect(.Offset(1), Voyage.SpecialCells(xlCellTypeConstants, 2).EntireRow)

- Quelle range va-t-on rechercher stp ?
- Aurais-tu un autre petit fichier utilisant INTERSECT pour mieux comprendre la méthode stp (ou à défaut, quand l'utilises tu stp ? était-il possible pour ce code de l'utiliser sur un range limité plutôt que sur les colonnes "A:F" ? (si par exemple on avait 2 gros tableaux qui se suivaient))

1.2 For i = 7 To 10: .Borders(i).Weight = xlMedium:
- ??? (chiffres non compris)

1.3 .Offset(.Rows.Count).Resize(Rows.Count - .Rows.Count).Delete
- rouge : sur quelle ligne le code est-il positionné stp ?
- bleu : ??? (pas compris)

Je te remercie par avance pour ces précisions.
bonne fin de journée.

zebanx


ps :

- code proposé #6 (mon code) : en retriant au départ et une suppression des lignes vides, je limite à 6 secondes l'exécution sur 30 000 lignes. C'est déjà mieux.

- ce code #6 est trop limité : il ne fait que remplacer le terme "VP" par "0" avant de le remettre après tri dans son "jus" original. Mais il ne prend pas différents noms, contrairement au tient. Son utilisation est vraiment restreinte.
 
Dernière édition:

Discussions similaires

Réponses
18
Affichages
566

Statistiques des forums

Discussions
312 338
Messages
2 087 397
Membres
103 536
dernier inscrit
komivi