VBA Excel03 - Copier lignes avec conditions
Résolu
Palteza
Messages postés
79
Date d'inscription
Statut
Membre
Dernière intervention
-
Palteza Messages postés 79 Date d'inscription Statut Membre Dernière intervention -
Palteza Messages postés 79 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- VBA Excel03 - Copier lignes avec conditions
- Comment copier une vidéo youtube - Guide
- Super copier - Télécharger - Gestion de fichiers
- Historique copier coller - Guide
- Copier disque dur - Guide
- Unstoppable copier - Télécharger - Récupération de données
4 réponses
Bonjour,
Ce n'est pas la bonne syntaxe. Il faut faire comme ça :
Si tu as 27 conditions je te conseille de faire un Select Case, par exemple :
;o)
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)
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!
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!
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:
Si la tâche à effectuer est toujours la même, le Select Case ne s'impose pas.
On peut faire ainsi :
;o)
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)
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.
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.