Copie de certaines cellules selon 2 critères

Résolu/Fermé
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015 - Modifié par thealchemyst le 13/11/2014 à 12:38
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015 - 16 nov. 2014 à 17:24
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


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:

9 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
13 nov. 2014 à 14:25
Bonjour,

 Range("A" & i & ", D" & i & ", E" & i & ", F" & i & ", G" & i & ", K" & i).Copy
0
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015
13 nov. 2014 à 16:09
Bonjour f894009,

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 !
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
13 nov. 2014 à 16:17
Bonjour le fil, bonjour le forum,

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

0
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015
13 nov. 2014 à 17:05
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 !
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
13 nov. 2014 à 17:12
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...

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

0
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015
13 nov. 2014 à 17:43
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.
0
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015
13 nov. 2014 à 17:48
Encore une petite précision concernant la feuille de destination "C".

les colonnes H2 à M2 correspondent à "février" (il y a une colonne de séparation pour un meilleur visuel).

"mars" c'est O2 à T2, et ainsi de suite.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
14 nov. 2014 à 00:05
Bonsoir le fil, bonsoir le forum,

je pense qu'un petit fichier exemple s'impose...
0
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015
14 nov. 2014 à 00:22
Je l'envoi dès que possible. Dans 30min je pense.
0
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015
14 nov. 2014 à 02:28
Je n'arrive pas à envoyer le fichier... J'ai un request error...
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 160
14 nov. 2014 à 09:21
Bonjour le fil, bonjour le forum,

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
0
thealchemyst Messages postés 18 Date d'inscription jeudi 11 septembre 2014 Statut Membre Dernière intervention 30 mars 2015
16 nov. 2014 à 17:24
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 :


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.
0