Arrays : inverser, mélanger des données
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 : vba, trier, tri, dictionnaire, array
- Vous devez vous identifier ou créer un compte pour écrire des commentaires
