[VBA] Mise en place d'un système intelligent

Résolu
midoparis Messages postés 18 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 22 janvier 2009 - 19 mai 2008 à 17:17
midoparis Messages postés 18 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 22 janvier 2009 - 20 mai 2008 à 16:38
Bonjour à tous !


Je dois mettre en place un système pseudo intelligent, et je vais essayer de vous expliquer au mieux la situation pour avoir les conseils les plus avisés des meilleurs d'entre vous ;)



Situation :

J'ai un tableau excel, quelques colonnes, plusieurs lignes (5000).
Dans la premiere ligne, il y a le nom de plusieurs champs (identifiant, nom, diplome obtenu)
Dans les autres lignes, il y a des valeurs.



Probleme :

Une seule personne peut avoir plusieurs diplomes. Donc pour un meme identifiant on peut avoir plusieurs lignes.
De plus, la colonne diplome peut parfois changer. Il faudrait donc que l'utilisateur choisisse quelle est la colonne de comparaison via un userform + listbox.



Objectifs :

1 - Recuperer la colonne a traiter
2 - Repérer les lignes en double,
3 - Comparer les diplomes,
4 - Repérer le diplome le plus élevé,
5 - Supprimer les autres lignes.



Etape 1 :

pas de souci, je récupere la valeur dans une variable globale, comme ça je la réutilise quand je veux.



Etape 2 :

pas de souci non plus.
Je trie le tableau sur la colonne sélectionnée. Je parcours le fichier et j'écris à la droite du tableau deux nouvelles colonnes : une avec les identifiants, et une avec le nombre de diplome de chaque identifiant.
Je peux ainsi savoir où sont les blocs de la meme personne (avec autant de lignes que de diplomes obtenus).



Etape 3, 4 et 5 :

ça commence a devenir dur...
Ce que je me dis, c'est qu'il faudrait que je fasse la liste de tous les diplomes présents, en attribuant un chiffre à chaque diplome. Ensuite, lorsqu'il tombe sur un bloc d'au moins 2 lignes, il recopie ailleurs le morceau de colonnes correspondant aux diplomes, il remplace chaque intitulé par un chiffre, il voit qui est le plus grand, il retourne le numero de ligne du diplome le plus grand, ce qui nous donne la ligne contenant le diplome le plus grand, il recopie cette ligne dans un autre onglet, et il passe au bloc suivant.


Mon gros problème est "Comment faire ce système pseudo intelligent qui va a partir d'une liste de mots, leur attribuer un nombre selon une table précise, puis me retourner le numero de la ligne la plus élevée pour que je traite cette ligne?





Merciiiii d'avance pour tous vos conseils !!!

4 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 mai 2008 à 14:33
Bonjour

à la place de

Type Diplome
    BEPC = 1
    BAC = 2
    BTS = 3
'etc...
End Type

Ce n'est pas

Enum Diplome
    BEPC = 1
    BAC = 2
    BTS = 3
'etc...
End Enum

que tu voulais écrire ?

Le fer à souder a besoin d'une panne pour fonctionner.
VB (6, .NET1&2), C++, C#.Net1
Mon site
3
midoparis Messages postés 18 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 22 janvier 2009
20 mai 2008 à 16:38
en fait, c'est pas tout à fait ça, mais j'ai réussi !!

Dans mon fichier, j'ai la liste des noms et de leur diplome. Et j'ai une ligne par personne par diplome.
Et mon but est de ne conserver QUE la ligne contenant le meilleur diplome, sachant que les diplomes sont ecrits sous forme de texte.

En fait ce que j'ai fait (pour ceux qui souhaitent le savoir..), j'ai fait un fichier excel où j'ai noté la liste des diplome possible, et a coté une note (plus la note est grande, meilleur est le diplome) .

Quand je prends mon fichier, je fais reconnaitre à Excel, les blocs de chaque personne, et pour chaque bloc, il fait le meme traitement :
- s'il y a un seul diplome tu colle la ligne dans l'onglet final sinon :
   -tu copie les diplomes dans un onglet temporaire
   -tu fais "recherchev" dans le fichier de reference et tu rapatrie les notes de chacun
   -tu change tous les #N/A en 0
   -tu regarde quelle est la meilleure note
   -tu refais une boucle et :
      - dès que la note est egale au maximum ou a 0, tu copie la ligne equivalente au fichier initial dans le  fichier final, et tu reviens dans le fichier temporaire
-tu passe au bloc d'apres

a la fin, j'obtiens mon nouvel onglet, avec les meilleurs diplomes uniquement de chaque personne, ainsi que les diplomes non presents dans la liste (pour ne rien oublier).

en tout cas merci d'avoir pris le temps de me repondre  :)
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
19 mai 2008 à 17:29
salut,

pas évidant comme ça à première vu sans tester, mais je pense que tu pourrais créer un type de données personnalisé, à savoir :

Type Diplome
    BEPC = 1
    BAC = 2
    BTS = 3
'etc...
End Type

L'avantage, c'est que tu peux dire à l'utilisateur quelle valeur correspond à tel diplôme.
Et quand tu codes, ça donne qque chose comme ça :

Dim MyDiplome As Diplome

Et par rapport à la saisie de l'utilisateur (qui sera un chiffre), quand tu coderas
MyDiplome = L_objet_sur_lequel_il_a_saisit.Text     '(ou .Caption)

Toi, tu peux l'employer avec les valeurs prédéfinis/
ex :
Select Case MyDiplome
    Case BEPC
       ...
    Case BAC
    ...
End Select

(Plutôt que Case 1..)

Là ce n'est qu'un aperçu, mais ton code sera plus compréhensible pour toi, facile à modifier.

D'autres membres auront sans doûte d'autres idées sympa, patiente un peu et tu auras d'autres conseils
@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
20 mai 2008 à 16:24
lol, oui !!
merci NHenry

faut dire que quand je lui proposais ça, j'étais en train de corriger un de mes snippets, avec des types. Donc je me suis planté en beauté, désolé 

@++

le mystérieux chevalier,"Provençal, le gaulois"
Forum Office & VBA
0
Rejoignez-nous