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 :

[VBA-E] sélection plusieurs lignes selon critères


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut [VBA-E] sélection plusieurs lignes selon critères
    Bonjours,

    J'ai un tableau de salariés avec leur contrat (feuille contrat):

    nom-contrat1-debut - fin
    claire-cdd- 01/01/05-01/02/05
    lucile-cdd- 01/01/05


    J'aimerais créer une zone multi sélection avec seulement les salariés sortis:


    mon idée était de copier tous les salariés ayant fini un contrat dans une autre feuille puis de faire ma zone de liste.
    je n'arrive déjà pas à faire une copie multiple d'après un critère, voici mon 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
    Dim i As Integer
    Dim r As Boolean
    Dim iL As Range
     
    For i = 2 To 50
    If Worksheets("contrat").Cells(i, 5) <> "" Then
    Set iL = Rows(i)
    End If
    Next
     
     
     
    iL.Select
    iL.Copy
     
    Worksheets("sortie").Select
    Range("a2").Select
    Do While ActiveCell <> ""
    ActiveCell.Offset(1, 0).Select
    Loop
    ActiveSheet.Paste
     
     
    salsorti.RowSource = sortie!("a2:d10")
    salsorti.ColumnCount = 5
     
    salsorti.ListStyle = fmListStyleOption
    salsorti.MultiSelect = fmMultiSelectMulti
    salsorti.IntegralHeight = True
    salsorti.ColumnHeads = True
    salsorti.ColumnWidths = "8cm;2cm;2cm;2.5cm;2.5cm"
    peut_être y a t-il un moyen plus court, je ne sais pas!

    merci bcp

  2. #2
    Expert confirmé Avatar de illight
    Homme Profil pro
    Analyste décisionnel
    Inscrit en
    Septembre 2005
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Analyste décisionnel
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 342
    Points : 4 299
    Points
    4 299
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 2 To 50
    If Worksheets("contrat").Cells(i, 5) <> "" Then
    Set iL = Rows(i)
    End If
    Next
    je comprend pas ce que tu veux faire avec ça

    Pkoi le reste de ton code tu le met pas dans cette boucle aussi ? plutot que sortir de ta boucle puis faire un copier/coller ?

    si tu écrit un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For i = 2 To 50
    If Worksheets("contrat").Cells(i, 5) <> "" Then
    rows(i).copy
    Worksheets("sortie").Select
    Range("a2").Select
    Do While ActiveCell <> ""
    ActiveCell.Offset(1, 0).Select
    Loop
    ActiveSheet.Paste
    End If
    Next
    je pense que ça marchera aussi bien

    (ceci est peut etre faux mais c pour te donner une idée de la chose)


    Sinon a quoi elle sert ta boucle do while la ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    salut
    j'ai essayé ton code mais je n'obtiens qu'une seule ligne dans mon 2ème tableau (le 1er salarié).

    si j'ai plusieurs salariés qui s'en vont, il faut copier toutes les lignes correspondants à ces salariés. C'est pour ça que j'ai pensé que do while était utile, pour ne pas copier à chaque fois sur la même ligne.

    il faudrait arriver à copier une sélection multiple ou simplement l'utiliser pour ma zone de liste.

    merci d'avance

  4. #4
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Juste pour donner une piste un peu différente:
    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
    Private Sub UserForm_Initialize()
     
      Dim rCol As Range
      Dim rCell As Range
      With Sheets("contrat")
        Set rCol = Range(.[A2], .Cells(.Cells.SpecialCells(xlLastCell).Row, 1))
      End With
     
      Me.salsorti.ColumnCount = 5
      Me.salsorti.ListStyle = fmListStyleOption
      Me.salsorti.MultiSelect = fmMultiSelectMulti
      Me.salsorti.IntegralHeight = True
      Me.salsorti.ColumnHeads = True
      Me.salsorti.ColumnWidths = "8cm;2cm;2cm;2.5cm;2.5cm"
     
      For Each rCell In rCol
        If rCell.Offset(0, 3) > 0 Then
          Me.salsorti.AddItem rCell
          Me.salsorti.List(Me.salsorti.ListCount - 1, 1) = rCell.Offset(0, 1)
          Me.salsorti.List(Me.salsorti.ListCount - 1, 2) = rCell.Offset(0, 2)
          Me.salsorti.List(Me.salsorti.ListCount - 1, 3) = rCell.Offset(0, 3)
        End If
      Next rCell
     
    End Sub

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    merci pour le code mais étant débutante, j'ai quelques questions pour pouvoir le comprendre:

    *rcol:
    1)sélection plage de a2 à ?, suis allée sur aide mais ne trouve pas xllastcell, seulement xlcelltypelastcell, est pareil?

    2)est-ce pour sélectionner la colonne de fin de contrat?

    *rcell: d'après la suite je crois que c'est une cellule de la colonne 1 mais vraiment pas sûr, comment le code le "sait"?

    *enfin, list(me.salsorti.listcount-1,1): listcount-1 est-ce pour définir les en-tête de ma liste? ce n'est vraiment pas clair pour moi.

    merci par avance
    claire

  6. #6
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    • rcol
      1. Oui. xlLastCell n'est pas documenté mais est équivalent à xlCellTypeLastCell et est plus court à taper
      2. Non. Si la première cellule est [A2], on prendra donc la colonne A.
        Ceci est juste une habitude de travail pour moi. Tu peux, si tu veux, choisir la colonne D. Ca te permet d'avoir un Offset en moins à taper pour accéder à la colonne D.
        Seulement, comme tu dois copier l'entièreté d'une ligne (en partant de la colonne A), il vaut mieux faire comme j'ai fait.
    • rcell
      Dans une boucle For Each, on parcourt les éléments d'une collection.
      Dans le cas présent, la collection est un Range, donc les éléments sont des cellules.
    • enfin
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Me.salsorti.List(Me.salsorti.ListCount - 1, 1)
      signifie qu'on va ajouter une valeur dans la dernière entrée de salsorti, dans la colonne 1 (la deuxième).
      Petite explication. Comme pour les tableaux, la première entrée (ligne) d'une liste a l'index 0. Après ajout (AddItem) de la première ligne, si on compte les lignes (ListCount) on en compte 1 et elle a l'index 0. D'où le - 1 pour l'index à partir du ListCount.

    J'espère que c'est un peu plus clair...

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    merci pour les explications, je comprends déjà un peu mieux; mais il n'y a rien qui apparait dans ma listbox.

    pourquoi pour rcol il y a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rCol = Range(.[A2], .Cells(.Cells.SpecialCells(xlCellTypeLastCell).Row, 1))
    et pas pour rcell?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If rCell.Offset(0, 3) > 0 Then
    est-ce important que cette colonne soit des dates?

    merci encore
    claire

  8. #8
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Citation Envoyé par clairefranclieu
    pourquoi pour rcol il y a:
    Il y a quoi???

    Je n'ai pas compris la question.

    Citation Envoyé par clairefranclieu
    est-ce important que cette colonne soit des dates?
    Quelle colonne?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Ca y est ça marche mais en rajouttant un bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub sos_click()
    à la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub UserForm_Initialize()
    Je ne sais pas pourquoi!!!!!

    Dernier petit souci, malgré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Me.salsorti.ColumnHeads = True
    Il n'y a pas d'en tête dans ma listbox.

    vraiment merci pour le code, ça me sauve!
    claire

Discussions similaires

  1. Conserver plusieurs lignes selon critères
    Par ketipo dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/12/2013, 12h39
  2. Réponses: 6
    Dernier message: 06/09/2012, 11h31
  3. Sélection de lignes selon certains critères
    Par gangsterus dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/10/2007, 00h01
  4. [VBA-E] Sélection des lignes en utilisant AUJOURDHUI()
    Par gabygaby dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 11/04/2007, 05h05
  5. Réponses: 7
    Dernier message: 29/06/2006, 11h11

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