Trouver la place d'unitem dans une liste

Résolu
Signaler
Messages postés
10
Date d'inscription
mercredi 28 novembre 2007
Statut
Membre
Dernière intervention
28 mars 2008
-
Messages postés
10
Date d'inscription
mercredi 28 novembre 2007
Statut
Membre
Dernière intervention
28 mars 2008
-
Bonjour, un petit probleme a vous soumetre, pas bien dur (je pense).

J'ai deux feuilles, une avec un tableau, une autre avec des données. Je voudrais remplir le tableau avec des données (ca vous en bouche un coin, hein ?).

feuille 1 (change toujours)
Ligne ... jeudi ... vendredi ... samedi
Ll
L3
L25
L99
LA

feuillle 2  (toujours la meme structure)
jeudi ... L1 ... 3
jeudi ... L3 ... 4
jeudi ... L25 ... 4
jeudi ... LA ... 2
vendredi ... L1 ... 3
vendredi ... L99 ... 4
samedi ... L3 ... 5

Ne me parlez pas de tableau croisé, ca ne passe pas (parce que j'ai simplifié le probleme.
Ce que je fais, pour l'instant : je passe chaque ligne de la feuille 2 en revue et je fais des tests.
Pour les lignes de bus , en début de programe, je les met dans une liste lignebus(1)="L1" ; lignebus(2) = "L3" ; ... ; lignebus(5)="LA".
Ce que je voudrais c'est savoir comment retrouver l'indicateur (le numéro de pointeur ou ce que vous voulez, je manque de vocabulaire) à partir  du nom de la ligne.
En d'autre termes, quand je dis "L3", je voudrais qu'on me réponde 2.

J'avais pensé tricher en codant :
    Select Case Sheets(feuille2).Cells(i, 4).Value ' cette value, c'est L1, L3 ou autres
        For l = 1 To nb                                          ' nb c'est le nombre de lignes, 5 dans mon exemple
        Case lignebus(l)
            ...
        Next l
    End Select

mais ca marche pas
Une idée ?
(je peux ptet faire une fonction rien que pour ca mais si y'a une instruction magique qui s'en charge déjà, je m'épargnerai cet effort )

11 réponses

Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
a mon avis il te faut une boucle For dans une boucle For, avec un test d'égalité à l'intérieur
Messages postés
10
Date d'inscription
mercredi 28 novembre 2007
Statut
Membre
Dernière intervention
28 mars 2008

Bon, je m'en suis tiré avec deux if imbriqués de facon pas tres propre. Mais c'est vrai qu'un for aurait pu faire l'affaire.
genre:
for i=1 to fin_liste
    if liste(i)= "value" then
       rang=i
    end if
next i

Je m'etonne qu'il n'existe pas une intruction ad hoc.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Pour les lignes de bus , en début de programe, je les met dans une
liste lignebus(1)="L1" ; lignebus(2) = "L3" ; ... ; lignebus(5)="LA".



Qu'est-ce que tu entends par "Liste" ? un tableau(), une liste de données sur une feuille, une Collection, une listbox ?

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
10
Date d'inscription
mercredi 28 novembre 2007
Statut
Membre
Dernière intervention
28 mars 2008

j'ecris, par programme, les valeur des lignes de bus dans un tableau à une dimention
lignebus(1)="L1" ; lignebus(2) = "L3" ; ... ; lignebus(5)="LA".
Mais évidemment, je peux changer si une autre méthode se révele plus intelligente.
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
Pb de structure dans ton code !! Le bloc For ... Next ne peut pas encadrer 1 Case du bloc Select ... End Select ! Soit le Select ... End Select est dans le bloc For ... Next, soit le For ... Next est dans un bloc Case du Select ... End Select :
1-
For ...
Select Case ...
Case ...
Case ...
End Select
Next

2-
Select Case ...
Case ...
For ...
Next
Case ...
End Select

Alors maintenant, j'ai pas tout compris à ton PB, mais je pense que la structure de type 1 correspondra à ce que tu veux ...
Messages postés
10
Date d'inscription
mercredi 28 novembre 2007
Statut
Membre
Dernière intervention
28 mars 2008

Malheureusement non :
Mon probleme est que meme si je sais combien il y en a de différentes (dans mon exemple 5), je ne sais pas quelles vont etre les lignes qui vont apparaitre.

Dans cet exemple il faudrait que j'ecrives
select lignebus
    case "L1"
    case "L3"
    case "L25"
    case "L99"
    case "LA"
end select
Mais au prochain coup, les noms des lignes aura changé et il me faudra changer mon select case en case "L2", case L"5555", ...

Je ne suis pas obligé d'utiliser un select, bien sur
Messages postés
10
Date d'inscription
mercredi 28 novembre 2007
Statut
Membre
Dernière intervention
28 mars 2008

j'ecris, par programme, les valeur des lignes de bus dans un tableau à une dimention
lignebus(1)="L1" ; lignebus(2) = "L3" ; ... ; lignebus(5)="LA".
Mais évidemment, je peux changer si une autre méthode se révele plus intelligente.
Messages postés
50
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 mai 2008

S'il s'agit d'une énumération, je conseillerais plutôt le type ENUM à la place d'un tableau Lignebus(x) (en VB.NET) maintenant en VBA???

Je pense aussi à qque chose de plus simple : les fonctions RECHERCHE, DECALER, INDEX, EQUIV. Une combinaison de ces fonctions devrait résoudre le problème.
Messages postés
50
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 mai 2008

L'assistant recherche aussi (Outils/recherche)
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
Si j'ai tout bien compris (?)... je pense que l'idée d'une Function serait bien choisie.

Si tu utilises la fonction Find pour trouver la valeur que tu cherches, le résultat peut te donner la ligne où la valeur a été trouvée.

ex:
Dim Recherche As Range
Set Recherche = Sheets("Feuil2").Columns("A").Find(Tablo(i)) 'si tu utilises un tableau
MsgBox Recherche.Row

Pour vérifier si la recherche est fructueuse ou non
If Not Recherche Is Nothing Then
    MaFunction = Recherche.Row
Else
    MaFunction = 0
End If

MPi²
Pour ceux qui programment sous Office, n'oubliez pas qu'il existe un forum dédié à ces applications VBA....... ICI
Messages postés
50
Date d'inscription
mercredi 4 août 2004
Statut
Membre
Dernière intervention
12 mai 2008

je persiste :
La fonction ligne te renvoi le numéro de la ligne
LIGNE(A2) te renvoi 2

Tu remplace A2 par une fonction qui retrouve les coordonées : INDEX(EQUIV(..);EQUIV.....;..) Et tu devrais trouver le résultat.