IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

macro vba avec liste de choix


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    demande de renseignement
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : demande de renseignement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut macro vba avec liste de choix
    Bonsoir,
    j'ai fait un fichier de suivi pour mon travail qui comprend entre autre :

    - une feuille 1 qui contiendra le détail du travail de la journée
    - une feuille 2 qui contient les taches type à effectuer

    la feuille 2 est composée d'un filtre qui me sert à sélectionner le type de tache à faire
    je sélectionne manuellement les lignes puis les insert dans la feuille 1 avant la ligne qui contient le texte "ajouter avant"

    j'ai déjà un début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Macro6()
    '
    ' Macro6 Macro
    '
    '
        Sheets("Feuil2").Select
        ActiveSheet.Range("$A$1:$A$8").AutoFilter Field:=1, Criteria1:="liasse ECN"
        Range("A2:BZ" & Range("A65536").End(xlUp).Row).Copy
        Sheets("Feuil1").Select
        Cells.Find(What:="ajouter avant").Activate
        Rows(ActiveCell.Row).Select
        Selection.Insert Shift:=xlDown
        'Range("R1:BZ60000").ClearContents
    End Sub
    je joints le fichier test

    ce que j'aimerais, c'est lancer soit une input box pour rentrer le ou les critères de choix moi-même ; soit déclencher la liste déroulante pour sélection moi-même le filtre à appliquer

    car pour le moment, je suis obligé de créer autant de macro que j'ai de tache

    merci d'avance pour votre aide (pour info je suis débutant en vba, j'ai créé ce morceaux de codes en cumulant ifférente action par enregistrement de macro)
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Exemple
    le fichier, sélectionnez la liaisse dans la liste déroulante, puis cliquez sur le bouton pour importer la zone filtrée.
    Pièce jointe 528671

    Le code utilisé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Sub Importation_Liste_Filtrée()
        'Initialisation des variables
        Dim f1 As Worksheet, f2 As Worksheet
        Dim DerLig As Long, NewLig As Long, NbCol As Long
        Dim Fam As String
     
        Application.ScreenUpdating = False 'Accélère le processus
        Set f1 = Sheets("Feuil1")
        Set f2 = Sheets("Feuil2")
        Fam = f1.Cells(f1.[A5], "S") 'récupération de la sélection faite en feuille 1
     
        'd'après la sélection de la liste, on récupère les données filtrées de la feuille 2
        f2.Select 'sur la feuille 2
        ActiveSheet.AutoFilterMode = False 'on supprime les filtres existants
        DerLig = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille 2
        [A1].AutoFilter 'on met le filtre sur ligne 1
        NbCol = ActiveSheet.[IV2].End(xlToLeft).Column 'nombre de colonnes de la feuille 2
        ActiveSheet.Range(Cells(1, "A"), Cells(DerLig, NbCol)).AutoFilter Field:=1, Criteria1:=Fam 'on applique le filtre
        ActiveSheet.Range("_FilterDataBase").Resize(, NbCol).SpecialCells(xlCellTypeVisible).Copy 'on copie la zone filtrée
     
        f1.Select 'sur la feuille 1
        NewLig = Range("A" & Rows.Count).End(xlUp).Row + 1 'trouve la première ligne vide
        Cells(NewLig, "A").Select 'on se positionne sur la première cellule vide
        ActiveSheet.Paste 'on colle la zone filtrée de la feuille 2
        Rows(NewLig).Delete 'on efface la première ligne contenant le titre
    End Sub
    Cdlt

  3. #3
    Futur Membre du Club
    Homme Profil pro
    demande de renseignement
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : demande de renseignement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut macro vba avec liste de choix
    Bonjour,

    merci pour ta réponse rapide et très bien commenté

    j'ai pu adapter mon code avec les informations qu'il me manquait

    maintenant je dois adapter dans le vrai fichier et je te tiens au courant si ça fonctionne bien comme je le souhaite

    j'aurais surement de nouvelles demandes car j'utilise aussi de la mise en forme conditionnel et j'aurai peut-être besoin de pouvoir sélectionner plusieurs critère dans le filtre

    mais ton code me fait déjà beaucoup avancer merci beaucoup

  4. #4
    Futur Membre du Club
    Homme Profil pro
    demande de renseignement
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : demande de renseignement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut macro vba avec liste de choix
    Rebonjour,

    dans ton code la liste de choix est sur la même page
    dans mon fichier final la liste de choix est sur une autre feuille qui est différente des deux autres donc feuill3

    il faudrait donc adapter la formule Fam = f1.Cells(f1.[A5], "S") en indiquant que la colonne S est feuill 3

    j'ai ajouté dans le code la définition de la variable f3 pour feuill3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim Fam As String
    Dim f1 As Worksheet, f2 As Worksheet, f3 As Worksheet
    Dim DerLig As Long, NewLig As Long, NbCol As Long
    Set f1 = Sheets("FEUILL1")
    Set f2 = Sheets("FEUILL2")
    Set f3 = Sheets("FEUILL3")
    Fam = f1.Cells(f1.[A5], "S")
    comment je peux modifier la dernière ligne pour lui dire que la colonne S et dans f3?

    j'ai essayé bêtement "f3.S" ma ça aurait été trop simple ; j'ai essayé de chercher de mon côté mais je n'ai pas trouvé

    merci d'avance encore pour ton aide

  5. #5
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Pour bien comprendre, dans mon exemple, la plage d'entrée de la liste déroulante est liée à la cellule A5 de la feuille 1, que cela signifie-t-l?
    Tout d'abord, la liste est constituée dans la plage S1 à S9 de la feuille1, la cellule liée de la liste déroulante est en A5 de la même feuille. Cette cellule A5, donne le N° de ligne de la liste en colonne "S" correspondant à la sélection de la liste déroulante.
    Donc en sachant cela, où se trouve la liste des "Fam", quelle plage de cellules de la feuille 3?
    Si vous avez conservé le même emplacement en ne changeant que la feuille, la ligne devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fam = f3.Cells(f1.[A5], "S")
    Mais il faut auparavant modifier la référence de zone de noms "Liste" en procédant comme ceci
    Pièce jointe 528700

    Cdlt

  6. #6
    Futur Membre du Club
    Homme Profil pro
    demande de renseignement
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : demande de renseignement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut macro vba avec liste de choix
    ok j'ai bien compris la fonction maintenant
    pour que ça fonctionne il faut que la liste commence à la 1ère ligne de la colonne sinon quand on exécute la macro, si on choisi dans la liste il traite avec un décalage, exemple :

    si dans ma liste j'ai test, test1, test2 par exemple et que ma liste commence en s2 dans mon cas, si je choisi test1, la macro va filtrer avec test 2 (décalage d'une ligne)

    est-il possible dans la formule, de supprimer ce décalage? (au pire j'ai modifié mon fichier pour commencer en ligne 1)



    autre question après je penses que ça ira pour la fonction souhaité : quand j’exécute la macro, il ne conserve pas la mise en forme de la feuill2 vers la feuill1 ; est-il possible de conserver cette mise en forme? (comme quand on fait un copier d'une cellule avec un clique droit dans une autre où on copie la mise en forme?

    après ces 2 points je pourrais mettre en résolu (sauf si pour le dernier point je dois créer un autre topic?)

  7. #7
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    pour que ça fonctionne il faut que la liste commence à la 1ère ligne de la colonne sinon quand on exécute la macro, si on choisi dans la liste il traite avec un décalage, exemple :
    si dans ma liste j'ai test, test1, test2 par exemple et que ma liste commence en s2 dans mon cas, si je choisi test1, la macro va filtrer avec test 2 (décalage d'une ligne)
    est-il possible dans la formule, de supprimer ce décalage? (au pire j'ai modifié mon fichier pour commencer en ligne 1)
    Je ne comprends absolument pas ce que vous faites comme opération, notamment quand vous dites " si on choisi dans la liste il traite avec un décalage, si dans ma liste j'ai test, test1, test2 par exemple", d'où sortez-vous ça? la liste incluse dans la liste déroulante n'est pas celle de la famille des liasses (colonne A de la feuille 2)? Les filtres sont bien appliqués sur cette même colonne comme demandez initialement, non!

    Si je reprends les termes de votre demande initiale:
    la feuille 2 est composée d'un filtre qui me sert à sélectionner le type de tache à faire
    je sélectionne manuellement les lignes puis les insert dans la feuille 1 avant la ligne qui contient le texte "ajouter avant"
    , c'est bien ce que fait la macro, vous sélectionnez une famille de liasse avec la liste déroulante et toutes les lignes de la feuille 2 correspondantes à ce choix sont recopiées(format compris) à la suite dans la feuille 1. C'est ce qui correspond aussi exactement aux exemples que vous aviez mis dans la feuille 1.

    Comme vos explications semblent claires pour vous et pour moi parfaitement floues, redéposez un fichier avec la situation avant et après traitement afin que je puisse me représenter ce que vous attendez réellement.

    Cdlt

  8. #8
    Futur Membre du Club
    Homme Profil pro
    demande de renseignement
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : demande de renseignement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    je joins le fichier excel à jour,

    en effet, j'avais oublié de préciser que j'ai une feuille spécifique avec toutes mes listes et que la 1ère ligne de chaque liste est un titre

    Nom : Capture.JPG
Affichages : 1359
Taille : 181,8 Ko

    là, dans le fichier quand on sélectionne modelisation (par exemple) en page une, la macro va filtré et insérer les lignes "liasse process" qui se situe juste au-dessus de modélisation dans la liste déroulante page 1
    Fichiers attachés Fichiers attachés

  9. #9
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    C'était pas la peine de tout refaire alors qu'il suffisait de changer une ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Fam = f3.Cells(f1.[A5] + 1, "J") 'récupération de la sélection faite en feuille 1
    Inutile aussi de mettre "Ajouter au-dessus" à chaque fois, puisque c'est la macro qui détermine l'emplacement du prochain remplissage en fonction de la dernière ligne occupée.

    Le fichier
    Pièce jointe 528839

    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub Importation_Liste_Filtrée()
        'Initialisation des variables
        Dim f1 As Worksheet, f2 As Worksheet
        Dim DerLig As Long, NewLig As Long, NbCol As Long
        Dim Fam As String
     
        Application.ScreenUpdating = False
        Set f1 = Sheets("Feuil1")
        Set f2 = Sheets("Feuil2")
        Set f3 = Sheets("Feuil3")
        Fam = f3.Cells(f1.[A5] + 1, "J") 'récupération de la sélection faite en feuille 1
     
        'd'après la sélection de la liste, on récupère les données filtrées de la feuille 2
        f2.Select 'sur la feuille 2
        ActiveSheet.AutoFilterMode = False 'on supprime les filtres existants
        DerLig = Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille 2
        [A1].AutoFilter 'on met le filtre sur ligne 1
        NbCol = ActiveSheet.[IV2].End(xlToLeft).Column 'nombre de colonnes de la feuille 2
        ActiveSheet.Range(Cells(1, "A"), Cells(DerLig, NbCol)).AutoFilter Field:=1, Criteria1:=Fam 'on applique le filtre
        ActiveSheet.Range("_FilterDataBase").Resize(, NbCol).SpecialCells(xlCellTypeVisible).Copy 'on copie la zone filtrée
     
        f1.Select 'sur la feuille 1
        NewLig = Range("A" & Rows.Count).End(xlUp).Row + 1 'trouve la première ligne vide
        Cells(NewLig, "A").Select 'on se positionne sur la première cellule vide
        ActiveSheet.Paste 'on colle la zone filtrée de la feuille 2
        Rows(NewLig).Delete 'on efface la première ligne contenant le titre
    End Sub
    Cdlt

  10. #10
    Futur Membre du Club
    Homme Profil pro
    demande de renseignement
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : demande de renseignement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,

    Inutile aussi de mettre "Ajouter au-dessus" à chaque fois, puisque c'est la macro qui détermine l'emplacement du prochain remplissage en fonction de la dernière ligne occupée.
    en fait, mon fichier final est beaucoup plus complexe que le fichier test que j'ai fait pour le topic et j'en ai besoin pour d'autres raison pratique

    j'aurais pu mettre un - ou autre chose ça aurait été pareil (mais ça c'était à la création du fichier, donc je vais regarder si j'en ai toujours besoin)

    merci pour la modification de la formule , je me doutais qu'il fallait mettre un +1 quelque part

    deux dernières choses et après je passerai ce topic en résolu :

    1) dans ta macro est-il possible d'insérer les cellules copier au dessus de la 1ère ligne vide rencontré tout en conservant la mise en forme des cellules d'origine ?
    car j'ai des informations sous le tableau dans mon fichier final
    si je remplace ActiveSheet.Paste par Selection.Insert Shift:=xlDown ça m'insert bien les lignes mais la mise en forme des cellules d'origine ne suit pas


    2) si j'ai plusieurs fois la même liste avec des fonction Fam1, Fam2 ... est-ce que dans la fonction autofilter je peux utiliser les différents choix pour faire un filtre suivant plusieurs critère?

    merci pour ton aide et ta patience (j’apprends beaucoup en même temps, j'ai essayé de me dépatouiller pour les 2 derniers points mais je n'ai pas encore trouvé)

  11. #11
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    1) dans ta macro est-il possible d'insérer les cellules copier au dessus de la 1ère ligne vide rencontré tout en conservant la mise en forme des cellules d'origine ?
    Au-dessus de la première ligne vide, il y a une ligne pleine, et vous voulez écraser la dernière ligne pleine, est-ce bien cela?
    Pour ce qui est de la mise en forme, peut-on recopier la mise en forme de la ligne au-dessus?

    2) si j'ai plusieurs fois la même liste avec des fonction Fam1, Fam2 ... est-ce que dans la fonction autofilter je peux utiliser les différents choix pour faire un filtre suivant plusieurs critère?
    Faire un filtre multicritères, oui mais alors il me faut procéder autrement, la boîte de dialogue ne permet pas ces sélections multiples.

    Répondez aux 2 questions et j'aviserai plus tard.

    Cdlt

  12. #12
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    En attendant vos réponses, voici l'avancement du projet. Le choix des familles se fait via un formulaire qui s'ouvre par un clic sur le bouton "Afficher la liste des familles", choisissez les familles et cliquez sur "Valider"
    le fichier
    Pièce jointe 529126

    Le code du module UserForm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Valider_la_sélection_Click()
        ReDim Crit(9) As String
        n = 1
        For i = 0 To ListBox1.ListCount - 1 'on récupère toutes les sélections de la listbox
            If ListBox1.Selected(i) = True Then
                Crit(n) = ListBox1.List(i)
                n = n + 1
            End If
        Next
        [J1].Resize(n) = Application.Transpose(Crit) 'on affiche la sélection en colonne J
        Filtrage 'on applique le filtre
        Unload Liste_de_choix 'on ferme le formulaire
    End Sub
    Le code du module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Public n As Long
     
    Sub Afficher_Liste_Des_Familles()
        Sheets("Feuil1").Select
        Liste_de_choix.Show
    End Sub
     
    Sub Filtrage()
        Dim DerLig_f2 As Long, NbCol As Long, NwLig As Long
        Application.ScreenUpdating = False
        Set f1 = Sheets("Feuil1")
        Set f2 = Sheets("Feuil2")
        Set f3 = Sheets("Feuil3")
     
        DerLig_List = f1.Range("J" & n + 1).Row
        ReDim x(DerLig_List) As String
        For i = 2 To DerLig_List
            x(i) = f1.Range("J" & i).Value
        Next
     
        f2.Select 'sur la feuille 2
        DerLig_f2 = f2.Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille 2
        Set Filtre = f2.Range("A1:A" & DerLig_f2)
        ActiveSheet.AutoFilterMode = False 'on supprime les filtres existants
        [A1].AutoFilter 'on met le filtre sur ligne 1
        f2.Range("A1:A" & DerLig_f2).AutoFilter Field:=1, Criteria1:=Array(x), Operator:=xlFilterValues 'on filtre avec les sélections de la listbox
        f1.Range("J2:J" & DerLig_List).ClearContents 'on efface les sélections de la colonne J de la feuille 1
     
        'd'après la sélection de la liste, on récupère les données filtrées de la feuille 2
        NbCol = ActiveSheet.[IV2].End(xlToLeft).Column 'nombre de colonnes de la feuille 2
        ActiveSheet.Range("_FilterDataBase").Resize(, NbCol).SpecialCells(xlCellTypeVisible).Copy 'on copie la zone filtrée
     
        f1.Select 'sur la feuille 1
        NewLig = Range("A" & Rows.Count).End(xlUp).Row + 1 'trouve la première ligne vide
        If NwLig < 13 Then NewLig = 13
        Cells(NewLig, "A").Select 'on se positionne sur la première cellule vide
        ActiveSheet.Paste 'on colle la zone filtrée de la feuille 2
        Rows(NewLig).Delete 'on efface la première ligne contenant le titre
        f1.Range(Cells(NewLig - 1, "A"), Cells(NewLig - 1, NbCol)).Copy 'on recopie le format de la ligne précédente
        f1.Range(Cells(13, "A"), Cells(Range("A" & Rows.Count).End(xlUp).Row, NbCol)).PasteSpecial Paste:=xlPasteFormats
    End Sub
    Cdlt

  13. #13
    Futur Membre du Club
    Homme Profil pro
    demande de renseignement
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : demande de renseignement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par ARTURO83 Voir le message
    Bonjour,


    Au-dessus de la première ligne vide, il y a une ligne pleine, et vous voulez écraser la dernière ligne pleine, est-ce bien cela?
    Pour ce qui est de la mise en forme, peut-on recopier la mise en forme de la ligne au-dessus?


    Faire un filtre multicritères, oui mais alors il me faut procéder autrement, la boîte de dialogue ne permet pas ces sélections multiples.

    Répondez aux 2 questions et j'aviserai plus tard.

    Cdlt
    bonjour

    désolé mon fils estt tombé mlade

    1) je veux insérer les lignes sans écraser ce qu'il y a en dessous ; pour la mise en forme elle est conditionnée donc il faut garder la mise en forme des cellules copiées

    2) pour le filtre multiple je vais regarder votre second message qui à l'air de correspondre à l'attente ==> je viens de regarder :

    pour la multiselection du filtre c'est nickel
    par contre il faut bien que les lignes s'insèrent à la fin du tableau pour ne pas écraser ce qui existe sous le tableau

    (le code devient complexe merci pour toutes les explications fournis avec)

  14. #14
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Voici la dernière mouture, espérons que ce soit la bonne.
    le fichier
    Pièce jointe 529290

    le code utilisé
    dans le module du formulaire(inchangé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub Valider_la_sélection_Click()
        ReDim Crit(9) As String
        n = 1
        For i = 0 To ListBox1.ListCount - 1 'on récupère toutes les sélections de la listbox
            If ListBox1.Selected(i) = True Then
                Crit(n) = ListBox1.List(i)
                n = n + 1
            End If
        Next
        [J1].Resize(n) = Application.Transpose(Crit) 'on affiche la sélection en colonne J
        Filtrage 'on applique le filtre
        Unload Liste_de_choix 'on ferme le formulaire
    End Sub


    dans le module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    Public n As Long
     
    Sub Afficher_Liste_Des_Familles()
        Sheets("Feuil1").Select
        Liste_de_choix.Show
    End Sub
     
    Sub Filtrage()
        Dim DerLig_f2 As Long, NbCol As Long, NwLig As Long
        Application.ScreenUpdating = False
        Set f1 = Sheets("Feuil1")
        Set f2 = Sheets("Feuil2")
        Set f3 = Sheets("Feuil3")
     
        DerLig_List = f1.Range("J" & n + 1).Row
        ReDim x(DerLig_List) As String
        For i = 2 To DerLig_List
            x(i) = f1.Range("J" & i).Value
        Next
     
        f2.Select 'sur la feuille 2
        DerLig_f2 = f2.Range("A" & Rows.Count).End(xlUp).Row 'dernière ligne de la feuille 2
        Set Filtre = f2.Range("A1:A" & DerLig_f2)
        ActiveSheet.AutoFilterMode = False 'on supprime les filtres existants
        [A1].AutoFilter 'on met le filtre sur ligne 1
        f2.Range("A1:A" & DerLig_f2).AutoFilter Field:=1, Criteria1:=Array(x), Operator:=xlFilterValues 'on filtre avec les sélections de la listbox
        f1.Range("J2:J" & DerLig_List).ClearContents 'on efface les sélections de la colonne J de la feuille 1
     
        'd'après la sélection de la liste, on récupère les données filtrées de la feuille 2
        NbCol = ActiveSheet.[IV2].End(xlToLeft).Column 'nombre de colonnes de la feuille 2
        NbLig = Range("_FilterDataBase").Resize(, 1).SpecialCells(xlCellTypeVisible).Count - 1 'Nombre de lignes filtrées
     
        f1.Select 'sur la feuille 1
        'Détection de la ligne "ajouter avant"
        Set NewLig = f1.Columns("A").Find("ajouter avant")
        LigOrig = NewLig.Row
        Rows(LigOrig & ":" & LigOrig + NbLig).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
     
        f2.Range("_FilterDataBase").Resize(, NbCol).SpecialCells(xlCellTypeVisible).Copy 'on copie la zone filtrée
        Cells(LigOrig, "A").Select 'on se positionne sur la première cellule vide
        ActiveSheet.Paste 'on colle la zone filtrée de la feuille 2
        Rows(LigOrig).Delete 'on efface la première ligne contenant le titre
    End Sub
    Je souhaite un prompt rétablissement pour votre fils.

    Cdlt

  15. #15
    Futur Membre du Club
    Homme Profil pro
    demande de renseignement
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : demande de renseignement
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonsoir

    merci beaucoup pour ton aide et ta patience
    la macro fait exactement ce que je veux et j'ai réussi à l'adapter à mon fichier de travail grace aux commentaires que tu as ajouté

    et mon fils est guéri tout va bien

    bonne soirée

    je ne sais pas comment passer en résolu par contre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Problème avec liste de choix sous VBA‏
    Par robinicol dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/03/2011, 10h07
  2. Réponses: 0
    Dernier message: 30/06/2010, 16h27
  3. Faire un submit avec liste de choix
    Par mcdelay dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/09/2006, 16h31
  4. [vba-e] Liste de choix dans ComboBox
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/07/2006, 15h53
  5. [VBA-E]Liste de choix
    Par sat478 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 02/03/2006, 15h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo