Arrays : inverser, mélanger des données

Quelques exemples de manipulations avec des arrays

Vous pouvez télécharger le classeur fc-pap-arrays qui illustre les exemples présentés sur les pages pas à pas traitant des arrays

Attention, le code présenté dans ce tutoriel et dans le classeur exemple a été écrit et vérifié avec la version 2010 d'excel. Certaines propriétés peuvent ne pas fonctionner avec des versions antérieures, et avec les versions Mac d'excel antérieures à 2011.
Merci d'utiliser les commentaires pour poser des questions directement en rapport avec CE tutoriel EXCLUSIVEMENT et de poser les questions sur vos développements particuliers sur le forum microsoft answers excel.

L'intérêt principal des array, c'est leur rapidité pour manipuler les données qui les contiennent.
Nous avons vu déjà  que pour sélectionner les lignes d'un tableau répondant à une condition et les copier ailleurs dans le classeur, il était près de 1000 fois plus rapide de transférer ces lignes dans un array et de réinjecter en une seule fois celui-ci dans la feuille de calcul plutôt que de faire cela ligne à ligne.

Les exemples d'utilisation des arrays sont extrêmement nombreux. Nous allons juste ici donner quelques utilisations très pratiques.
Une page particulière sera réservée au tri des données dans un array.

Inverser les données d'un array à une dimension
Inverser une colonne dans une feuille
mélanger une plage de données

Inverser les données d'un array à une dimension.

Pour inverser les mots d'une phrase, nous avons vu que l'on pouvait mettre chaque mot de la phrase dans un array et faire une boucle inverse (du dernier élément au premier) pour inverser les mots.
On peut également utiliser une fonction de ce type :
MaPhrase = "Il fait froid et sec ce matin"
Tblo = Split(MaPhrase, " ")

For i = LBound(Tblo) To UBound(Tblo) / 2
    Tmp = Tblo(UBound(Tblo) - i)
    Tblo(UBound(Tblo) - i) = Tblo(i)
    Tblo(i) = Tmp
Next i

Inverse = Join(Tblo, " ")
debug.print Inverse

Inverser une colonne dans une feuille

Rappel : lorsqu'on copie une plage de données de la feuille vers un array, celui-ci est toujours à 2 dimensions.
La macro suivante transfère le contenu de la colonne A dans un Array, inverse l'ordre des données et les colle ldans la colonne B.
Le principe ici est d'échanger le premier élément de l'array avec le dernier, le second avaec l'anvant dernier ....

Sub inversecolonne()
Dim tblo As Variant
Dim Tmp() As Variant
Dim Lim

with activesheet
tblo = .Range("A1:A365").Value
ReDim Tmp(1, 1)

For i = 1 To UBound(tblo, 1) / 2
    Tmp(1, 1) = tblo(UBound(tblo) - i + 1, 1)
    tblo(UBound(tblo) - i + 1, 1) = tblo(i, 1)
    tblo(i, 1) = Tmp(1, 1)
Next i

.Range("B1:B365").Value = tblo
end with

End Sub

Mélanger une plage de données de façon aléatoire

Voici une macro qui mélange toutes les données d'un tableau d'une feuille excel (lignes et colonnes mélangées).

Sub MelangeArray()
'Denis Michon, pour excelabo, 2011

'Attention, dans l'éditeur VBE, outils/références, cochez la référence à
' "Microsoft Scripting Runtime"
Dim Tblo(), Tblo2(), Dico As New Scripting.Dictionary, Dest As Range
Dim Sh As Worksheet, Cell As Range, d As Long, T As Double
Dim NbCells As Long, NbRows As Long, NbColumns As Integer
Dim Adr As String, NomFeuille As String, c As Long, b As Long

'*******Variable à définir**************
'adresse de la plage de données source
Adr = "A2:E500"
'Nom de l'onglet de la feuille des données source
NomFeuille = "ex2-mélange"
'****************************************
'Le tableau généré est copié à partir de la même ligne que
'le tableau original et à 2 colonnes à la droite de ce dernier
 
T = Timer
Application.ScreenUpdating = False
Application.EnableEvents = False

With Worksheets(NomFeuille)
    With .Range(Adr)
        NbCells = .Cells.Count
        NbRows = .Rows.Count
        NbColumns = .Columns.Count
        'Où seront copiées les résultats.
        Set Dest = Range(.Item(1, .Columns.Count + 2).Address).Resize(NbCells)
        For Each Cell In .Cells
            c = c + 1
            Dico.Add CStr(c), Cell.Value
        Next
     End With
End With

Tblo = ALEA2(NbCells, NbCells)
'la fonction alea2 est décrite et expliquée sur la page 
'Arrays : petites fonctions utiles
'http://www.excelabo.net/pasapas/arrays_fonctions_utiles

ReDim Tblo2(1 To NbRows, 1 To NbColumns)
c = 1: d = 1
For b = 1 To UBound(Tblo)
    If c Mod NbRows = 0 Then
        Tblo2(c, d) = Dico(CStr(Tblo(b)))
        d = d + 1
        c = 1
    Else
        Tblo2(c, d) = Dico(CStr(Tblo(b)))
        c = c + 1
    End If
Next
'Copie des données dans la feuille
Dest.Resize(UBound(Tblo2, 1), UBound(Tblo2, 2)) = Tblo2
Application.ScreenUpdating = True
Application.EnableEvents = True

MsgBox Timer - T & " Secondes pour " & NbCells & " cellules."

End Sub

Mélanger les lignes d'un tableau

Cette macro modifie l'ordre des lignes dans un tableau à plusieurs colonnes (3 dans l'exemple)

Sub mélange2()
Dim T As Double
Dim Tblo

T = Timer
Tblo = Sheets("ex5-tri2").Range("A2:C36")
Tblo = ChambouleLignes(Tblo)
Sheets("ex5-tri2").Range("A2:C36") = Tblo
Debug.Print Timer - T
End Sub
Function ChambouleLignes(Tblo)

Dim Arr
Dim i As Long, j As Long
Dim Rd As Long
Dim NbCol As Long, NbLign As Long
Dim Tmp

NbLign = UBound(Tblo, 1)
NbCol = UBound(Tblo, 2)

 
ReDim Arr(1 To NbLign, 1 To NbCol)
For i = 1 To NbLign
  For j = 1 To NbCol
      Arr(i, j) = Tblo(i, j)
  Next j
Next i

Randomize Timer
For i = 1 To NbLign
    Rd = Int(Rnd * (NbLign + 1 - i)) + i 'merci à Laurent Longre !
    For j = 1 To NbCol
        Tmp = Arr(i, j)
        Arr(i, j) = Arr(Rd, j)
        Arr(Rd, j) = Tmp
    Next j
Next i
If NbLign = 1 Then
  ChambouleLignes = Application.Transpose(Arr)
Else
  ChambouleLignes = Arr
End If
End Function

Mots clefs associés à cette page : , , , ,