Les Allergies
Alimentaires
Posez votre question Signaler

VBA Excel03 - Copier lignes avec conditions [Résolu]

Palteza 62Messages postés 2 décembre 2009Date d'inscription 30 décembre 2010Dernière intervention - Dernière réponse le 9 avril 2010 à 13:46
J'ai trouvé ce code sur un vieux post du forum, qui test si une cellule est vide (à la base, le test était If Cells(x,y) <> "") sur telle colonne, la macro copie la ligne correspondante sur une autre feuille si tel est le cas.
Cependant, en voulant l'adapter à mon cas, j'ai rencontré des problèmes. Voici la tête de ma macro (seul le If change fondamentalement)
Sub FiltreLulu()
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long
Sheets("Two").Activate ' feuille de destination
Col = "E" ' colonne de la donnée non vide à tester
NumLig = 2
With Sheets("One") ' feuille source
NbrLig = .Cells(65536, Col).End(xlUp).Row
For Lig = 1 To NbrLig
If .Cells(Lig, Col).Value = 33003 Or 33004 Then
.Cells(Lig, Col).EntireRow.Copy
NumLig = NumLig + 1
Cells(NumLig, 1).Select
ActiveSheet.Paste
End If
Next
End With
End Sub
Si je teste sur une seule condition (33003), ça marche nickel. Mais à partir du moment ou je rajoute une condition (33003 Or 33004 ... en réalité j'aurais 27 nombres à tester), il me copie tout le tableau sans répondre aux conditions ... le multiconditionnel ne semble donc pas être pris en compte.
J'avoue bloquer sévère. Si quelqu'un à une idée, je l'en remercie d'avance.
Lire la suite 

VBA Excel03 - Copier lignes avec conditions »

4 réponses
Réponse
+0
moins plus
Bonjour,

Ce n'est pas la bonne syntaxe. Il faut faire comme ça :

If .Cells(Lig, Col).Value = 33003 Or .Cells(Lig, Col).Value = 33004


Si tu as 27 conditions je te conseille de faire un Select Case, par exemple :

With Sheets(1) ' feuille source
NbrLig = .Cells(65536, 2).End(xlUp).Row
    For Lig = 5 To NbrLig
    com = .Cells(Lig, 2).Value
        Select Case com
            Case 33003 To 330030
                .Cells(Lig, 2).EntireRow.Copy
                NumLig = NumLig + 1
                Cells(NumLig, 1).Select
                ActiveSheet.Paste
        End Select
    Next
End With


;o)
Ajouter un commentaire
Réponse
+0
moins plus
Merci Polux pour la réponse, ça fonctionne très bien en adaptant le Case.

Pour vraiment cerner la chose, question fonctionnement :

- Comment opère la commande Case en liaison avec ta variable com (qu'est-ce qu'elle fait vraiment?)
- pareil pour Select : rien de sorcier, c'est juste une sélection?

Merci bien en tout cas!
Ajouter un commentaire
Réponse
+0
moins plus
La variable "com" récupère la valeur de la cellule ".Cells(Lig, 2).Value"

Le Select Case permet d'effectuer un code en fonction du "Select". Ici c'est le contenu de la cellule,"com" qui détermine ce qu'il faut traiter.

Dans ton exemple, tu dis que tu as 27 cellules à tester. Tu aurais pu avoir un traitement différent en fonction de la valeur de la cellule. Par exemple mettre une couleur de fond différente:

With Sheets(1) ' feuille source
NbrLig = .Cells(65536, 2).End(xlUp).Row
    For Lig = 5 To NbrLig
    com = .Cells(Lig, 2).Value
        Select Case com
            Case 33003 To 33010
                .Cells(Lig, 2).EntireRow.Copy
                .Cells(Lig, 2).Interior.Color = VBGreen
                NumLig = NumLig + 1
                Cells(NumLig, 1).Select
                ActiveSheet.Paste

            Case 33011 To 33020
                .Cells(Lig, 2).EntireRow.Copy
                .Cells(Lig, 2).Interior.Color = VBRed
                NumLig = NumLig + 1
                Cells(NumLig, 1).Select
                ActiveSheet.Paste

           ' etc .....
        End Select
    Next
End With


Si la tâche à effectuer est toujours la même, le Select Case ne s'impose pas.

On peut faire ainsi :

With Sheets(1) ' feuille source
NbrLig = .Cells(65536, 2).End(xlUp).Row
    For Lig = 5 To NbrLig
       If .Cells(Lig, 2).Value >= 33003 And .Cells(Lig, 2).Value =< 330030 Then
                .Cells(Lig, 2).EntireRow.Copy
                NumLig = NumLig + 1
                Cells(NumLig, 1).Select
                ActiveSheet.Paste
        End If
    Next
End With



;o)
Ajouter un commentaire
Réponse
+0
moins plus
Impec' les éclaircissements!

Ton Select Case allait vraiment bien dans ce cas, puisque ce sont des valeurs de 330xx à 339xx à tester, mais dans ce champ seules très peu sont à sélectionner (en fait ça correspondait, en gros, à des codes postaux) ... je les ai donc énumérées en les séparant de virgules.

Merci encore, je passe ça en résolu.
Ajouter un commentaire
Ce document intitulé « VBA Excel03 - Copier lignes avec conditions » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?