Se connecter avec
S'enregistrer | Connectez-vous

Copie de lignes sous trois conditions à partir de 2 feuilles

Dernière réponse : dans Programmation

Bonjour,
Voilà j'ai une petite macro à effectuer mais je butte sur un problème.
Etant débutant en VBA, je n'arrive pas à trouver précisément d'où provient mon erreur.
Le but de la macro est simple : en la lançant, si trois conditions sont vérifiée sur les deux feuilles différentes alors les lignes respectant ces conditions sont recopiées dans une troisième.

Pour être plus clair à présent, sur les deux premières feuilles, j'ai des lignes correspondant à des opérations avec pour détails un code, la date et le sens de l'opération.
Je souhaite recopier dans une troisième feuille les lignes présentant des similitudes. Je m'explique : si dans la feuille "X" une opération codée "L" a été effectuée le 6 juillet dans le sens "haut" et que dans la feuille "Y" une opération codée "L" (elle aussi) dans le sens "haut" mais entre le 1er et le 11 juillet (c'est à dire à plus ou moins 5 jours de la date d'opération de la feuille "X") alors les deux lignes doivent être copiées l'une en dessous de l'autre dans la troisième feuille et ainsi de suite.
J'ai essayé de codé, et ça donne ça :
  1. Sub CopyCommittedCells()
  2.  
  3. Dim c, n, a, b, i, j As Integer
  4.  
  5.  
  6. a = 2
  7. c = 2
  8. b = c + 1
  9. i = Worksheets("X").Cells(a, 8)
  10.  
  11. For a = 2 To n
  12. For j = i - 5 To i + 5 'Pour un intervalle compris entre +5 et -5 jours autours du personal trade
  13.  
  14. 'Si l'opération est exécutée sur un même instrument financier et est dans le même sens alors
  15. If Worksheets("Y").Cells(j, 7).Value = Worksheets("X").Cells(i, 7).Value And Worksheets("Y").Cells(j, 4).Value = Worksheets("X").Cells(i, 4).Value Then
  16.  
  17. 'Copie de l'opération depuis "Y" dans la feuille 3
  18. Worksheets("Y").Select
  19. Range("A" & a & ":G" & a).Select
  20. Selection.Copy
  21. Sheets("3").Select
  22. Range("A" & c).Select
  23. ActiveSheet.Paste
  24.  
  25. 'Copie de l'opération depuis "X" dans la feuille 3
  26. Worksheets("X").Select
  27. Range("A" & a & ":G" & a).Select
  28. Selection.Copy
  29. Sheets("3").Select
  30. Range("A" & b).Select
  31. ActiveSheet.Paste
  32.  
  33. c = c + 2
  34.  
  35. End If
  36. Next j
  37. Next a
  38.  
  39. Application.CutCopyMode = False
  40.  
  41. End Sub


Pardon si je n'ai pas été très clair. Merci d'avance en tout cas.
Lassé par la pub ? Créez un compte

Ensuite, je cite zeb :

zeb a dit :
Salut,
Par exemple, il est strictement interdit d'utiliser le presse-papier comme zone de mémoire temporaire. Que se passe-t-il si deux programmes différents lancés en même temps, l'utilisent ?



Donc, il faut éviter tes
  1. Selection.Copy
  2. [...]
  3. ActiveSheet.Paste


et utiliser la syntaxe suivante
  1. Worksheets("Y").Range("A" & a & ":G" & a).Copy _
  2. Destination:=Worksheets("X").Range("A" & a & ":G" & a)

Merci zeb,
j'ai retravailler ma macro et ton aide m'a permis de l'améliorer et de gagner en clareté.
Cependant j'ai encore deux petits problèmes.

Le premier qui sera surement le plus facile à résoudre proviens de la façon dont sont ordonnés les copier-coller. J'aimerai que chaque doublons identifié soit l'un en dessous de l'autre. Autrement dit la ligne venant de la feuille X au dessus de celle venant de Y et que cela s'enchaine, l'autre doublon en dessous etc.
Quand je lance ma macro cela ne fait que recopier n fois le premier "doublon", les autres ne sont même pas pris en compte.

Le second problème vient de l'aspect temporel dont j'ai parlé tout à l'heure.
J'aimerai que la date (i par exemple)de chaque opération de "X" soit une référence et que toutes les opérations listée dans "Y" effectué entre i-5 et i+5 soient controlée avec les conditions d'égalité.

Mon code donne ça après modification :
  1. Sub CopyCommittedCells()
  2.  
  3. Dim c, n, a, b As Integer
  4. Dim i, j As Double
  5. Dim o, p As Variant
  6.  
  7. a = 2
  8. n = 4
  9.  
  10. i = Worksheets("X").Cells(a, 8).Value
  11. o = Worksheets("X").Cells(a, 7).Value
  12. p = Worksheets("X").Cells(a, 4).Value
  13.  
  14. For c = 2 To (n + 1) Step 2
  15. b = c + 1
  16.  
  17. For a = 2 To n
  18.  
  19.  
  20. For j = Worksheets("Y").Cells((a), 8) To Worksheets("Y").Cells((a), 8)
  21.  
  22.  
  23. If Worksheets("Y").Cells(a, 7) = o And Worksheets("Y").Cells(a, 4) = p Then
  24.  
  25.  
  26. 'Copie de l'opération de "Y" dans la feuille 3
  27. Worksheets("Y").Range("A" & a & ":G" & a).Copy Worksheets("3").Cells(c, 1)
  28.  
  29.  
  30. 'Copie de l'opération de "X" dans la feuille 3
  31.  
  32. Worksheets("X").Range("A" & a & ":G" & a).Copy Worksheets("3").Cells(b, 1)
  33.  
  34. End If
  35.  
  36. Next j
  37.  
  38. Next a
  39.  
  40. Next c
  41.  
  42. Application.CutCopyMode = False
  43.  
  44. End Sub




Merci d'avance pour le coup de main

A vrais dire, je ne suis pas expert en VBA, seulement, ton programmes est difficile à lire par l'utilisation de variable i, j, a, b, etc. Bien nommer ses variables est important.

De ce que j'ai compris, tu parcours deux tableaux (X et Y) ligne à ligne, d'abord sur X et ensuite pour chaque ligne de X, parcourir les lignes de Y et trouver des similitudes ?

  1. Dim ligne_Y, ligne_X, nbrLignes_X, nbrLignes_Y As Integer
  2.  
  3. For ligne_X = 2 To (nbrLignes_X + 1)
  4. 'On parcours le tableau "X" ligne à ligne
  5.  
  6. For ligne_Y = 2 To (nbrLignes_Y +1)
  7. 'à chaque ligne du tableau "X", on parcours les lignes de "Y"
  8.  
  9. [...]
  10.  
  11. Next ligne_Y
  12. Next ligne_X

Oui, exactement.
En fait dans le tableau X il y a moins d'opération que dans le tableau Y car elle sont plus ponctuelle au cours du mois par exemple. En ensuite ce que je voudrai faire c'est :
Pour une opération (code "L" et sens "haut") du tableau "X" effectuée le 6 juillet, vérifier que dans le tableau "Y" il n'y a pas entre le 1er juillet et le 11 juillet (+ ou - 5 jours donc) une opération présentant le même code ET le même sens.
Et si tel est le cas dans la feuille 3, je veux que ces deux lignes soient recopier l'une sous l'autre sachant que pour une même opération du tableau "X" il peut apparaître plusieurs "doublon" dans le tableau "Y".

C'est peut être plus clair que mon explication précédente.

Ensuite j'ai un problème dans la copie faite en feuille trois, si j'augmente n alors la copie se fera n fois mais elle ne concernera que le premier doublon identifier, les autres passent à la trappe...

Donc par exemple si "i" est la date => date_X, "o", le code => code_X et p, le sens => sens_X. J'y tient, le code sera beaucoup plus clair ainsi.

les lignes (avec les nouvelles variables)
  1. i = Worksheets("X" ).Cells(a, 8).Value
  2. o = Worksheets("X" ).Cells(a, 7).Value
  3. p = Worksheets("X" ).Cells(a, 4).Value


doivent se trouver dans la première boucle for.


Il faudrais savoir aussi si une fois une correspondance trouvé dans Y, il y a des chances d'en trouver d'autre (sinon, prévoir de sortir de la boucle à la première occurrence trouvé)

Merci Zeb,
Le problème c'est que ça peut être très aléatoire, on peut pour la première ligne de "X" ne trouver aucune similitude avec la feuille "Y", comme un ou plusieurs. Ainsi, sortir de la boucle après la première occurrence n'est pas une bonne idée. Mais c'est vrai que ça fait ramer beaucoup plus l'ordinateur.

Ok, donc, je partirais sur le code suivant :

  1. Sub CopyCommittedCells()
  2.  
  3. 'Déclaration des variables
  4. Dim ligne_Y, ligne_X, nbrLignes_X, nbrLignes_Y, As Integer
  5. Dim date_X, j As Double
  6. Dim code_X, sens_X As Variant
  7.  
  8. nbrLignes_X = 4
  9. nbrLignes_Y = 4
  10. ligne_3 = 2
  11.  
  12. For ligne_X = 2 To nbrLignes_X + 1 'parcour de X
  13.  
  14. ' a chaque ligne de X, on récupere Date, sens et code
  15. date_X = Worksheets("X").Cells(ligne_X, 8).Value
  16. code_X = Worksheets("X").Cells(ligne_X, 7).Value
  17. sens_X = Worksheets("X").Cells(ligne_X, 4).Value
  18.  
  19. For ligne_Y = 2 To nbrLignes_Y ' parcour de Y
  20. With Worksheets("Y")
  21. If Abs(.Cells(ligne_Y, 8).Value - date_X) < 5 Then
  22. '5 jours d'écarts max
  23.  
  24. [...]
  25.  
  26. End If
  27. End With
  28. Next ligne_Y
  29. Next ligne_X
  30. Application.CutCopyMode = False
  31. End Sub




PS : Zeb, n'est pas mon nom, mais celui du maitre des lieux.
Lassé par la pub ? Créez un compte