VBA Excel03 - Copier lignes avec conditions

Résolu/Fermé
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 - Modifié par Palteza le 9/04/2010 à 14:26
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 - 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.

A voir également:

4 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
9 avril 2010 à 10:25
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)
0
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
9 avril 2010 à 12:26
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!
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
9 avril 2010 à 13:26
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)
0
Palteza Messages postés 79 Date d'inscription mercredi 2 décembre 2009 Statut Membre Dernière intervention 6 septembre 2014 3
Modifié par Palteza le 9/04/2010 à 13:46
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.
0