Filtrage 2D Tableaux dans Excel VBA
À l'aide d'Excel et de VBA, je voulais quelques conseils sur la meilleure façon de filtrer les données dans un tableau (de la même manière, on peut utiliser un tableau croisé dynamique) strictement à l'aide de VBA. Je suis entrain de créer un UserForm qui va rendre certaines données des décisions fondées sur des données existantes. Je peux visualiser comment le faire assez bien, mais ne suis pas du tout versé dans la programmation VBA.
Voici un exemple
A B C
bob 12 Small
sam 16 Large
sally 1346 Large
sam 13 Small
sally 65 Medium
bob 1 Medium
Extraire les données dans un Tableau, j'ai pu utiliser
Dim my_array As Variant
my_array = Range("A1").CurrentRegion
Maintenant, je suis familier avec boucle à travers des tableaux 2D, mais je me demandais: ce que le moyen le plus efficace pour filtrer les données du tableau 2D (sans boucle par le choix du temps et encore)?
Par exemple, comment puis-je obtenir serait de dire obtenir ce genre de données:
data_for_sally As Variant 'rows with sally as name in ColA
data_for_sally_less_than_ten As Variant ' all rows with sally's name in ColA and colB < 10
data_for_all_mediums as Variant ' all rows where ColC is Medium
Suggestions? J'ai pu faire ce travail avec un tas de fonctions personnalisées et des boucles, mais je pensais qu'il devait y avoir une meilleure façon. Merci.
Pas sûr que c'est possible sans boucle / fonctions personnalisées en VBA. Vous dites que vous avez de l'expérience dans d'autres langues, avez-vous considéré comme un VSTO/.NET impementation puis utiliser LINQ?
Pour ce type de chose en VBA je voudrais utiliser un jeu d'enregistrements ADO déconnecté. Il vous donne de tri et de filtrage.
bon point, enlevé exemple; .@lori_m je pensais le long de la lignes de Python, en fait; .@Tim Williams, je vais regarder à cela, n'ont pas entendu parler avant.
OriginalL'auteur thornomad | 2012-05-04
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous voulez utiliser VBA.
Je pense que cela dépend de plusieurs paramètres, notamment sur:
À partir d'un OO point de vue, en supposant que les performances (vitesse & mémoire) n'est pas un problème, je voudrais aller le dessin suivant (je ne rentrerai pas dans les détails de la mise en œuvre, uniquement à donner l'idée générale). Créer une classe (appelons imagination ArrayFilter) que vous pouvez utiliser comme ça.
Le programme d'installation le filtre
Ou
Créer les données filtrées ensemble
La getFilteredArray est assez simple à écrire: vous boucle sur le tableau de vérifier si les valeurs correspondent au filtre et de mettre de la validité de lignes dans un nouveau tableau:
Pros
Contre
ps: Si vous avez besoin de mettre en cache les résultats pour améliorer les performances, d'une façon serait de stocker les résultats dans un dictionnaire et ajouter un peu de logique à la getFilteredArray fonction. Notez qu'à moins que vos tableaux sont vraiment de gros et/ou d'exécuter le même filtre beaucoup, ce n'est probablement pas la peine.
De cette façon, lorsque vous appelez getFilteredArray la prochaine fois, vous pouvez faire quelque chose comme ceci:
Relisant, getFilteredArray devrait probablement être une fonction à l'intérieur de la ArrayFilter classe.
OriginalL'auteur assylias
Essayer cette
OriginalL'auteur Đức Thanh Nguyễn