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 :

selectionner plusieurs lignes


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut selectionner plusieurs lignes
    bonsoir a tous

    voila j'ai dans un tableau plusieurs nom
    et sur un formulaire, je voudrais pouvoir en sélectionner plusieurs
    et ensuite après validation que par rapport à ces "noms" choisis, la ligne qui corresponde soit copier sur un deuxième tableau et ensuite supprimer du 1er tableau.

    voici une semaine que je cherche sans trouver
    tout d'abord qu'est ce qui est le plus simple (des cases a cocher, une zone liste)

    si c'est des cases a cocher : comment en faire apparaitre autant que j'ai de nom et avec le nom

    si c'est une zone de liste, comment sélectionner plusieurs noms


    bref je tourne en rond

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Citation Envoyé par bosk1000 Voir le message
    si c'est une zone de liste, comment sélectionner plusieurs noms
    Affecter la valeur fmMultiSelectMulti à la propriété 'MultiSelect' de ta liste.

    PGZ

  3. #3
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    merci pour ton aide

    j'ai suivi ton conseil
    grace a ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boxreliquat.MultiSelect = fmMultiSelectMultiti
    je peux selectionner plusieurs nom


    si c'est pas trop abusé
    peux tu me dire comment faire pour que je puisse copier et suprimer les lignes correspondant au nom choisis

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Re,

    Tu connais le nombre d'éléments de ta liste avec la propriété ListCount.
    Tu regardes de 0 à ListCount-1 la propriété Selected(i). Si elle est vrai, le nom List(i) est sélectionné (ou List(i,j) si tu utilises plusieurs colonnes).
    Tu trouveras ainis tous les noms sélectionnés.

    Ca t'aide?

    PGZ

  5. #5
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    grace a toi et en fouillant sur le site j'ai fait ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        Dim i As Variant
        For i = 0 To boxreliquat.ListCount - 1
            If boxreliquat.Selected(i) = True Then MsgBox boxreliquat.List(i)
        Next i
    j'obtient une msg box qui me confirme mes choix.

    Et la je bute sur le moyen de copier les lignes de cette sélection dans une autre feuille

    j'ai essayé avec :
    ActiveCell.Value = i
    et la j'obtiens toujours la valeur 11
    quelques sois mes chois

  6. #6
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour Bosk

    Tu sais déjà lire les noms sélectionnés. Pour la suite, il serait utile que tu précises qq points:
    1. Dans quelle feuille se trouve chaque tableau
    2. Chaque tableau commence dans quelle cellule
    3. Y at-il des lignes de titres
    4. Quelle est la colonne qui contient les noms sélectionnés?
    5. Y a-t-il une colonne qui est toujours renseignée?

    A plus tard,

    PGZ

  7. #7
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    bonjour Pgz

    je tiens fvraiment a te remercier pour ton aide precieuse, car tu me donne les indice qui me permette de trouver par la suite

    c'est très instructif de cette manière

    pour répondre
    1. la feuille "commandeelectro" contient le tableau qui sert de source à la zone de liste "boxreliquat"
    je veux envoyer les lignes choisis vers la feuille "prepafact"

    2.le premier tableau commence en "a1" jusqu'a "n1" pour l'entete de colonne, meme si ce sont les 6 premières entète que je fais apparaitre dans la zone de liste, mais de la 7e à la 14eme ne sont pas forcement renseigné alors que les 6 premières le sont presque toujours toutes

    le deuxième tableau commence en a1, il n'est qu'une etape transitoire, je n'ai pas besoin d'entete

    3.ce que tu appelle ligne de titre
    ce sont les entetes de colonnes ?
    je les ai fait apparaitre dans la zone de liste
    code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub UserForm_Initialize()
    boxreliquat.ColumnHeads = True 'en tete de colone
    boxreliquat.ColumnCount = 6 ' nombre de colone a afficher
    boxreliquat.ColumnWidths = "80;50;70;80;50;50"
    boxreliquat.RowSource = "commandeelectro!a2:f" & Range("commandeelectro!a65536").End(xlUp).Row ' etendue de la liste a fficher
    boxreliquat.MultiSelect = fmMultiSelectMulti
    End Sub
    4. la colone a

    5. la colonne "a" est obligatoire, les colonnes "b" à "f".. il se peux que défois certains cellules reste vides, quand à "g" à "n", il y a toujours certaines cellules qui seront vides

  8. #8
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Je te propose une méthode qui sort un peu des sentiers battus.
    Première étape : nommer les deux tableaux. On va utiliser des noms de classeur et définir dynamiquement ces tableaux qui ont tous les deux : un nombre de colonnes fixe, un nombre de lignes variable.
    On pourrait faire cette définition par code, mais comme elle n'est à faire qu'une fois tu peux le faire en manuel.

    Pour le premier, par ex TableauCommandes tu écris dans la zone d'adresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    = DECALER(commandeselectro!$A$1;0;0;NBVAL(Commandeselectro!$A:$A);14)
    Pour le deuxième, par ex TableauFactures, tu écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    = DECALER(prepafact!$A$1;0;0;NBVAL(prepafact!$A:$A);14)
    Quand ces définitions sont faites et désignent bien toute la plage de chacun des tableau, tu fais signe pour la suite.

    PGZ

  9. #9
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    je n'ai jamais utiliser cette fonction
    dois-je le vais dans lors du click (Private Sub velidelectro_Click)
    ou dans une autre fonction private sub ?

    car tu me parle de zone d'adresse et je ne connais pas cela !

  10. #10
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    en poussant un peu mieux les recherche (j'ai fait une recherche avec "=decaler(" au lieu de "decaler"
    j'ai trouver ceci :
    http://www.developpez.net/forums/d69...ueur-variable/

    une explication de Pierre Fauconnier expliquant comment faire

    mais avant de faire une manip desastreuse, je prefere te demander confirmation

    est-ce que je prend les 14 colones de mon tableau de la feuille commandeelectro et ensuite je fait : Insertion/Nom/Définir

    par contre je suis sous excel 2007, la commande n'est pas la même

  11. #11
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Avec XL 2007 : onglet Formules, 'Gestionnaire de Noms', 'Nouveau'
    EN face de Nom : TableauCommandes
    Zone : Classeur
    Fait référence à : tu tapes la formules et OK

    Tu reviens dans la fenêtre du gestionnaire de noms.
    En sélectionnant le nom créé, tu as en bas 'Fait Référence à". Tu cliques sur l'icone à droite et la plage sélectionnée doit être visible et correpondre à ton tableau.

    PGZ

  12. #12
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    ok
    j'ai fais ce que tu m'as dit

  13. #13
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bon alors on y va.

    COmme les tableaux peuvent être grands, on utilise une variable pour faire la recherche. Si le traitement dure trop longtemps, l'opérateur passe sa journée en pause café...Et finit nerveux.

    Je te propose ce 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
    28
    29
    30
    31
    32
    33
    34
    35
    Sub subBosk()
    Dim i As Integer
    Dim vC() As Variant
    Dim L As Long, lCopie As Long
    Dim shC As Excel.Worksheet, shF As Excel.Worksheet
     
    Set shC = Application.ThisWorkbook.Worksheets("commandeselectro")
    Set shF = Application.ThisWorkbook.Worksheets("prepafact")
    Application.ScreenUpdating = False
     
    For i = 0 To boxreliquat.ListCount - 1
        If boxreliquat.Selected(i) = True Then
            'chercher dans TableauCommandes le nom boxreliquat.List(i). On considère qu'il peut se trouver sur plusieurs lignes
            vC() = Application.Evaluate("TableauCommandes").Value
            'comme les tableaux commencent en ligne1 et pas de titre = pas de décalage entre indice et num ligne
            'on commence à la fin pour ne pas introduire de décalage
            For L = UBound(vC, 1) To 1 Step -1
                If vC(L, 1) = boxreliquat(i) Then
                'en ligne
                lCopie = Application.Evaluate("TableauFactures").Rows.Count + 1
                'il faut copier la ligne L
                shC.Range(shC.Cells(L, 1), shC.Cells(L, 14)).Copy shF.Range(shF.Cells(lCopie, 1), shF.Cells(lCopie, 14))
                'et l'effacer
                shC.Rows(L).Delete
            Next L
        End If
    Next i
     
    Set shC = Nothing
    Set shF = Nothing
    Erase vC
     
    Application.ScreenUpdating = True
     
    End Sub
    Attention : c'est pour les idées. Je n'ai pas testé.
    Tu vérifies les noms des feuilles, des tableaux, ...

    ET on voit où ça plante...

    PGZ

  14. #14
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    bon tout d'abord sauf erreur de ma part j'ai mis dans la partie velidelectro_Click() "subbosk" pour que ta macro se declenche lorsque je clique sur validez, après avoir eu la msgbox qui me confirme mes choix

    donc lorsque je clique ok sur la msgbox, j'obtient une box "erreur de compilation/next sans for" et le focus est sur "next L"

  15. #15
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Il manque un End if. Au temps pour moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
           For L = UBound(vC, 1) To 1 Step -1
                If vC(L, 1) = boxreliquat(i) Then
                    'en ligne
                    lCopie = Application.Evaluate("TableauFactures").Rows.Count + 1
                    'il faut copier la ligne L
                    shC.Range(shC.Cells(L, 1), shC.Cells(L, 14)).Copy shF.Range(shF.Cells(lCopie, 1), shF.Cells(lCopie, 14))
                    'et l'effacer
                    shC.Rows(L).Delete
                End if
            Next L
    Désolé.

    PGZ

  16. #16
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    ok, c'est fait

    et la :
    erreur d'execution 424
    objet requis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vC() = Application.Evaluate("TableauCommandes").Value

    question toute bete
    faut-il lui dire "dim TableauCommandes as ...quelque chose"

  17. #17
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    TableauCommandes, c'est le nom donnée à la plage de la feuille "commandeselectro". Voir message de 19H11.
    Et TableauFactures, c'est le deuxième, de la feuille "prepafact".

    Tu vois?

    PGZ

  18. #18
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    pas de souci de ce coté la
    j'ai nommer mes tableau avec les noms que tu m'as donné
    le seul nom différent est "commandeselectro" que j'ai nommé "commandeelectro", mais j'ai fait attention a cela en recopiant le code

    j'ai bien nommer le premier tableau "TableauFactures" et le deuxieme "prepafact", en prenant dans les 2 cas la colonne "a" à "f" et lorsque j'ai nommer les tableau
    j'ai bien coller les formule sur "fait reference à :"

    le focus se situant sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      vC() = Application.Evaluate("TableauCommandes").Value
    je pense que le souci se trouve sur vc ou TableauCommandes

    la precision objet requis fait il réfrence à une dimension a nommer (dim vc as...) ou sur la nomination de TableauCommandes dans la feuil excel ??

    lorsque j'ai copîer ta formule, j'ai pas fai attention a la nomination de la feuille commandeselectro dans la formule

    on avance, on avance

    cette fois ci j'ai :
    erreur d'execution 13
    incompatibilité de type
    focus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If vC(L, 1) = boxreliquat(i) Then
    je doit partir me coucher
    je serais a nouveau la demain
    encore merci
    tu es d'une grande aide
    et j'aprend beaucoup de toi

  19. #19
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Encore une erreur de ma partA plus tard pour la suite,

    PGZ

  20. #20
    Membre averti Avatar de bosk1000
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    706
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 706
    Points : 367
    Points
    367
    Par défaut
    bonsoir

    désolé d'arriver si tard

    bon j'ai mis ton code après le "then"
    j'obtient
    erreur de compilation
    utilisation incorrect de la propriété

    focus sur ".list" du bou de code que tu m'as envoyé hier soir

    "boxreliquat.List(i)"

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Selectionner plusieurs lignes dans une Grille
    Par KuBi4K dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/11/2009, 11h06
  2. [XL-2000] Selectionner plusieurs lignes
    Par s.echeff dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/04/2009, 11h09
  3. Réponses: 2
    Dernier message: 26/08/2008, 15h48
  4. [VBA-E] comment selectionner plusieurs lignes
    Par Annick.w dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/01/2007, 20h15
  5. comment savoir si on a selectionne plusieurs lignes? LISTBOX
    Par nath-0-0 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 09/03/2006, 14h23

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