Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Excel] Tri alphanétique d'un tableau String()

Quel méthode en VBA?

Sujet résolu
    9 novembre 2017 à 10:01:29

    Bonjour à tous !

    J'ai beaucoup avancé sur un projet avec une macro pour mettre en forme une page récapitulative.

    J'ai eu beaucoup d'informations sur google etc, mais là je bloque et j'ai besoin de vous: Il ne me reste que cela avant de faire le ménage dans ma fonction pour diminuer sa taille et, donc, augmenter la vitesse d’exécution.

        ReDim Preserve ListeMOP(0 To NombreDeMOPUtile)  ' Redimensionne le tableau des MOP utilisés

    Qui intègre une liste qui prends la forme "MOP xx.y" (xx: nombre, y: lettre). Sauf qu'il les intègre dans le tableau dans le sens où il les trouve. j'obtiens donc par exemple:

    ListeMOP(1) = "MOP 02.A"
    ListeMOP(2) = "MOP 01.B"
    ListeMOP(3) = "MOP 01.A"
    ListeMOP(4) = "MOP 04.A"

    Comment puis-je m'y prendre pour obtenir:

    ListeMOP(1) = "MOP 01.A"
    ListeMOP(2) = "MOP 01.B"
    ListeMOP(3) = "MOP 02.A"
    ListeMOP(4) = "MOP 04.A"

    Je ne vois pas du tout comment m'y prendre pour ne pas inscrire dans des cellules, uniquement en VBA :(

    Merci par avance !

    Vincent


    -
    Edité par Vb.pix 9 novembre 2017 à 10:10:01

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2017 à 12:29:46

      Salut,

      Soit tu écris une fonction qui fera le tri.
      Soit tu transfert tes données dans une colonne, et fais faire le tri à Excel:

      Option Explicit
      Option Base 0
      
      Public Sub test()
          Dim wb As Excel.Workbook
          Dim ws As Excel.Worksheet
          Dim rng As Excel.Range
          Dim table(4) As String
          
          table(0) = "B"
          table(1) = "G"
          table(2) = "A"
          table(3) = "F"
          table(4) = "C"
          
          Set wb = ThisWorkbook
          Set ws = wb.Worksheets(1)
          Set rng = ws.Range("A1")
          transfertTableToRange rng, table
          ws.Sort.SortFields.Add Key:=rng, SortOn:=xlSortOnValues, Order:=xlAscending
          ws.Sort.Apply
          
          Set rng = ws.Range("A1:A5")
          transfertRangeToTable rng, table
          
          Set rng = Nothing
          Set ws = Nothing
          Set wb = Nothing
      End Sub
      
      Private Sub transfertTableToRange(ByVal startAt As Excel.Range, ByRef data() As String)
          Dim rng As Excel.Range
          Dim i As Integer
          
          Set rng = startAt
          For i = LBound(data) To UBound(data)
              rng.Value = data(i)
              Set rng = rng.Offset(rowoffset:=1)
          Next
          Set rng = Nothing
      End Sub
      
      Private Sub transfertRangeToTable(ByRef rng As Range, ByRef data() As String)
          Dim cell As Excel.Range
          Dim i As Integer
          
              '// contrat: Le tableau doit etre suffisement grand pour contenir les valeurs
          Debug.Assert (UBound(data) - LBound(data) + 1) >= rng.Cells.Count
          i = LBound(data)
          For Each cell In rng
              data(i) = cell.Value
              i = i + 1
          Next
      End Sub
      • Partager sur Facebook
      • Partager sur Twitter
        10 novembre 2017 à 9:14:40

        Merci pour ta réponse ! Il me semble qu'une petite partie de ton code peut m'aider grandement (et remplacer celui que j'ai).

        J'ai trouvé un truc sur internet qui fait le boulot, mais  je me dit que le tiens est peut être plus cours, et plus rapide à executer?

            Dim RefPremierMOP As Integer
            Dim i As Integer, j As Integer
            Dim TableauTemporaire
            
                RefPremierMOP = LBound(ListeMOP)
                For i = RefPremierMOP To NombreDeMOP - 1
                    For j = i To NombreDeMOP
                        If ListeMOP(i) > ListeMOP(j) Then
                    TableauTemporaire = ListeMOP(j)
                    ListeMOP(j) = ListeMOP(i)
                 ListeMOP(i) = TableauTemporaire
               End If
             Next j
           Next i



        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2017 à 12:31:48

          Je tire avantage des fonctionnalités d'Excel, sur une grande quantité de données, c'est probablement plus rapide.
          • Partager sur Facebook
          • Partager sur Twitter
            10 novembre 2017 à 14:58:43

            Merci pour tes informations !

            Le programme fonctionne avec le code posté, j'étudierai les modifications possible dans la prochaine version ;)

            Vincent

            • Partager sur Facebook
            • Partager sur Twitter

            [Excel] Tri alphanétique d'un tableau String()

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown