Copie de certaines cellules selon 2 critères
Résolu
thealchemyst
Messages postés
18
Statut
Membre
-
thealchemyst Messages postés 18 Statut Membre -
thealchemyst Messages postés 18 Statut Membre -
Bonjour,
je suis entrain de créer une macro qui, selon les valeurs se trouvant des colonnes "E" et "K", vont copier certaines cellules des lignes ayant dans les colonnes "E" et "K", les valeurs recherchées.
Mon premier problème est que je ne trouve pas le moyen de copier uniquement certaines cellules des lignes comportant les deux critères dans les colonnes "E" et "K".
Alors j'ai fais ce code pour déjà tester si l'export fonctionnait
Dans un premier temps, avec ce code, cela me copie-colle bien les lignes entières selon le premier critère... Mais je voudrais que cela me copie uniquement les valeurs des cellules se trouvant en colonne "A, D, E, F, G, K" et pas toute la ligne. J'ai essayé la syntaxe ("A" & i, "D" & i, ..., "K" & i) mais ça me dit que "la méthode Range de l'objet _Global à échouée"... :(
Ensuite, j'ai pensé à mettre une nouvelle boucle For pour chercher le deuxième critère comme pour le premier.
Comme ceci :
Mais bien sûr, cela ne fonctionne pas... En tout cas pas comme je le voudrais. La première personne copiée-collée comporte bien les deux critères, mais il le copie-colle 6 fois. Si mon raisonnement est juste, du fait du deuxième For, il me le copie-colle 5 fois de plus (1+5), c'est bien ça ?
En plus, à partir de la deuxième personne copiée-collée, les critères ne correspondent plus. Mais là, je ne vois pas trop pourquoi...
Quelqu'un peut-il éclairer mes lanternes, s'il vous plaît.
Je pense que je comprends plus ou moins où sont mes erreurs de code, mais comme je fais du VBA depuis 2 mois, j'aurais besoin d'un petit coup de pouce.
je vais encore fouiner pour bien comprendre ce qui se passe derrière tout ça.
D'avance je vous remercie de votre intérêt et réponse à ce sujet.
je suis entrain de créer une macro qui, selon les valeurs se trouvant des colonnes "E" et "K", vont copier certaines cellules des lignes ayant dans les colonnes "E" et "K", les valeurs recherchées.
Mon premier problème est que je ne trouve pas le moyen de copier uniquement certaines cellules des lignes comportant les deux critères dans les colonnes "E" et "K".
Alors j'ai fais ce code pour déjà tester si l'export fonctionnait
Sub testexport()
Dim i As Integer
Dim j
repmois = "janvier"
Sheets("janvier 2014").Select
i = 3
For j = Range("E" & Rows.Count).End(xlUp).Row To 2 Step -1
If Range("E" & j) = "100" Then
Range("E" & j).EntireRow.Copy
Sheets("C").Select
If repmois = "janvier" Then
Range("A" & i).Select
ActiveSheet.Paste
i = i + 1
Sheets("janvier 2014").Select
ElseIf repmois = "février" Then
Range("H & i").Select
ActiveSheet.Paste
i = i + 1
Sheets("janvier 2014").Select
ElseIf repmois = "mars" Then
Range("O" & i).Select
ActiveSheet.Paste
i = i + 1
Sheets("janvier 2014").Select
ElseIf repmois = "avril" Then
Range("V" & i).Select
ActiveSheet.Paste
i = i + 1
Sheets("janvier 2014").Select
'Etc pour les mois suivant...
End If
End If
Next j
End Sub
Dans un premier temps, avec ce code, cela me copie-colle bien les lignes entières selon le premier critère... Mais je voudrais que cela me copie uniquement les valeurs des cellules se trouvant en colonne "A, D, E, F, G, K" et pas toute la ligne. J'ai essayé la syntaxe ("A" & i, "D" & i, ..., "K" & i) mais ça me dit que "la méthode Range de l'objet _Global à échouée"... :(
Ensuite, j'ai pensé à mettre une nouvelle boucle For pour chercher le deuxième critère comme pour le premier.
Comme ceci :
Sub testexport()
Dim i As Integer
Dim j, k
repmois = "janvier"
Sheets("janvier 2014").Select
i = 3
For j = Range("E" & Rows.Count).End(xlUp).Row To 2 Step -1
For k = Range("K" & Rows.Count).End(xlUp).Row To 2 Step -1
If Range("E" & j) = "100" And Range("K" & k) = "16" Then
Range("A" & j).EntireRow.Copy
Sheets("C").Select
If repmois = "janvier" Then
Range("A" & i).Select
ActiveSheet.Paste
Sheets("janvier 2014").Select
i = i + 1
ElseIf repmois = "février" Then
Range("H & i").Select
ActiveSheet.Paste
Sheets("janvier 2014").Select
i = i + 1
'Etc...
End if
End If
'Next k
Next j
End Sub
Mais bien sûr, cela ne fonctionne pas... En tout cas pas comme je le voudrais. La première personne copiée-collée comporte bien les deux critères, mais il le copie-colle 6 fois. Si mon raisonnement est juste, du fait du deuxième For, il me le copie-colle 5 fois de plus (1+5), c'est bien ça ?
En plus, à partir de la deuxième personne copiée-collée, les critères ne correspondent plus. Mais là, je ne vois pas trop pourquoi...
Quelqu'un peut-il éclairer mes lanternes, s'il vous plaît.
Je pense que je comprends plus ou moins où sont mes erreurs de code, mais comme je fais du VBA depuis 2 mois, j'aurais besoin d'un petit coup de pouce.
je vais encore fouiner pour bien comprendre ce qui se passe derrière tout ça.
D'avance je vous remercie de votre intérêt et réponse à ce sujet.
A voir également:
- Copie de certaines cellules selon 2 critères
- Supercopier 2 - Télécharger - Gestion de fichiers
- Copie cachée - Guide
- Copie écran samsung - Guide
- Copie disque dur - Guide
- Fusionner 2 cellules excel - Guide
9 réponses
Bonjour le fil, bonjour le forum,
peut-être comme ça :
peut-être comme ça :
Sub testexport() Dim OJ As Object 'déclare la variable OJ (Onglet Janvier 2014) Dim DL As Integer 'déclare la variable DL (Dernière Ligne) Dim OC As Object 'déclare la variable OC (Onglet C) Dim TC As Variant 'déclare la variable TC (Tableau de Cellules) Dim COL As Byte 'déclare la variable COL (COLonne) Dim I As Integer 'déclare la variable I (Incrément) Dim DEST As Range 'déclare la variable DEST (cellule de DESTination) repmois = "janvier" 'définit la variable repmois (j'imagine qu'elle est définie différemment...) Set OJ = Sheets("janvier 2014") 'définit l'onglet OJ Set OC = Sheets("C") 'définit l'onglet OC DL = OJ.Cells(Application.Rows.Count, 5).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 5 (=E) de l'onglet OJ TC = OJ.Range("A3:K" & DL) 'définit le tableau de cellules TC Select Case repmois 'action en fonction de la variable repmois Case "janvier" 'cas mois de janvier COL = 1 'définit la colonne COL Case "février" 'cas mois de février COL = 8 'définit la colonne COL Case "mars" 'cas mois de mars COL = 15 'définit la colonne COL Case "avril" 'cas mois d'avril COL = 22 'définit la colonne COL Case "mai" 'cas mois de mai COL = 29 'définit la colonne COL Case "juin" 'cas mois de juin COL = 36 'définit la colonne COL Case "juillet" 'cas mois de juillet COL = 43 'définit la colonne COL Case "août" 'cas mois d'août COL = 50 'définit la colonne COL Case "septembre" 'cas mois de septembre COL = 57 'définit la colonne COL Case "octobre" 'cas mois d'octobre COL = 64 'définit la colonne COL Case "novembre" 'cas mois de novembre COL = 71 'définit la colonne COL Case "décembre" 'cas mois de décembre COL = 78 'définit la colonne COL End Select 'fin de l'action en fonction de la variable repmois For I = 1 To UBound(TC, 1) 'boucle sur toutes les lignes du tableau TC If TC(I, 5) = "100" And TC(I, 11) = "16" Then 'condition : si la valeur en colonne 5 de la ligne vaut "100" et la valeur de la colonne 11 vaut "16" 'définit la cellule de destination DEST Set DEST = IIf(OC.Cells(1, COL).Value = "", OC.Cells(1, COL), OC.Cells(Application.Rows.Count, COL).Offset(1, 0)) DEST.Value = TC(I, 1) 'récupère á valeur de la ligne colonne 1 (=A) DEST.Offset(0, 1).Value = TC(I, 4) 'récupère á valeur de la ligne colonne 4 (=D) DEST.Offset(0, 2).Value = TC(I, 5) 'récupère á valeur de la ligne colonne 5 (=E) DEST.Offset(0, 3).Value = TC(I, 6) 'récupère á valeur de la ligne colonne 6 (=F) DEST.Offset(0, 4).Value = TC(I, 7) 'récupère á valeur de la ligne colonne 7 (=G) DEST.Offset(0, 5).Value = TC(I, 11) 'récupère á valeur de la ligne colonne 11 (=K) End If 'fin de la condition Next I 'prochaine ligne de la boucle End Sub
Re-bonjour,
Je voulais apporter encore une précision concernant les valeurs recherchées dans les colonnes "E" et "K" :
En faite, je cherche la valeur "100" dans la colonne "E" de la cellule E3 à E270.
Et "16" pour la colonne "K", aussi de K3 à K270, en remontant vers le haut.
Ce sera plus précis concernant ma demande.
Merci de vos réponses !
Je voulais apporter encore une précision concernant les valeurs recherchées dans les colonnes "E" et "K" :
En faite, je cherche la valeur "100" dans la colonne "E" de la cellule E3 à E270.
Et "16" pour la colonne "K", aussi de K3 à K270, en remontant vers le haut.
Ce sera plus précis concernant ma demande.
Merci de vos réponses !
Bonjour le fil, bonjour le forum,
Le code adapté à ta nouvelle requête. Dis-moi au moins si ça te convient que je sache si j'ai bien compris ton problème ou pas...
Le code adapté à ta nouvelle requête. Dis-moi au moins si ça te convient que je sache si j'ai bien compris ton problème ou pas...
Sub testexport() Dim OJ As Object 'déclare la variable OJ (Onglet Janvier 2014) Dim OC As Object 'déclare la variable OC (Onglet C) Dim TC As Variant 'déclare la variable TC (Tableau de Cellules) Dim COL As Byte 'déclare la variable COL (COLonne) Dim I As Integer 'déclare la variable I (Incrément) Dim DEST As Range 'déclare la variable DEST (cellule de DESTination) repmois = "janvier" 'définit la variable repmois (j'imagine qu'elle est définie différemment...) Set OJ = Sheets("janvier 2014") 'définit l'onglet OJ Set OC = Sheets("C") 'définit l'onglet OC DL = OJ.Cells(Application.Rows.Count, 5).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 5 (=E) de l'onglet OJ TC = OJ.Range("A3:K270") 'définit le tableau de cellules TC Select Case repmois 'action en fonction de la variable repmois Case "janvier" 'cas mois de janvier COL = 1 'définit la colonne COL Case "février" 'cas mois de février COL = 8 'définit la colonne COL Case "mars" 'cas mois de mars COL = 15 'définit la colonne COL Case "avril" 'cas mois d'avril COL = 22 'définit la colonne COL Case "mai" 'cas mois de mai COL = 29 'définit la colonne COL Case "juin" 'cas mois de juin COL = 36 'définit la colonne COL Case "juillet" 'cas mois de juillet COL = 43 'définit la colonne COL Case "août" 'cas mois d'août COL = 50 'définit la colonne COL Case "septembre" 'cas mois de septembre COL = 57 'définit la colonne COL Case "octobre" 'cas mois d'octobre COL = 64 'définit la colonne COL Case "novembre" 'cas mois de novembre COL = 71 'définit la colonne COL Case "décembre" 'cas mois de décembre COL = 78 'définit la colonne COL End Select 'fin de l'action en fonction de la variable repmois For I = UBound(TC, 1) To 3 Step -1 'boucle sur toutes les lignes du tableau TC If TC(I, 5) = "100" And TC(I, 11) = "16" Then 'condition : si la valeur en colonne 5 de la ligne vaut "100" et la valeur de la colonne 11 vaut "16" 'définit la cellule de destination DEST Set DEST = IIf(OC.Cells(1, COL).Value = "", OC.Cells(1, COL), OC.Cells(Application.Rows.Count, COL).Offset(1, 0)) DEST.Value = TC(I, 1) 'récupère á valeur de la ligne colonne 1 (=A) DEST.Offset(0, 1).Value = TC(I, 4) 'récupère á valeur de la ligne colonne 4 (=D) DEST.Offset(0, 2).Value = TC(I, 5) 'récupère á valeur de la ligne colonne 5 (=E) DEST.Offset(0, 3).Value = TC(I, 6) 'récupère á valeur de la ligne colonne 6 (=F) DEST.Offset(0, 4).Value = TC(I, 7) 'récupère á valeur de la ligne colonne 7 (=G) DEST.Offset(0, 5).Value = TC(I, 11) 'récupère á valeur de la ligne colonne 11 (=K) End If 'fin de la condition Next I 'prochaine ligne de la boucle End Sub
Bonjour ThauTheme,
Désolé, j'étais droit entrain de tester ton code :).
J'explore aussi d'autres solutions avec boucle imbriquée et Do While mais sans succès jusqu'à présent...
Eh bien j'ai une erreur d'incompatbilité de type à la ligne 41 sur la comparaison des valeurs de cellule des colonnes "E" et "K" (100 et 16).
Pour essayer de résumer au mieux, si dans ma colonne E j'ai la valeur 100 et que si dans la colonne K j'ai la valeur 16 (si j'ai ces deux conditions remplies).
Alors je dois copier les cellules correspondante (ou l'on trouve les deux conditions remplies) des colonnes A, D, E, F, G, H et K et les coller sur la feuille "C". Sur la feuille "C", la colonne A2 à F2 correspond à "janvier". L'en-tête étant (A1:F1 = "janvier") car j'ai fusionné les cellules.
J'éspère que je suis assez clair. Mais c'est déjà très très sympa de consacrer du temps à mon problème et de m'aider.
Désolé, j'étais droit entrain de tester ton code :).
J'explore aussi d'autres solutions avec boucle imbriquée et Do While mais sans succès jusqu'à présent...
Eh bien j'ai une erreur d'incompatbilité de type à la ligne 41 sur la comparaison des valeurs de cellule des colonnes "E" et "K" (100 et 16).
Pour essayer de résumer au mieux, si dans ma colonne E j'ai la valeur 100 et que si dans la colonne K j'ai la valeur 16 (si j'ai ces deux conditions remplies).
Alors je dois copier les cellules correspondante (ou l'on trouve les deux conditions remplies) des colonnes A, D, E, F, G, H et K et les coller sur la feuille "C". Sur la feuille "C", la colonne A2 à F2 correspond à "janvier". L'en-tête étant (A1:F1 = "janvier") car j'ai fusionné les cellules.
J'éspère que je suis assez clair. Mais c'est déjà très très sympa de consacrer du temps à mon problème et de m'aider.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour le fil, bonjour le forum,
Peut-être en remplaçant la ligne 41 par :
Sinon pour envoyer le fichier, regarde le site cijoint.com
Peut-être en remplaçant la ligne 41 par :
If TC(I, 5) = 100 And TC(I, 11) = 16 Then
Sinon pour envoyer le fichier, regarde le site cijoint.com
Bonjour ThauTheme,
Je n'ai pas pu envoyer le fichier, j'étais à l'étranger et sans accès à mes fichiers. Mais je n'ai plus besoin de l'envoyer, mon problème est résolu, merci beaucoup.
J'ai juste modifié un peu le code que tu m'as mis à disposition et maintenant tout marche à merveille !
J'ai rajouté à la variable DEST un ".End(xlUp)" comme ceci :
Et j'ai supprimé la variable DL qui faisait le contrôle sur la colonne "E:" étant donné que la recherche se fait directement dans TC(i, 5).
J'ai aussi compris la fonction IIf qui test les valeurs si vrai, on reste sur la cellule vide et si faux on descend d'une cellule.
Je n'ai pas pu envoyer le fichier, j'étais à l'étranger et sans accès à mes fichiers. Mais je n'ai plus besoin de l'envoyer, mon problème est résolu, merci beaucoup.
J'ai juste modifié un peu le code que tu m'as mis à disposition et maintenant tout marche à merveille !
J'ai rajouté à la variable DEST un ".End(xlUp)" comme ceci :
Set DEST = IIf(OC.Cells(1, COL).Value = "", OC.Cells(1, COL), OC.Cells(Application.Rows.Count, COL).End(xlUp).Offset(1, 0))
Et j'ai supprimé la variable DL qui faisait le contrôle sur la colonne "E:" étant donné que la recherche se fait directement dans TC(i, 5).
J'ai aussi compris la fonction IIf qui test les valeurs si vrai, on reste sur la cellule vide et si faux on descend d'une cellule.
Merci beaucoup, je vois ta réponse et je me dis qu'il me fallait une bonne pause...
Un problème de résolu, merci !