Liste des tableaux VBA

Table des matières

Un objet ArrayList est similaire à un objet Collection mais il a beaucoup plus de méthodes et de propriétés, et donc une flexibilité beaucoup plus grande du point de vue de la programmation.

Un objet Collection n'a que deux méthodes (Add, Remove) et deux propriétés (Count, Item) alors qu'une Array List en a beaucoup plus. De plus, l'objet Collection est en lecture seule. Une fois les valeurs ajoutées, la valeur indexée ne peut pas être modifiée, alors que sur une liste de tableaux, l'édition est possible.

De nombreuses méthodes de liste de tableaux utilisent des paramètres. Contrairement à la plupart des méthodes VBA standard, aucun de ces paramètres n'est facultatif. En outre, certaines méthodes et propriétés ne sont pas toujours en majuscule lorsqu'elles sont entrées de la même manière que dans Excel VBA. Cependant, ils fonctionnent toujours.

L'objet ArrayList s'agrandit et se contracte en fonction du nombre d'éléments qu'il contient. Il n'a pas besoin d'être dimensionné avant utilisation comme un Array.

La liste de tableaux est unidimensionnelle (identique à l'objet Collection) et le type de données par défaut est Variant, ce qui signifie qu'elle accepte tout type de données, qu'elles soient numériques, textuelles ou de date.

À bien des égards, la liste de tableaux résout un certain nombre de lacunes de l'objet Collection. Il est certainement beaucoup plus flexible dans ce qu'il peut faire.

L'objet Array List ne fait pas partie de la bibliothèque VBA standard. Vous pouvez l'utiliser dans votre code Excel VBA en utilisant une liaison tardive ou anticipée

1234 Sub LateBindingExample()Dim MyList en tant qu'objetDéfinir MyList = CreateObject("System.Collections.ArrayList")Fin du sous-marin
123 Sub EarlyBindingExample()Dim MyList en tant que nouvelle liste de tableauxFin du sous-marin

Pour utiliser l'exemple de liaison anticipée, vous devez d'abord entrer une référence dans VBA au fichier 'mscorlib.tlb'

Pour ce faire, sélectionnez « Outils | Références ' à partir de la fenêtre Visual Basic Editor (VBE). Une fenêtre pop-up apparaîtra avec toutes les références disponibles. Faites défiler jusqu'à « mscorlib.dll » et cochez la case à côté. Cliquez sur OK et cette bibliothèque fait maintenant partie de votre projet :

L'un des gros inconvénients d'un objet Array List est qu'il n'a pas « Intellisense ». Normalement, lorsque vous utilisez un objet dans VBA tel qu'une plage, vous verrez une liste contextuelle de toutes les propriétés et méthodes disponibles. Vous n'obtenez pas cela avec un objet Array List, et il faut parfois une vérification minutieuse pour s'assurer que vous avez correctement orthographié la méthode ou la propriété.

De plus, si vous appuyez sur F2 dans la fenêtre VBE et recherchez sur « arraylist », rien ne s'affichera, ce qui n'est pas très utile pour un développeur.

Votre code s'exécutera considérablement plus rapidement avec une liaison anticipée, car tout est compilé à l'avance. Avec la liaison tardive, l'objet doit être compilé pendant l'exécution du code

Distribution de votre application Excel contenant une liste de tableaux

Comme déjà souligné, l'objet ArrayList ne fait pas partie d'Excel VBA. Cela signifie que l'un de vos collègues à qui vous distribuez l'application doit avoir accès au fichier 'mscorlib.tlb'

Ce fichier se trouve normalement dans :

C:\Windows\Microsoft.NET\Framework\v4.0.30319

Il pourrait être utile d'écrire du code (à l'aide de la méthode Dir) pour vérifier que ce fichier existe lorsqu'un utilisateur charge l'application afin qu'il subisse un « atterrissage en douceur » s'il n'est pas trouvé. S'il n'est pas présent et que le code s'exécute, des erreurs se produiront.

En outre, l'utilisateur doit avoir installé la version correcte de .Net Framework. Même si l'utilisateur a une version plus récente, la V3.5 doit être installée sinon votre application ne fonctionnera pas

Portée d'un objet de liste de tableau

En termes de portée, l'objet Array List n'est disponible que lorsque le classeur est ouvert. Il n'est pas enregistré lorsque le classeur est enregistré. Si le classeur est rouvert, l'objet Array List doit être recréé à l'aide du code VBA.

Si vous souhaitez que votre liste de tableaux soit disponible pour tout le code de votre module de code, vous devez déclarer l'objet Liste de tableaux dans la section Déclarer tout en haut de la fenêtre du module.

Cela garantira que tout votre code dans ce module peut accéder à la liste des tableaux. Si vous souhaitez qu'un module de votre classeur accède à l'objet Array List, définissez-le en tant qu'objet global

1 Global MyCollection As New ArrayList

Remplissage et lecture à partir de votre liste de tableaux

L'action la plus élémentaire que vous souhaitez effectuer est de créer une liste de tableaux, d'y mettre des données, puis de prouver que les données peuvent être lues. Tous les exemples de code de cet article supposent que vous utilisez une liaison anticipée et que vous avez ajouté « mscorlib.tlb » aux références VBA, comme décrit ci-dessus

123456789101112 Sub ArrayListExample()'Créer un nouvel objet de liste de tableauxDim MyList en tant que nouvelle liste de tableaux« Ajouter des éléments à la listeMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Itérer dans la liste des tableaux pour prouver les valeursPour N = 0 à MyList.Count - 1MsgBox MaListe(N)N suivantFin du sous-marin

Cet exemple crée un nouvel objet ArrayList, le remplit avec 3 éléments et parcourt la liste affichant chaque élément.

Notez que l'index ArrayList commence à 0, pas 1, vous devez donc soustraire 1 de la valeur Count

Vous pouvez également utiliser une boucle « Pour… chaque » pour lire les valeurs :

123456789101112 Sub ArrayListExample()'Créer un nouvel objet de liste de tableauxDim MyList en tant que nouvelle liste de tableaux« Ajouter des éléments à la listeMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Itérer dans la liste des tableaux pour prouver les valeursPour chaque I dans MyListMsgBox IEnsuite jeFin du sous-marin

Modification et modification d'éléments dans une liste de tableaux

Un avantage majeur d'une liste de tableaux par rapport à une collection est que les éléments de la liste peuvent être modifiés et modifiés dans votre code. L'objet Collection est en lecture seule alors que l'objet Array List est en lecture/écriture

123456789101112131415 Sub ArrayListExample()'Créer un nouvel objet de liste de tableauxDim MyList en tant que nouvelle liste de tableaux« Ajouter des éléments à la listeMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"« Modifier l'élément 1 de « élément2 » en « Modifié »MaListe(1) = "Modifié"'Itérer dans la liste des tableaux pour prouver que le changement a fonctionnéPour chaque I dans MyList« Afficher le nom de l'élémentMsgBox IEnsuite jeFin du sous-marin

Dans cet exemple, le deuxième élément, « Item2 » est modifié en la valeur « Changed » (rappelez-vous que l'index commence à 0). Lorsque l'itération est exécutée à la fin du code, la nouvelle valeur sera affichée

Ajout d'un tableau de valeurs à une liste de tableaux

Vous pouvez entrer des valeurs dans votre liste de tableaux en utilisant un tableau contenant une liste de ces valeurs ou des références à des valeurs de cellules sur une feuille de calcul

123456789101112131415161718 Sub AddArrayExample()'Créer un objet de liste de tableauxDim MyList en tant que nouvelle liste de tableaux'parcourir les valeurs du tableau en les ajoutant à la liste du tableauPour chaque v dans le tableau("A1", "A2", "A3")'Ajouter chaque valeur de tableau à la listeMaListe.Ajouter vProchain'parcourir les valeurs du tableau avec des références de feuille de calcul en les ajoutant à la liste du tableauPour chaque v dans le tableau(Plage("A5").Valeur, Plage("A6").Valeur)MaListe.Ajouter vProchain'Itérer dans la liste des tableaux pour prouver les valeursPour N = 0 à MyList.Count - 1« Afficher l'élément de la listeMsgBox MaListe.Item(N)N suivantFin du sous-marin

Lecture/Récupération d'une plage d'éléments à partir d'une liste de tableaux

En utilisant la méthode GetRange sur une liste de tableaux, vous pouvez spécifier une plage d'éléments consécutifs à récupérer. Les deux paramètres requis sont la position de l'index de départ et le nombre d'éléments à récupérer. Le code remplit un deuxième objet Array List avec le sous-ensemble d'éléments qui peuvent ensuite être lus séparément.

123456789101112131415161718 Sous ReadRangeExample()'Définir les objetsDim MyList As New ArrayList, MyList1 As Object« Ajouter des éléments à l'objet « MyList »MyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item6"MyList.Add "Item4"MyList.Add "Item7"« Capturez 4 éléments dans « MyList » à partir de la position d'index 2Définir MyList1 = MyList.GetRange(2, 4)'Itérer à travers l'objet 'MyList1' pour afficher le sous-ensemble d'élémentsPour chaque I dans MyList1« Afficher le nom de l'élémentMsgBox IEnsuite jeFin du sous-marin

Recherche d'éléments dans une liste de tableaux

Vous pouvez tester si un élément nommé est dans votre liste en utilisant la méthode « Contient ». Cela retournera True ou False

1 MsgBox MyList.Contains("Item2")

Vous pouvez également trouver la position réelle de l'index en utilisant la méthode 'IndexOf'. Vous devez spécifier l'index de début de la recherche (généralement 0). La valeur de retour est l'index de la première instance de l'élément trouvé. Vous pouvez ensuite utiliser une boucle pour modifier le point de départ vers la valeur d'index suivante afin de rechercher d'autres instances s'il existe plusieurs valeurs en double.

Si la valeur n'est pas trouvée, une valeur de -1 est renvoyée

Cet exemple illustre l'utilisation de « Contient », l'élément introuvable et la boucle dans la liste des tableaux pour trouver la position de tous les éléments en double :

1234567891011121314151617181920212223242526 Sub SearchListExample()'Définir la liste de tableaux et les variablesDim MyList en tant que nouvelle liste de tableaux, Sp en tant qu'entier, Pos en tant qu'entier« Ajouter de nouveaux éléments, y compris un doublonMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"'Test pour "Item2" étant dans la liste - renvoie TrueMsgBox MyList.Contains("Item2")'Obtenir l'indice de valeur inexistante - renvoie -1MsgBox MaListe.IndexOf("Item", 0)‘Régler la position de départ de la recherche à zéroSp = 0'Itérer dans la liste pour obtenir toutes les positions de 'Item1'Faire« Obtenir la position d'index du prochain « Item1 » en fonction de la position dans la variable « Sp »Pos = MaListe.IndexOf("Item1", Sp)'Si aucune autre instance de 'Item1' n'est trouvée, quittez la boucleSi Pos = -1 Alors Quitter Do'Affiche la prochaine instance trouvée et la position de l'indexMsgBox MyList(Pos) & " à l'index " & Pos'Ajouter 1 à la dernière valeur d'index trouvée - cela devient maintenant la nouvelle position de départ pour la prochaine rechercheSp = Pos + 1BoucleFin du sous-marin

Notez que le texte de recherche utilisé est sensible à la casse et que les caractères génériques ne sont pas acceptés.

Insertion et suppression d'éléments

Si vous ne souhaitez pas ajouter vos éléments à la fin de la liste, vous pouvez les insérer à une position d'index particulière afin que le nouvel élément se trouve au milieu de la liste. Les numéros d'index seront automatiquement ajustés pour les éléments suivants.

123456789101112131415 Sub InsertExample()'Définir l'objet liste de tableauxDim MyList en tant que nouvelle liste de tableaux'Ajouter des éléments à la liste des tableauxMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"« Insérer « Article 6 » à la position d'index 2MyList.Insert 2, "Item6"'Itérer à travers les éléments de la liste du tableau pour afficher le nouvel ordre et la position de l'indexPour N = 0 à MyList.Count - 1MsgBox MaListe(N) & " Index " & NN suivantFin du sous-marin

Dans cet exemple, 'Item6' est ajouté à la liste à la position d'index 2, donc l''item3' qui était à la position d'index 2 se déplace maintenant à la position d'index 3

Un élément individuel peut être supprimé en utilisant la méthode « Supprimer ».

1 MyList.Remove "Item"

Notez qu'aucune erreur ne se produit si le nom de l'élément n'est pas trouvé. Tous les numéros d'index suivants seront modifiés pour s'adapter à la suppression.

Si vous connaissez la position d'index de l'élément, vous pouvez utiliser la méthode 'RemoveAt', par ex.

1 MaListe.Supprimer à 2

Notez que si la position d'index donnée est supérieure au nombre d'éléments dans la liste du tableau, une erreur sera renvoyée.

Vous pouvez supprimer une plage de valeurs de la liste en utilisant la méthode « RemoveRange ». Les paramètres sont l'index de départ, puis le nombre d'éléments à supprimer, par ex.

1 MaListe.SupprimerPlage 3, 2

Notez que vous obtiendrez une erreur dans votre code si le nombre d'éléments décalés par rapport à la valeur de départ est supérieur au nombre d'éléments dans la liste du tableau.

Dans les deux méthodes 'RemoveAt' et 'RemoveRange', un code serait conseillé pour vérifier si les numéros d'index spécifiés sont supérieurs au nombre total d'éléments dans la liste du tableau afin de piéger toute erreur possible. La propriété 'Count' donnera le nombre total d'éléments dans la liste du tableau.

12345678910111213141516171819202122232425 Sous-SupprimerExample()'Définir l'objet liste de tableauxDim MyList en tant que nouvelle liste de tableaux'Ajouter des éléments à la liste des tableauxMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"MyList.Add "Item1"MyList.Add "Item4"MyList.Add "Item5"« Insérer « Article 6 » à la position d'index 2MyList.Insert 2, "Item6"« Supprimer « Article2 »MyList.Remove "Item2"'Supprimer 'Item' - cela n'existe pas dans la liste des tableaux mais n'a pas d'erreurMyList.Remove "Item"'Retirer l'élément à la position d'index 2MaListe.Supprimer à 2'Supprimer 2 éléments consécutifs en commençant à la position d'index 2MaListe.SupprimerPlage 3, 2'Itérer dans la liste des tableaux pour montrer ce qui reste et dans quelle position d'index il se trouve maintenantPour N = 0 à MyList.Count - 1MsgBox MaListe(N) & " Index " & NN suivantFin du sous-marin

Notez que si vous utilisez « RemoveAt » pour supprimer un élément à une position spécifique, dès que cet élément est supprimé, toutes les positions d'index suivantes sont modifiées. Si vous avez plusieurs suppressions à l'aide de la position d'index, une bonne idée est de commencer par le numéro d'index le plus élevé et de revenir en arrière jusqu'à la position zéro afin de toujours supprimer le bon élément. De cette façon, vous n'aurez pas le problème

Tri d'une liste de tableaux

Un autre gros avantage par rapport à une collection est que vous pouvez trier les éléments par ordre croissant ou décroissant.

L'objet Liste de tableaux est le seul objet dans Excel VBA avec une méthode de tri. La méthode de tri est très rapide et cela peut être une considération importante pour l'utilisation d'une liste de tableaux.

Dans l'objet de collection, une réflexion « out of the box » était nécessaire pour trier tous les éléments, mais avec une liste de tableaux, c'est très simple.

La méthode 'Sort' trie par ordre croissant et la méthode 'Reverse' trie par ordre décroissant.

12345678910111213141516171819202122 Sub ArrayListExample()'Créer un objet de liste de tableauxDim MyList en tant que nouvelle liste de tableaux‘Ajouter des articles dans un ordre non triéMyList.Add "Item1"MyList.Add "Item3"MyList.Add "Item2"'Trier les éléments par ordre croissantMaListe.Tri'Itérer à travers les éléments pour afficher l'ordre croissantPour chaque I dans MyList« Afficher le nom de l'élémentMsgBox IEnsuite je'Trier les éléments par ordre décroissantMaListe.Reverse'Itérer à travers les éléments pour afficher l'ordre décroissantPour chaque I dans MyList« Afficher le nom de l'élémentMsgBox IEnsuite jeFin du sous-marin

Clonage d'une liste de tableaux

Une liste de tableaux a la possibilité de créer un clone ou une copie d'elle-même. Ceci est utile si un utilisateur apporte des modifications aux éléments à l'aide d'un frontal et de votre code VBA, mais vous devez conserver une copie des éléments dans leur état d'origine en tant que sauvegarde.

Cela pourrait fournir à l'utilisateur une fonction « Annuler ». Ils ont peut-être apporté les modifications et souhaitent revenir à la liste d'origine.

123456789101112131415 Exemple de sous-clone()'Définir deux objets - liste de tableaux et un objetDim MyList As New ArrayList, MyList1 As Object« Remplir le premier objet avec des élémentsMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Copier ma liste dans ma liste1Définir MyList1 = MyList.Clone'Itérer sur MyList1 pour prouver le clonagePour chaque I dans MyList1« Afficher le nom de l'élémentMsgBox IEnsuite jeFin du sous-marin

« MyList1 » contient désormais tous les éléments de « MyList » dans le même ordre

Copie d'un tableau de liste dans un objet tableau VBA conventionnel

Vous pouvez utiliser une méthode simple pour copier la liste des tableaux dans un tableau VBA normal :

123456789101112131415 Exemple de sous-tableau()'Créer un objet de liste de tableaux et un objet de tableau standardDim MyList en tant que nouvelle liste de tableaux, NewArray en tant que variante'Remplir la liste des tableaux avec des élémentsMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"'Copier la liste des tableaux dans le nouveau tableauNouveauTableau = MaListe.VersTableau'Itérer dans le nouveau tableau - notez que le nombre de listes de tableaux fournit l'index maximumPour N = 0 à MyList.Count - 1« Afficher le nom de l'élémentMsgBox NewArray(N)N suivantFin du sous-marin

Copie d'un tableau de liste dans une plage de feuille de calcul

Vous pouvez copier votre liste de tableaux dans une feuille de calcul et une référence de cellule spécifiques sans avoir à parcourir la liste de tableaux. Vous n'avez qu'à spécifier la première référence de cellule

123456789101112131415 Exemple de sous-plage()'Créer un nouvel objet de liste de tableauxDim MyList en tant que nouvelle liste de tableaux« Ajouter des éléments à la listeMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"‘Effacer la feuille cibleSheets("Sheet1").UsedRange.Clear'Copier les éléments sur une ligneSheets("Sheet1").Range("A1").Resize(1, MyList.Count).Value = MyList.toArray'Copier les éléments dans une colonneSheets("Sheet1").Range("A5").Resize(MyList.Count, 1).Value = _WorksheetFunction.Transpose(MyList.toArray)Fin du sous-marin

Vider tous les éléments d'une liste de tableaux

Il existe une fonction simple (Clear) pour effacer complètement la liste des tableaux

1234567891011121314 Sous ClearListExample()'Créer un objet liste de tableauxDim MyList en tant que nouvelle liste de tableaux« Ajouter de nouveaux élémentsMyList.Add "Item1"MyList.Add "Item2"MyList.Add "Item3"« Afficher le nombre d'articlesMsgBox MaListe.Count« Effacer tous les élémentsMaListe.Effacer'Afficher le nombre d'éléments pour prouver que clear a fonctionnéMsgBox MaListe.CountFin du sous-marin

Cet exemple crée des éléments dans une liste de tableaux, puis efface la liste de tableaux. Les boîtes de message prouvent avant et après le nombre d'éléments dans la liste du tableau.

Résumé des méthodes de liste de tableaux pour Excel VBA

Tâche Paramètres Exemples
Ajouter/Modifier un élément Valeur MaListe.Ajouter "Item1"
MaListe(4)= « Article2 »
Cloner une liste de tableaux Rien Dim MyList en tant qu'objet
Définir MyList2 = MyList.Clone
Copier dans le tableau Rien Dim MyArray comme variante
MonTableau = MaListe.VersTableau
Copier dans une plage de feuille de calcul (ligne) Rien Sheets("Sheet1").Range("A1").Resize(1, MyList.Count).Value = MyList.ToArray
Copier dans une plage de feuille de calcul (colonne) Rien Sheets("Sheet1").Range("A3").Resize(MyList.Count, 1).Value = WorksheetFunction.Transpose(MyList.ToArray)
Créer "System.Collections.ArrayList" Dim MyList en tant qu'objet
Définir MyList = CreateObject ("System.Collections.ArrayList")
Déclarer N / A Dim MyList en tant qu'objet
Rechercher/vérifier si l'article existe Article à trouver MaListe.Contient(“Item2”)
Trouver la position d'un élément dans la ArrayList 1. Objet à rechercher. Dim IndexNon Aussi longtemps
2. Position à partir de laquelle commencer la recherche. IndexNo = MaListe.IndexOf("Item3", 0)
IndexNo = MaListe.IndexOf("Item5", 3)
Obtenir le nombre d'articles Rien MsgBox MaListe.Count
Insérer un élément 1. Index - position à insérer. MaListe.Insérer 0, "Item5"
2 Valeur - objet ou valeur à insérer. MyList.Insert 4, "Item7"
Lire l'article Index - entier long MsgBox MaListe.Item(0)
MsgBox MaListe.Item(4)
Lire l'élément ajouté en dernier Index - entier long MsgBox MaListe.Item(list.Count - 1)
Lire l'élément ajouté en premier Index - entier long MsgBox MaListe.Item(0)
Lire tous les éléments (pour chacun) N / A Élément de gradation en tant que variante
Pour chaque élément de MyList
Élément MsgBox
Élément suivant
Lire tous les articles (Pour) Index - entier long Dim j'aussi longtemps
Pour i = 0 à MyList.Count - 1
MsgBox je
Ensuite je
Supprimer tous les éléments Rien MaListe.Effacer
Supprimer l'élément à la position Position de l'index où se trouve l'élément MaListe.SupprimerÀ 5
Supprimer l'élément par son nom L'élément à supprimer de la ArrayList MaListe.Supprimer "Item3"
Supprimer une plage d'articles 1. Index - position de départ. MyList.RemoveRange 4,3
2. Count - le nombre d'éléments à supprimer.
Trier par ordre décroissant Rien MaListe.Reverse
Trier par ordre croissant Non MaListe.Tri
wave wave wave wave wave