XL 2019 Tri d'un tableau en vba

netparty

XLDnaute Occasionnel
Bonjour à tous

Je cherche le moyen de trier mon tableau, certaine ligne comporte des valeurs en V et W et j'aimerais que cette ligne soit dupliquée juste en dessous et que la valeur dans W soie placée en V de la ligne dupliquée.

Je joint un fichier cela sera plus clair car j'y ai placé un exemple.

Merci d'avance

bonne journée
 

Pièces jointes

  • Classeur1.xlsm
    32.3 KB · Affichages: 5

job75

XLDnaute Barbatruc
Bonsoir netparty, Phil69970,

Si le tableau est grand pour aller vite il faut travailler sur des tableaux VBA.

Voyez le fichier joint et cette macro dans le code de la feuille "Résultat" :
VB:
Private Sub Worksheet_Activate()
Dim col%, ncol%, tablo, resu(), i&, n&, j%
col = 23 'colonne W
With Sheets("Feuil2").[A1].CurrentRegion
    ncol = IIf(.Columns.Count < col, col, .Columns.Count)
    tablo = .Resize(, ncol) 'matrice, plus rapide
    ReDim resu(1 To UBound(tablo) + Application.CountA(.Columns(col).Offset(1)), 1 To ncol - 1)
End With
For i = 1 To UBound(tablo)
    n = n + 1
    For j = 1 To ncol
        resu(n, j + (j > col)) = tablo(i, j) 'décalage APRES W (True => -1)
    Next j
    If n = 1 Then resu(n, col - 1) = "ADRESSE"
    If tablo(i, col) <> "" And n > 1 Then
        n = n + 1
        For j = 1 To ncol
            resu(n, j + (j >= col)) = tablo(i, j) 'décalage A PARTIR de W
        Next j
    End If
Next i
'---restitution---
Application.ScreenUpdating = False
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A1] '1ère cellule de restitution
    .Resize(n, ncol - 1) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, ncol - 1).ClearContents 'RAZ en dessous
End With
Columns.AutoFit 'ajustement largeurs
Cells.HorizontalAlignment = xlCenter 'centrage
End Sub
Elle se déclenche quand on active la feuille.

Edit : j'ai testé en recopiant le tableau A2:X25 sur 12 000 lignes (seulement).

Chez moi cette macro s'exécute en 0,5 seconde.

La macro du poste #2 s'exécute en 15 secondes.

Bonne nuit.
 

Pièces jointes

  • Classeur(1).xlsm
    39.7 KB · Affichages: 2
Dernière édition:

netparty

XLDnaute Occasionnel
Bonsoir netparty, Phil69970,

Si le tableau est grand pour aller vite il faut travailler sur des tableaux VBA.

Voyez le fichier joint et cette macro dans le code de la feuille "Résultat" :
VB:
Private Sub Worksheet_Activate()
Dim col%, ncol%, tablo, resu(), i&, n&, j%
col = 23 'colonne W
With Sheets("Feuil2").[A1].CurrentRegion
    ncol = IIf(.Columns.Count < col, col, .Columns.Count)
    tablo = .Resize(, ncol) 'matrice, plus rapide
    ReDim resu(1 To UBound(tablo) + Application.CountA(.Columns(col).Offset(1)), 1 To ncol - 1)
End With
For i = 1 To UBound(tablo)
    n = n + 1
    For j = 1 To ncol
        resu(n, j + (j > col)) = tablo(i, j) 'décalage APRES W (True => -1)
    Next j
    If n = 1 Then resu(n, col - 1) = "ADRESSE"
    If tablo(i, col) <> "" And n > 1 Then
        n = n + 1
        For j = 1 To ncol
            resu(n, j + (j >= col)) = tablo(i, j) 'décalage A PARTIR de W
        Next j
    End If
Next i
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A1] '1ère cellule de restitution
    .Resize(n, ncol - 1) = resu
    .Offset(n).Resize(Rows.Count - n - .Row + 1, ncol - 1).ClearContents 'RAZ en dessous
End With
Columns.AutoFit 'ajustement largeurs
Cells.HorizontalAlignment = xlCenter 'centrage
End Sub
Elle se déclenche quand on active la feuille.

Edit : j'ai testé en recopiant le tableau A2:X25 sur 12 000 lignes (seulement).

Chez moi cette macro s'exécute en 0,5 seconde.

La macro du poste #2 s'exécute en 15 secondes.

Bonne nuit.
Bonjour @job75

Merci pour ton aide ton fichier fonctionne nickel

Bonne journée
 

Discussions similaires

Réponses
8
Affichages
411

Statistiques des forums

Discussions
314 644
Messages
2 111 528
Membres
111 189
dernier inscrit
Laurent.