Les arrays: quelles fonctions principales ?

Bonjour à tous.

Pour ma macro et ma culture d'homme du monde, j'ai voulu me coller aux variables tableaux (arrays).

Je voulais éviter de passer par des copier-coller dans des cellules avec la panoplie de fonctions et méthodes qui fonctionnent parfaitement (countIf, match, find...).

Déjà, en français, le fait qu'array soit majoritairement traduit par "tableau" complique les recherches d'aides/tutos sur la toile.

J'avoue que j'en bave avec ces arrays: je suis à deux doigts d'arrayter.

Vraisemblablement, tout le monde loue la rapidité de traitement liée à l'utilisation des arrays et comme je cherche à étendre mes connaissances...

Bref, j'ai un tableau à 2 dimensions, dynamique, que je sais déclarer et dimensionner et redimensionner (quoique...).

Je ne suis pas compliqué, je cherche une PARTIE de chaîne de caractères dans les entrées de mon tableau sur UNE SEULE dimension.

J'ai épluché des pages et des pages en français, en anglais, ajouté à ma jeunesse en VBA et je n'arrive à rien...

Déjà, comment exprimer une dimension "complète" dans un tableau pour y effectuer une recherche ?

Ensuite, visiblement, pour des tableaux multidimensionnels, il n'y a que la fonction "match" d'utilisable pour effectuer des recherches.

Si je veux faire une recherche via "match" sur une seule dimension (un peu comme une recherche find dans une colonne entière), comment je l'écris (tableau typé string) ?

Application.WorksheetFunction.Match(Arg1:="-A", arg2:=monTableau(dimension_entière, index_de_ma_dimension), arg3:=0)

?

Parce que la plupart des exemples que j'ai pu voir traduisent une recherche d'un critère dans une entrée du tableau mais pas un critère de recherche qui correspond à une PARTIE de chaîne dans les entrées du tableau.

Visiblement, il n'est pas possible de faire autrement que de boucler ?

Il n'y a pas d’équivalent à CountIf ?

En gros, je cherche à vérifier si des numéros de série sont affublés d'un suffixe de type -A, -B, -BIS, /BIS (ex: 05-8761248-A, 54872-BIS)...

Si c'est le cas, je récupère la partie du n° de série sans ces -A, -B, -BIS, /BIS histoire de la comparer avec les autres entrées du tableaux

et ainsi trouver la/les éventuelle(s) correspondance(s) (il y a des n° de série "presque" identiques qui cohabitent: 54872 et 54872-BIS).

J'y arrive très bien sans les arrays parce qu'il y a des fonctions et méthodes associées à range.

Un autre exemple, j'ai dimensionné mon tableau dynamique, j'ai travaillé avec une seule dimension, l'ai redimensionné avec une deuxième dimension et sans utiliser preserve, le contenu de ma première dimension est toujours intact, non effacé.

Du coup, j'ai dû rajouté une boucle pour supprimer le contenu de ma première dimension pour que ma fonction MATCH ne cherche pas dans toute le dimensions du tableau vu que je ne sais pas préciser la recherche sur une seule dimension...

SI vous aviez quelques conseils, je suis preneur.

Merci d'avance pour votre aide.

Bonne matinée.

bonjour,

Effectivement pour les recherches, il n'y pas d'autre moyens que de boucler.

Cependant le temps de parcours d'un Array étant environ 20 fois plus rapide que celui d'une feuille Excel il y a avantage à parcourir un array plutôt qu'un tableau, même s'il faut parcourir les deux dimensions.

Pour les suffixe ou les préfixes on utilise souvent les fonctions Mid et Len et pour des positions imprévisibles à l'intérieur d'une chaine : Instr

Nota : Il y a rarement avantage à utiliser Redim personnellement je ne l'utilise quasiment jamais...

Pour d'autres réponses : Une question à la fois SVP et pièce jointe svp.

A+

Bonjour Galopin.

Merci de vous être attardé sur mon sujet.

Je me doutais bien qu'il n'y avait pas des milliers de possibilités pour faire des recherches.

Pour ce qui est de Mid, Len et autres, je les utilise beaucoup déjà.

Mais il faut avouer que faire un find pour qu'il trouve une "PARTIE" de chaîne dans un chaîne et bien plus simple que de se confronter au Mid, Len, Instr qui nécessite un algorithme beaucoup plus élaboré...

En tout cas, je me suis bien sûr attardé à de nombreuses reprises sur le lien que vous avez fourni, mais ça ne répond pas à toutes mes questions.

Il y a cette page ultra-complète sur les tableaux que je me permets de mettre en lien ici:

http://boisgontierjacques.free.fr/pages_site/tableaux.htm

Mais j'ai parfois du mal à comprendre la syntaxe du code moi qui suis plutôt débutant: je passe pas mal de temps à déchiffrer...

Encore merci pour votre contribution

Bonne journée.

Bonjour en passant,

Mid et Len sont des fonctions VBA. Find est une méthode Excel... L'utilisation dépend du contexte... Mais dans un certain nombre de cas Find ne répond pas vraiment à ce que l'on peut souhaiter, et d'autres méthodes paraîtront plus sûres...

Très louable de signaler le site de Boisgontier, que tous les intervenants connaissent, une source indispensable !

Avec un salut pour Galopin bien sûr !

Bonjour,

Attention!

Application.Match n'est pas très performant sur les Arrays (Tout dépend de la taille de l'Array).

Pour ne pas boucler sur un Array, on peut indexer un Array 2D par un dictionnaire.

Pour ne pas boucler, un Array 1D peut être remplacé par un dictionnaire.

Pour rechercher dans une colonne d'un Array 2D a(,) avec Match. On peut isoler une colonne dans un Array 1D avec b=Application.Index(a,,3) pour récupérer la 3e colonne dans un Array b().

Ceuzin

Bonjour Ceuzin.

Pour le coup, la notion de dictionnaire est un poil au dessus de mon niveau.

Pas que je ne sois pas capable d'appréhender le concept et m'en servir pas la suite, mais mes compétences et connaissances en VBA évoluent en fonction du besoin de solutions, méthodes, fonctions à l'instant t.

Je ne peux évoluer que de cette façon.

Ce qui me conduit, forcément, ultra souvent sur internet qui propose des solutions différentes que je sélectionne en fonction de mon niveau de compréhension et de mon aptitude à retranscrire le code.

Je ne copie-colle jamais de fonctions glanées ça et là.

je m'efforce de toujours créer mon propre algorithme.

Mais à lire certains des algorithmes fournis par d'altruistes contributeurs sur les forums, je me rends bien compte que je suis loin d'être efficace...

Merci tout de même pour les précisions.

Les arrays étaient pour moi l'occasion d'évoluer, mais je galère trop et reste sur des recherches dans les cellules.

Je suis quelque peu contraint par le temps.

Rassurez-moi, vous connaissez tous pleins de méthodes et fonctions ou vous passez votre temps sur internet comme moi ?

Bonne journée.

Travailler directement sur les cellules est plus lent que travailler sur les Arrays.

Ceuzin

Les arrays c'est pas compliqué ! C'est comme une feuille de calcul. Tu les parcours exactement de la même façon que tu parcourrais ta feuille de calcul.

Evidement si tu tiens à rester avec Find ça va pas le faire... mais sinon c'est exactement pareil

En petit nègre :

Pour i = 1 to NbreDeLigne

Pour k = 1 to NbreDeColonne

Si Cellule(i,k) = "blabla" alors sortir des boucles

FinBoucle k

FinBoucle i

MsgBox "blabla se trouve ligne " & i & " colonne " & k

Mise en application : la macro1 est appliquée sur les mêmes cellules (un code postal) que la macro 2

macro1 (cellules) est exécuté en 0"43

macro2 (array) est exécutée en 0"05

Les 2 macros :

Sub test1() 
Dim i, k, Hdeb
Hdeb = Timer
For i = 1 To 38950
   For k = 1 To 2
      If Cells(i, k) = "ALBI" Then GoTo Fin
   Next k
Next i

Fin:
MsgBox "ALBI se trouve ligne " & i & " colonne " & k & " en " & (Timer - Hdeb)
End Sub

Sub test2() 
Dim Arr, i, k, Hdeb
Hdeb = Timer
Arr = Range("A1:B38950").Value
For i = 1 To 38950
   For k = 1 To 2
      If Arr(i, k) = "ALBI" Then GoTo Fin
   Next k
Next i

Fin:
MsgBox "ALBI se trouve ligne " & i & " colonne " & k & " en " & (Timer - Hdeb)
End Sub

A+

8demoarr.xlsm (841.79 Ko)

Salut ! Bonjour à tous

mes compétences et connaissances en VBA évoluent en fonction du besoin de solutions, méthodes, fonctions à l'instant t.

C'est ce qu'il y a de mieux, les domaines que tu approfondis doivent correspondre aux besoins de réalisations du moment...

je m'efforce de toujours créer mon propre algorithme.

C'est ce qu'il faut pour progresser !

Et ne te frappe pas si on peut faire mieux ! Tu feras mieux à chaque fois ! Les tableaux constituent à eux seuls un domaine particulièrement vaste, et on peut presque toujours en utiliser, et de différentes façons, qui te feront à chaque fois découvrir des aspects... Je dois dire que ces dans les domaines que je connais le mieux que je découvre encore des choses qui m'avaient échappé à l'occasion, je ne m'en plains pas !...

Sorry... Erreur d'aiguillage !

J'ai bien compris que travailler avec les arrays fait gagner un temps précieux, mais je travaille sur des petits "volumes" de lignes (5000 lignes et quelques colonnes) et je ne suis pas dans des traitements répétitifs.

Les tableaux étaient juste un prétexte pour évoluer.

Vous conviendrez toutefois que chercher une partie de chaîne de caractères dans des cellules qui contiennent des chaînes de caractères variables avec une méthode find, qui indique sans boucle la première occurrence trouvée associé à countIf pour trouver le nb d'occurrences, est tout de même bien plus pratique (sans connoter une quelconque fainéantise) que d'utiliser des boucles imbriquées avec des Mid, Left, Right, Len dans des arrays.

Pourtant, je me sers beaucoup de ces fonctions VBA mais je suis gêné par la position variable de ce que je recherche rendant l'utilisation du FIND plus pratique.

J'utilise quand même les arrays mais dans d'autres circonstances nécessitant un traitement plus simple.

Boucler sur le arrays ne me pose aucun problème. C'est juste que la panoplie de fonctions utilisable me paraît maigre et que je ne sais pas encore comment substituer les fonctions VBA aux fonctions excel.

Au-delà de tout cela, je vous remercie pour vos contributions et votre bienveillance car je ne me sens pas seul.

Ça fait toujours du bien...

Bonne matinée.

Rechercher des sujets similaires à "arrays quelles fonctions principales"