OVH Cloud OVH Cloud

Index dans un array(tableau)

2 réponses
Avatar
Steiner Ch.
Bonjour,

J'ai cr=E9er en m=E9moire un Array (tableau) avec 2 colonnes.
Comment puis-je retrouver si je cherche dans la 2=E9me=20
colonne un texte le N=B0 de l'index correspondant en face=20
dans la 1 =E8re colonne.

Par exemple : 2 colonnes N=B0 et jour de semaine
Je cherche mardi qui doit me retourner l'index 2 (2 =E8me=20
jour de la semaine).

J'ai vaguement essay=E9 d'utiliser la propri=E9t=E9=20
IndexedValue , mais elle ne fonctionne pas.

Donc existe-t-il dans les fonctions sp=E9cifiques des Array=20
une fonction qui permette cela (retourne l'index).

Voil=E0 merci pour votre aide....

2 réponses

Avatar
Michel Walsh
utilisée, pour un item donnée, ni ne vous dire si une clée donnée est déjà incluse
ou non ( autrement qu'en essayant et en produisant éventuellement une erreur qu'on peut examiner).
Si ces limites vous nuisent, et que vous ne désirez toujours pas utiliser de tables de base de
données, alors on peut essayer les Dictionnaires (Map, en C/C++), mais leur similitude avec les
collections les rend un PEU (un petit peu) dangereux, car ils se comportent comme de "faux-amis"
(par comparaison entre deux langue où le même mot signifie complètement autre chose dans l'une et
dans l'autre).

Pour utiliser les dictionnaires, tout d'abord inclure une référence à fso, le file scripting
object, ou, officiellement, le "Microsoft Scripting Runtime" , ou encore, le fichier
SYSTEMscrrun.dll, si vous préférez.

Passons au code:
=================== Public Sub Dicdacdoc()
Dim x As Dictionary

Set x = New Dictionary
x.Add "Paris", 2 ' Note-1-

Debug.Print x.Exists("Moscou")
Debug.Print x("Athènes") ' Note-2-
Debug.Print x.Exists("Athènes") ' Note-2-
Debug.Print x.Keys(0), x("Paris") ' Note-3-

End Sub
===================
Le début est semblable à une collection, premier faux ami, la méthode ADD demande la clé suivi de
l'item. Pour un collection, la méthode ADD demande l'item, suivi de la clé. L'ordre des deux
arguments est inversé.

Les dictionnaires ont une méthode Exists qui retourne vrai ou faux selon que la clé passée est déjà
connue ou non. Avantage sur le collections, c'est certain. La méthode Items( ) est également la
méthode par défaut. On peut donc écrire x.Items("Paris") ou simplement x("Paris"), comme pour des
collections. Par contre, contrairement aux collections, utiliser une clé qui n'existe pas encore ne
génère pas d'erreur, note 2. Une collection génèrerait une erreur. Mais ce qui chicotte un peu,
c'est qu'utiliser une clé qui n'existe pas AUTOMATIQUE ajoute cette clé dans le dictionnaire, comme
en fait foi la méthode Exists. Finallement, note 3, on peut traverser le dictionnaire, si on le
désire, pour relire la clé sous laquelle est emmagaziné l'item, via la méthode Keys. En d'autres
mots, pour une collection, si vous (votre code) ne connaît pas de clé, d'avance, on ne peut rien
faire sortir de la collection, autrement que par

maCollection.Items( i )

mais avec un dictionnaire, vous pouvez retrouver la clé utilisée

monDico.Keys( i )


et alors, plus loin, utiliser la clé

monDico.Items( maClé )


Donc, un dictionnaire peut, à lui seul, remplacer la combinaison Tableau + Collection, car je peux
y faire la recherche directe, via Keys, et la recherche inverse, via Items.

Dernier faux ami à signaler, un "for each" appliqué à un dictionnaire s'applique à la collection
Keys, non à Items, comme c'est le cas pour une collection.



Dim x As Variant

For each x in monDictionnaire

équivaut à

For each x in monDictionnaire.Keys


et nous retournera les clés (chaînes de caractères, dans notre cas), non l'objet (ou la valeur,
dans notre cas) emmagasiné.

La différence est encore plus importante lorsque les items emmagasinés sont des objets, plutôt que
des valeurs numériques: un "for each" sur une collection retourne l'objet, mais ne retourne, par
défaut, que les clés, sur un dictionnaire.

=============================== Public Sub Dicdacdoc2()
Dim dico As New Dictionary
Dim col As New Collection

Dim xdico As Variant
Dim xcol As Variant
Dim i As Long

dico.Add "Paris", Len("Paris")
dico.Add "Moscou", Len("Moscou")
dico.Add "Casablanca", Len("Casablanca")

col.Add Len("Paris"), "Paris"
col.Add Len("Moscou"), "Moscou"
col.Add Len("Casablanca"), "Casablanca"

For Each xdico In dico
Debug.Print xdico
Next xdico

For Each xcol In col
Debug.Print xcol
Next xcol

For Each xdico In dico.Items
Debug.Print xdico
Next xdico

End Sub

=================================

Mais tout ceci étant dit, une bonne vieille table avec un moteur de base de données, fait tout
cela, et en plus, PARTAGE avec les autres utilisateurs l'information qu'elle emmagazine.


Espérant ne pas avoir été trop nébuleux,
Vanderghast, Access MVP




"Steiner Ch." wrote in message
news:0bc901c346c4$36a5dd80$
Bonjour,

J'ai créer en mémoire un Array (tableau) avec 2 colonnes.
Comment puis-je retrouver si je cherche dans la 2éme
colonne un texte le N° de l'index correspondant en face
dans la 1 ère colonne.

Par exemple : 2 colonnes N° et jour de semaine
Je cherche mardi qui doit me retourner l'index 2 (2 ème
jour de la semaine).

J'ai vaguement essayé d'utiliser la propriété
IndexedValue , mais elle ne fonctionne pas.

Donc existe-t-il dans les fonctions spécifiques des Array
une fonction qui permette cela (retourne l'index).

Voilà merci pour votre aide....
Avatar
Michel Walsh
Salut,


Il faut une structure autre qu'un simple espace dimentionnel de mémoire inninterrompu, tel un
tableau.

Sous VB/VBA classique, ce qui serait le plus simple, après une base de données (qui en plus joue
avec plusieurs utilisateurs) serait, si on est dans un monde égoïste où on ne partage pas sa
"mémoire", ce serait d'utiliser un collection maintenue en parallèle avec le tableau, si on ne
cherche qu'un champ (une seule colonne du tableau est à indexer). En effet, si monTableau(2) "Paris", je peux faire

Dim maCollection As Collection
Set maCollection=New Collection
maCollection.Add 2, "Paris"


et alors, en recherche directe, j'utilise le tableau: monTableau(2) pour
trouver "Paris"
et en recherche "inverse", la collection: maCollection("Paris") pour
trouver 2


Les collections classiques ont quelques limitations, entre autre, elles ne peuvent pas "recracher"
la clé qui fut utilisée, pour un item donnée, ni ne vous dire si une clée donnée est déjà incluse
ou non ( autrement qu'en essayant et en produisant éventuellement une erreur qu'on peut examiner).
Si ces limites vous nuisent, et que vous ne désirez toujours pas utiliser de tables de base de
données, alors on peut essayer les Dictionnaires (Map, en C/C++), mais leur similitude avec les
collections les rend un PEU (un petit peu) dangereux, car ils se comportent comme de "faux-amis"
(par comparaison entre deux langue où le même mot signifie complètement autre chose dans l'une et
dans l'autre).

Pour utiliser les dictionnaires, tout d'abord inclure une référence à fso, le file scripting
object, ou, officiellement, le "Microsoft Scripting Runtime" , ou encore, le fichier
SYSTEMscrrun.dll, si vous préférez.

Passons au code:
=================== Public Sub Dicdacdoc()
Dim x As Dictionary

Set x = New Dictionary
x.Add "Paris", 2 ' Note-1-

Debug.Print x.Exists("Moscou")
Debug.Print x("Athènes") ' Note-2-
Debug.Print x.Exists("Athènes") ' Note-2-
Debug.Print x.Keys(0), x("Paris") ' Note-3-

End Sub
===================
Le début est semblable à une collection, premier faux ami, la méthode ADD demande la clé suivi de
l'item. Pour un collection, la méthode ADD demande l'item, suivi de la clé. L'ordre des deux
arguments est inversé.

Les dictionnaires ont une méthode Exists qui retourne vrai ou faux selon que la clé passée est déjà
connue ou non. Avantage sur le collections, c'est certain. La méthode Items( ) est également la
méthode par défaut. On peut donc écrire x.Items("Paris") ou simplement x("Paris"), comme pour des
collections. Par contre, contrairement aux collections, utiliser une clé qui n'existe pas encore ne
génère pas d'erreur, note 2. Une collection génèrerait une erreur. Mais ce qui chicotte un peu,
c'est qu'utiliser une clé qui n'existe pas AUTOMATIQUE ajoute cette clé dans le dictionnaire, comme
en fait foi la méthode Exists. Finallement, note 3, on peut traverser le dictionnaire, si on le
désire, pour relire la clé sous laquelle est emmagaziné l'item, via la méthode Keys. En d'autres
mots, pour une collection, si vous (votre code) ne connaît pas de clé, d'avance, on ne peut rien
faire sortir de la collection, autrement que par

maCollection.Items( i )

mais avec un dictionnaire, vous pouvez retrouver la clé utilisée

monDico.Keys( i )


et alors, plus loin, utiliser la clé

monDico.Items( maClé )


Donc, un dictionnaire peut, à lui seul, remplacer la combinaison Tableau + Collection, car je peux
y faire la recherche directe, via Keys, et la recherche inverse, via Items.

Dernier faux ami à signaler, un "for each" appliqué à un dictionnaire s'applique à la collection
Keys, non à Items, comme c'est le cas pour une collection.



Dim x As Variant

For each x in monDictionnaire

équivaut à

For each x in monDictionnaire.Keys


et nous retournera les clés (chaînes de caractères, dans notre cas), non l'objet (ou la valeur,
dans notre cas) emmagasiné.

La différence est encore plus importante lorsque les items emmagasinés sont des objets, plutôt que
des valeurs numériques: un "for each" sur une collection retourne l'objet, mais ne retourne, par
défaut, que les clés, sur un dictionnaire.

=============================== Public Sub Dicdacdoc2()
Dim dico As New Dictionary
Dim col As New Collection

Dim xdico As Variant
Dim xcol As Variant
Dim i As Long

dico.Add "Paris", Len("Paris")
dico.Add "Moscou", Len("Moscou")
dico.Add "Casablanca", Len("Casablanca")

col.Add Len("Paris"), "Paris"
col.Add Len("Moscou"), "Moscou"
col.Add Len("Casablanca"), "Casablanca"

For Each xdico In dico
Debug.Print xdico
Next xdico

For Each xcol In col
Debug.Print xcol
Next xcol

For Each xdico In dico.Items
Debug.Print xdico
Next xdico

End Sub

=================================

Mais tout ceci étant dit, une bonne vieille table avec un moteur de base de données, fait tout
cela, et en plus, PARTAGE avec les autres utilisateurs l'information qu'elle emmagazine.


Espérant ne pas avoir été trop nébuleux,
Vanderghast, Access MVP