Copie de lignes sous trois conditions à partir de 2 feuilles

Artoner

Nouveau membre
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 :
[cpp]Sub CopyCommittedCells()

Dim c, n, a, b, i, j As Integer


a = 2
c = 2
b = c + 1
i = Worksheets("X").Cells(a, 8)

For a = 2 To n
For j = i - 5 To i + 5 'Pour un intervalle compris entre +5 et -5 jours autours du personal trade

'Si l'opération est exécutée sur un même instrument financier et est dans le même sens alors
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

'Copie de l'opération depuis "Y" dans la feuille 3
Worksheets("Y").Select
Range("A" & a & ":G" & a).Select
Selection.Copy
Sheets("3").Select
Range("A" & c).Select
ActiveSheet.Paste

'Copie de l'opération depuis "X" dans la feuille 3
Worksheets("X").Select
Range("A" & a & ":G" & a).Select
Selection.Copy
Sheets("3").Select
Range("A" & b).Select
ActiveSheet.Paste

c = c + 2

End If
Next j
Next a

Application.CutCopyMode = False

End Sub
[/cpp]

Pardon si je n'ai pas été très clair. Merci d'avance en tout cas.
 

tantal_fr

Grand Maître
Bonjour,

Déjà avant d'aller plus loin, ta variable "n" n'est pas initialisé, donc ta première boucle for est sauté.
 

tantal_fr

Grand Maître
Ensuite, je cite zeb :



Donc, il faut éviter tes
[cpp]
Selection.Copy
[...]
ActiveSheet.Paste

[/cpp]

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

[/cpp]
 

Artoner

Nouveau membre
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 :
[cpp]Sub CopyCommittedCells()

Dim c, n, a, b As Integer
Dim i, j As Double
Dim o, p As Variant

a = 2
n = 4

i = Worksheets("X").Cells(a, 8).Value
o = Worksheets("X").Cells(a, 7).Value
p = Worksheets("X").Cells(a, 4).Value

For c = 2 To (n + 1) Step 2
b = c + 1

For a = 2 To n


For j = Worksheets("Y").Cells((a), 8) To Worksheets("Y").Cells((a), 8)


If Worksheets("Y").Cells(a, 7) = o And Worksheets("Y").Cells(a, 4) = p Then


'Copie de l'opération de "Y" dans la feuille 3
Worksheets("Y").Range("A" & a & ":G" & a).Copy Worksheets("3").Cells(c, 1)


'Copie de l'opération de "X" dans la feuille 3

Worksheets("X").Range("A" & a & ":G" & a).Copy Worksheets("3").Cells(b, 1)

End If

Next j

Next a

Next c

Application.CutCopyMode = False

End Sub

[/cpp]



Merci d'avance pour le coup de main
 

tantal_fr

Grand Maître
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 ?

[cpp]

Dim ligne_Y, ligne_X, nbrLignes_X, nbrLignes_Y As Integer

For ligne_X = 2 To (nbrLignes_X + 1)
'On parcours le tableau "X" ligne à ligne

For ligne_Y = 2 To (nbrLignes_Y +1)
'à chaque ligne du tableau "X", on parcours les lignes de "Y"

[...]

Next ligne_Y
Next ligne_X

[/cpp]
 

Artoner

Nouveau membre
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...
 

tantal_fr

Grand Maître
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)
[cpp]
i = Worksheets("X" ).Cells(a, 8).Value
o = Worksheets("X" ).Cells(a, 7).Value
p = Worksheets("X" ).Cells(a, 4).Value
[/cpp]

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é)
 

Artoner

Nouveau membre
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.
 

tantal_fr

Grand Maître
Ok, donc, je partirais sur le code suivant :

[cpp]
Sub CopyCommittedCells()

'Déclaration des variables
Dim ligne_Y, ligne_X, nbrLignes_X, nbrLignes_Y, As Integer
Dim date_X, j As Double
Dim code_X, sens_X As Variant

nbrLignes_X = 4
nbrLignes_Y = 4
ligne_3 = 2

For ligne_X = 2 To nbrLignes_X + 1 'parcour de X

' a chaque ligne de X, on récupere Date, sens et code
date_X = Worksheets("X").Cells(ligne_X, 8).Value
code_X = Worksheets("X").Cells(ligne_X, 7).Value
sens_X = Worksheets("X").Cells(ligne_X, 4).Value

For ligne_Y = 2 To nbrLignes_Y ' parcour de Y
With Worksheets("Y")
If Abs(.Cells(ligne_Y, 8).Value - date_X) < 5 Then
'5 jours d'écarts max

[...]

End If
End With
Next ligne_Y
Next ligne_X
Application.CutCopyMode = False
End Sub

[/cpp]



PS : Zeb, n'est pas mon nom, mais celui du maitre des lieux.
 

Artoner

Nouveau membre
Au temps pour moi tantal, je suis un peu à l'ouest en ce moment.
Merci d'avoir checké, je vais de ce pas regarder en détail le code
 

Artoner

Nouveau membre
Merci beaucoup à toi tantal. Ca y est c'est fini ça tourne au poil merci pour tes conseils. Si tu veux que je t'envoie la version final du code fais moi signe ;)
 

tantal_fr

Grand Maître
Ravis d'avoir pu aider. :hello:
Tu peut toujours publier ton code ici, sur le forum pour que cela puisse profiter à d'autre qui passerais par là, avec le même problème que toi. ;)

 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 015
Membres
1 586 388
Dernier membre
mery2005
Partager cette page
Haut