VBA, Conditionnelle

Bonjour,

Le VBA est complètement nouveau pour moi cette année, merci de m'aider humblement. Ça peut paraître tellement simple pour certains mais pour moi c'est pas évident. Voila ce que je veux faire;

Créer une macro qui permet de traiter l'ensemble des lignes d'une feuille A d'un classeur . Dans cette feuille nous avons une liste d’élève avec NOM, PRENOM, AGE, COULEURS DES CHEVEUX. Colonne A, B, C, D

Cette macro doit demander de saisir une couleur de cheveux, BLOND par Exemple; il ya 3 types de cheveux , Noirs, Blond, Roux

Et ensuite créer une nvlle feuille qui va porter le nom BLOND plus haut !

Cette macro doit ajouter dans cette feuille "BLOND" de type tableau le nom et le prénom des élèves qui répondent à ce critères. je précise que ce choix aurait pu être Noirs , Roux...et chaque fois l'ajout d'une feuille, et on n'a pas obligation d’écrire les 3 types de cheveux mais la macro doit fonctionner pour chaque demande.

Cette macro doit écrire les informations à partir de la cellule "A1" de chaque nvlle feuille .

J'attend vos idées , merci

Bonjour Jacquy, bonjour le forum,

Châtain plus jeune (maintenant les quelques cheveux qui me restent sont poivre et sel), je suis surpris par cette nom prise en compte dans ton fichier ...

Plus sérieusement. Ton problème est assez simple à résoudre mais manque de précision. Si on demande plusieurs fois une même couleur de cheveux ("Blond" par exemple) , faudrait-il créer plusieurs onglets ? Si non, faudra-t-il répéter la liste ou seulement les nouveaux "Blond" ?

Un petit fichier exemple serait, comme toi, le bienvenu, avec juste une quinzaine de lignes de données...

Bonjour, Merci pour le coup de main.

Voila ce que je veux ....

Créer une macro qui permet de traiter l'ensemble des lignes de la feuille " Eleve". Le nombre de lignes à traiter n'est pas connu avant le lancement de la procédure.

Cette macro doit me demander de saisir un critère, ¨Donnez votre critère¨ Si je tape BLOND OU NOIR etc...

Elle va créer une nvlle feuille qui va porter le nom BLOND ou Noir ou Roux plus haut !

Cette macro doit ajouter dans cette feuille "BLOND" de type tableau le nom et le prénom des élèves qui répondent à ce critères.

--- Pour te répondre ( , la macro doit fonctionner pour chaque nouveau critère saisi, mais devra s’arrêter si je m’intéresse qu'au critere BLOND. L’idéal serait qu'elle me demande si je veux continuer , une fois le premier critère saisi .

Si oui, elle me demande de saisir mon nouveau critère , NOIR ( création d'une seconde feuille qui porte le nom NOIR), avec le nom et prénom des élèves avec ce critère.

Si non, la macro donne les infos que du premier critère saisi et s’arrête !

Petite cerise sur le gâteau,

Une seconde macro , qui dépose sur la feuille 2, le nom et prénom des élèves qui ont 12 ans et moins de 11 ans .

Merci encore

4modele.ods (3.31 Ko)

Pas certains de l'utilité d'un fichier qui va trier des élèves par couleur de cheveux, sinon prendre le risque d'une

plainte pour discrimination.

C'est un exemple , j’espère que d'autres prennent au sérieux le code que je veux créer.

Bonjour e fil, bonjour le forum,

Certes nous prenons au sérieux le code que tu voudrais qu'on crée pour toi mais je suis quand même d'accord avec Xmenpl. Tu aurais pu choisir un exemple moins craignos !...

Comme tu n'as pas répondu à toutes mes question, le code que je te propose commence par effacer tous les onglets en dehors de l'onglet "ELEVE". Il se divise en deux parties. La première partie se trouve dans le composant ThisWorkbook et agit à l'ouverture du classeur en te présentant une boîte de dialogue qui te permet de choisir un critère :

Private Sub Workbook_Open()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim O As Worksheet 'déclare la variable OS (Onglets)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim I As Integer 'déclare la variable I (Incrément)

Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Application.DisplayAlerts = False 'interdit les messages d'Excel
Set OS = Worksheets("ELEVE") 'définit l'onglet source OS
For Each O In Worksheets 'boucle sur tous les onglets O du classeur
    If Not O.Name = OS.Name Then O.Delete 'si l'onglet ne se nomme pas "ELEVE", supprime l'onglet
Next O 'prochain onglet de la boucle
TV = OS.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("scripting.dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 4)) = "" 'alimente le dictionaire D avec la donnée en colonne 4 de TV (la couleur des cheveux)
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
UserForm1.ComboBox1.List = TMP 'alimente la comboBox1 de l'userForm1 avec les éléments de TMP
Application.ScreenUpdating = True 'affiche les rafraîchissements d'écran
Application.DisplayAlerts = True 'autorise les messages d'Excel
UserForm1.Show 'affiche l'UserForm1
End Sub

Ensuite le code continue dans le composant UserForm1, au changement dans la Combobox1. Il te demande si tu veux continuer avec d'autre critères ou pas :

Private Sub ComboBox1_Change() 'au changement dans la Combobox1
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPraire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim LD As Integer 'déclare la variable LD (Ligne de Destination)
Dim TEST As Boolean 'déclare la variable TEST

Worksheets.Add After:=Worksheets(Sheets.Count) 'ajoute un onglet vierge en dernière position
Set OD = ActiveSheet 'définit l'onglet OD
OD.Name = Me.ComboBox1.Value 'renome l'onglet OD
Set OS = Worksheets("ELEVE") 'définit l'onglet OS
TV = OS.Range("A1").CurrentRegion 'définit la tableau des valeurs TV
Set D = CreateObject("scripting.dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 4)) = "" 'alimente le dictionnaire D avec la donnée en colonne 4 de TV (la coleur des cheveux)
    If TV(I, 4) = Me.ComboBox1.Value Then 'condition : si la donnée en colonne 4 de TV est égale à la valeur de la ComboBox1
        'définie la ligne de destination LD (1 si A1 est vide, sinon la première ligne vide de la colonne A de l'onglet OD)
        LD = IIf(OD.Range("A1") = "", 1, OD.Cells(Application.Rows.Count, "A").End(xlUp).Row + 1)
        'renvoie dans la cellule ligne LD colonne A redimensionnée, les trois premières colonnes de la ligne I de TV
        OD.Cells(LD, "A").Resize(1, UBound(TV, 2) - 1).Value = Application.Index(TV, I)
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
If Me.ComboBox1.ListCount = 1 Then End 'si la ComboBox1 ne contient qu'un seul élément, fin
Unload Me 'vide et ferme l'Userform1
If MsgBox("Voulez-vous continuer avec d'autres critères ?", vbYesNo, "CRITÈRES") = vbYes Then 'condition : si "Oui" au messgae
    For J = 0 To UBound(TMP) 'boucle 1 sur tous les éléments J du tableau temporaire TMP
        TEST = False 'réinitialise la variable TEST
        For I = 1 To Sheets.Count 'boucle 2 : sur tous les onglets I du classeur
            'si l'élément J de TMP est égal au nom de l'onglet I, redéfinit la variable TEST, sort de la boucle 2
            If TMP(J) = Worksheets(I).Name Then TEST = True: Exit For
        Next I 'prochain onglet de la boucle 2
        If TEST = False Then UserForm1.ComboBox1.AddItem TMP(J) 'si test est [faux] ajoute l'élémetn J de TMP à la ComboBox1 de l'UserForm1
    Next J 'prochain élément de la boucle 1
    UserForm1.Show 'affiche l'Userform1
Else 'sinon ("Non" au message)
    End 'fin
End If 'fin de la condition
End Sub

Le fichier :

6jacquy-ep-v01.xlsm (19.12 Ko)

Merci,

Le code marche !

Rechercher des sujets similaires à "vba conditionnelle"