Excel vba comparer 2 listes

gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 23/07/2008 à 15:09 Modifié par gaston le 23/07/2008 à  15:10:


Bonjour,
j\'ai 2 listes à comparer, voir ci dessous:



je voudrais à faire concorder les lignes ayant les mêmes dates ET nom
et que lorsqu\'il n\'y a pas de concordance trouvée, la ligne de la liste ou la concordance manque soit vide. C\'est à dire obtenir ceci:



Je le fais manuellement, mais est-ce possible par vba ?
carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 23/07/2008 à 15:30


même sans VBA c possible

il suffit de faire 3 colonnes suplemenetaire, avec un contenus conditionnel du genre si (truc=machin; machin;"")



gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 23/07/2008 à 15:58 Modifié par gaston le 23/07/2008 à  16:16:


J\'y ai pensé, mais ça marche pas ! prend par exemple la ligne 3: dans la liste bleue tout doit être décalé d\'une ligne vers le bas, pour que D3, E3, F3 soient vides
je crois que seule une macro peut résoudre ce genre de problème qui exprime
sélectionner une plage de même date1 dans la liste bleue
si date1=date2 et si nom1=nom2 alors date1 dans une 3ème liste sinon prendre les 3 cellules de cette ligne dans la liste bleue pour les décaler d\'une ligne vers le bas
et
sélectionner une plage de même date2 dans la liste jaune
si date1=date2 et si nom1=nom2 alors date2 dans une 4ème liste sinon prendre les 3 cellules de cette ligne dans la liste jaune et toutes cellules du dessous pour les décaler d\'une ligne vers le bas
puis faire un tri par date et nom et recommencer avec les cellules du dessous, jusqu\'à la fin

et encore je suis pas sûr que ça me donnera ce que je cherche...

carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 23/07/2008 à 16:07


dsl , j\'avais ps bien compris le truc [:D]

spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 23/07/2008 à 16:09


Bonjourça doit etre possible aussi avec des formule basic de comparaison( j\'ai fait pire [:D] ) mais ça va donner une méga feuille de calcul en arriere plan [;(]

gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 23/07/2008 à 16:33


[:D] j\'ai fait pire aussi
mais ce truc de décalage je vois pas comment faire sans macro...

carpe diem
gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 23/07/2008 à 17:51 Modifié par gaston le 30/07/2008 à  18:01:


Alors tout bien réfléchi, j\'arrive à analyser ce que la macro doit faire:

1) isoler toutes les lignes ayant la même date
2) effectuer un tri par nom pour cette plage
d\'abord dans la liste jaune
ensuite dans la liste bleue
3) mettre une formule du type: =SI(A2=D2;A2;\"faux\") dans la cellule H2 puis faire un copié collé dans les cellules I2, J2, K2, L2, M2 mais en ne modifiant que la valeur si vrai: qui doit être respectivement B2, C2, D2, etc (on obtient ainsi 2 autres listes avec des valeurs dans certaines lignes et des \"faux\" dans d\'autres).
4) ensuite si le contenu de H2 est: \"faux\", insérer une ligne au dessous
5) copier les cellules A2, B2, C2 en H2, I2, J2 et les cellules D2, E2, F2 en K3, L3, M3
6) effacer les formules dans les cellules juste au dessus (K2, L2, M2)
7) effectuer un tri par nom pour les lignes de mêmes dates n\'ayant pas été traitées
d\'abord dans la liste jaune
ensuite dans la liste bleue
8) recommencer de 3) à 7) à la ligne suivante jusqu\'à la dernière ligne de même date
9) recommencer de 1) à 8) pour une autre date

pfiouuu ! pas de la tarte !

y aurait-il un pro de vba dans la salle ?


carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 23/07/2008 à 22:20 Modifié par spiralbol le 23/07/2008 à  22:


envoie moi ton fichier (passe chez MONARDE pour le MP)

je te bricole un truc avec des \"drapeaux\" j\'aime ce genre de défie [:D]
gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 24/07/2008 à 09:38


Bonjour,
heu...c\'est où chez monarde ?

carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 24/07/2008 à 10:37


heuuuuuuuuuuuuu oui

ça plus simple comme ça spiralbol.free.fr/contact.htm
gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 24/07/2008 à 11:18


Bonjour,
fichier envoyé [;)]

carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 24/07/2008 à 11:21


fichier reçus [:D]

spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 24/07/2008 à 11:28


Bonjourtres chiant l\'inversion prenom nom [;(]

gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 24/07/2008 à 11:35


ouaip, très chiant comme tu dis: je bataille avec le mec de mon log pro en lui demandant pourquoi il a inversé les noms prénoms d\'une liste à l\'autre alors que c\'est pas pratique du tout, mais pour l\'instant il réagit pas

carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 24/07/2008 à 11:38


la liste est toujours de la même longueur??? il faut prevoir plus long je supose

gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 24/07/2008 à 11:47 Modifié par gaston le 24/07/2008 à  11:48:


Ca peut être plus long effectivement

pour les noms prénoms, on peut utiliser données- convertir puis une fonction concaténation...mais ça implique qu\'il ne doit y avoir d\'espace qu\'entre les noms et prénoms

carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 24/07/2008 à 11:50


je bricole pour 200 données, ce qui compte ce de trouver \"LE TRUC\" apres je verrais


j\'ai déja mal à la tête
[:D]

gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 24/07/2008 à 11:59 Modifié par gaston le 24/07/2008 à  12:06:


Bonjour,
y a plus simple que ce que je disais pour inverser les noms prénoms:
tu crées une colonne juste après B et tu y mets cette formule
=DROITE(B2;NBCAR(B2)-CHERCHE(\" \";B2))&\" \"&GAUCHE(B2;CHERCHE(\" \";B2))
après en faisant une 3ème colonne où tu copies colles C2 (valeurs uniquement), c\'est ok


pour le reste, si je pensai à une macro, c\'est que justement, on n\'a plus besoin de se fouler si la longueur est aléatoire: la macro va compter toutes les lignes non vides, et mettre le nombre de lignes dans une variable, avec, si on appelel cette variable \"Derligne\" un code du genre:
DerLigne = Range(\"A:A\").Find(\"*\", [A1], , , xlByRows, xlPrevious).Row
Range(\"A1:F\" & DerLigne).Select
carpe diem
geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 30/07/2008 à 17:42


Bonjour,

Avez-vous trouvé la solution car je travaille sur le problème en VBA et je n\'ai pas encore finit?
Singe laid
gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 30/07/2008 à 18:08 Modifié par gaston le 30/07/2008 à  18:13:


Bonjour,

j\'ai le code sur une liste simple avec une seule date, mais là où je coince c\'est le 1: isoler tous les éléments ayant la même date et les traiter avec la macro, sans toucher le reste de la liste ( après on passe à la date suivante avec une boucle jusqu\'à EndXldown)
On peut les sélectionner d\'abord dans la liste jaune, couper, coller sur une autre feuille, puis pareil avec liste bleue, exécuter la macro, couper tout et les coller en insertion sur la 1ère liste, refaire pareil pour la date suivante, mais ça me paraît un peu lourd...
ptêt en nommant les plages ? je cherche la meilleure solution, mais je suis pas un pro en vba, et y a sûrement des fonctions que j\'ignore...
et puis malheureusement, j\'ai plein d\'autres projets en cours... [;(] J\'ai un truc urgent à faire en php avec base MySql, c\'est pas pour le boulot, mais c\'est urgent quand même...

carpe diem
geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 30/07/2008 à 22:20


Bonjour,

La procédure suivante fait la job mais elle possède le défaut de ne pas conserver le classement de la deuxième série de colonnes.

Sub Macro1()
\'
\' Macro1 Macro
\' Macro enregistrée le 2008-07-24 par St-Gelais Jacques
\'

\'
Range(\"H1\").Formula = \"=COUNTA(C[-7]:C[-7])\"
Range(\"I1\").Formula = \"=COUNTA(C[-6]:C[-6])\"
Range(\"K1\").Formula = \"=COUNTA(C[-7]:C[-7])\"
Range(\"L1\").Formula = \"=COUNTA(C[-6]:C[-6])\"
Range(\"J1\").Formula = \"=MAX(RC[-1],RC[2])\"

valeurA = Range(\"H1\").Value \'NBVAL(A:A)
valeurD = Range(\"K1\").Value \'NBVAL(D:D)
valeur = valeurA + valeurD \'soit le maximum possiblement
A = \"A\"
C = \"C\"
D = \"D\"
F = \"F\"
AA = \"AA\"
AC = \"AC\"
AD = \"AD\"
AF = \"AF\"
If UCase(Left(Range(\"A1\").Value, 4)) = \"DATE\" Then
entête = 2
Range(AA & \"1:\" & AF & \"1\").Value = Range(A & \"1:\" & F & \"1\").Value
Else
entête = 1
End If
ligne = entête
ligneA = ligne
ligneD = ligne
PetiteLigne = ligne
compteur = ligne
\'Je fais une copie de sécurité avant tout
Columns(\"BA:BF\").Value = Columns(\"A:F\").Value

\'Je classe les 3 première et les 3 autres.
Columns(\"A:C\").Select
Selection.Sort Key1:=Range(\"A\" & entête), Order1:=xlAscending, Key2:=Range(\"C\" & entête) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
Columns(\"D:F\").Select
Selection.Sort Key1:=Range(\"D\" & entête), Order1:=xlAscending, Key2:=Range(\"F\" & entête) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
While compteur <= valeur
DateA = Range(A & ligne).Value
NomC = Range(C & ligne).Value
DateD = Range(D & ligne).Value
NomF = Range(F & ligne).Value

If DateD <> \"\" And DateA = \"\" Then
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If

If DateD = \"\" And DateA <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If
\'Si la date dans D est inférieur à A, je transfère tout simplement D à F et
\'j\'écrase D à F par la suite des données
While DateD < DateA And DateD <> \"\"
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
DateD = Range(D & ligne).Value
compteur = compteur + 1
Wend

\'Prochaine étape = les dates identiques
DateA = Range(A & ligne).Value
NomC = Range(C & ligne).Value
DateD = Range(D & ligne).Value
NomF = Range(F & ligne).Value
If DateD = DateA And NomF = NomC And NomF <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
End If
If DateD = DateA And NomF <> NomC And NomF <> \"\" Then
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If
\'Si la date dans D est supérieur à A, je transfère tout simplement A à C et
\'j\'écrase A à C par la suite des données
If DateD > DateA And DateA <> \"\" And DateD <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
DateD = Range(D & ligne).Value
End If
compteur = compteur + 1
Wend
Range(\"A1\").Select
End Sub

Singe laid
geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 30/07/2008 à 22:25


Bonjour,

Voici une procédure VBA qui fera ton affaire mais elle a le défaut de ne pas conserver le trie des 3 dernières colonnes.

Sub Macro1()
\'
\' Macro1 Macro
\' Macro enregistrée le 2008-07-24 par St-Gelais Jacques
\'

\'
Range(\"H1\").Formula = \"=COUNTA(C[-7]:C[-7])\"
Range(\"I1\").Formula = \"=COUNTA(C[-6]:C[-6])\"
Range(\"K1\").Formula = \"=COUNTA(C[-7]:C[-7])\"
Range(\"L1\").Formula = \"=COUNTA(C[-6]:C[-6])\"
Range(\"J1\").Formula = \"=MAX(RC[-1],RC[2])\"

valeurA = Range(\"H1\").Value \'NBVAL(A:A)
valeurD = Range(\"K1\").Value \'NBVAL(D:D)
valeur = valeurA + valeurD \'soit le maximum possiblement
A = \"A\"
C = \"C\"
D = \"D\"
F = \"F\"
AA = \"AA\"
AC = \"AC\"
AD = \"AD\"
AF = \"AF\"
If UCase(Left(Range(\"A1\").Value, 4)) = \"DATE\" Then
entête = 2
Range(AA & \"1:\" & AF & \"1\").Value = Range(A & \"1:\" & F & \"1\").Value
Else
entête = 1
End If
ligne = entête
ligneA = ligne
ligneD = ligne
PetiteLigne = ligne
compteur = ligne
\'Je fais une copie de sécurité avant tout
Columns(\"BA:BF\").Value = Columns(\"A:F\").Value

\'Je classe les 3 première et les 3 autres.
Columns(\"A:C\").Select
Selection.Sort Key1:=Range(\"A\" & entête), Order1:=xlAscending, Key2:=Range(\"C\" & entête) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
Columns(\"D:F\").Select
Selection.Sort Key1:=Range(\"D\" & entête), Order1:=xlAscending, Key2:=Range(\"F\" & entête) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
While compteur <= valeur
DateA = Range(A & ligne).Value
NomC = Range(C & ligne).Value
DateD = Range(D & ligne).Value
NomF = Range(F & ligne).Value

If DateD <> \"\" And DateA = \"\" Then
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If

If DateD = \"\" And DateA <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If
\'Si la date dans D est inférieur à A, je transfère tout simplement D à F et
\'j\'écrase D à F par la suite des données
While DateD < DateA And DateD <> \"\"
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
DateD = Range(D & ligne).Value
compteur = compteur + 1
Wend

\'Prochaine étape = les dates identiques
DateA = Range(A & ligne).Value
NomC = Range(C & ligne).Value
DateD = Range(D & ligne).Value
NomF = Range(F & ligne).Value
If DateD = DateA And NomF = NomC And NomF <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
End If
If DateD = DateA And NomF <> NomC And NomF <> \"\" Then
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If
\'Si la date dans D est supérieur à A, je transfère tout simplement A à C et
\'j\'écrase A à C par la suite des données
If DateD > DateA And DateA <> \"\" And DateD <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
DateD = Range(D & ligne).Value
End If
compteur = compteur + 1
Wend
Range(\"A1\").Select
End Sub
Singe laid
gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 31/07/2008 à 11:41


Bonjour,
je mets ce lien ici parce qu\'il y a des pistes intéressantes www.excelabo.net/excel/comparerplages.php
carpe diem
geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 01/08/2008 à 17:09


Bonjour,

Voici la procédure VBA qu\'il faudra placer tout simplement dans un module.

Sub Macro1()
\'
\' Macro1 Macro
\' Macro enregistrée le 2008-07-24 par St-Gelais Jacques
\'

\'
Range(\"H1\").Formula = \"=COUNTA(C[-7]:C[-7])\"
Range(\"I1\").Formula = \"=COUNTA(C[-6]:C[-6])\"
Range(\"K1\").Formula = \"=COUNTA(C[-7]:C[-7])\"
Range(\"L1\").Formula = \"=COUNTA(C[-6]:C[-6])\"
Range(\"J1\").Formula = \"=MAX(RC[-1],RC[2])\"

valeurA = Range(\"H1\").Value \'NBVAL(A:A)
valeurD = Range(\"K1\").Value \'NBVAL(D:D)
valeur = valeurA + valeurD \'soit le maximum possiblement
A = \"A\"
C = \"C\"
D = \"D\"
F = \"F\"
AA = \"AA\"
AC = \"AC\"
AD = \"AD\"
AF = \"AF\"
If UCase(Left(Range(\"A1\").Value, 4)) = \"DATE\" Then
entête = 2
Range(AA & \"1:\" & AF & \"1\").Value = Range(A & \"1:\" & F & \"1\").Value
Else
entête = 1
End If
ligne = entête
ligneA = ligne
ligneD = ligne
PetiteLigne = ligne
compteur = ligne
\'Je fais une copie de sécurité avant tout
Columns(\"BA:BF\").Value = Columns(\"A:F\").Value

\'Je classe les 3 première et les 3 autres.
Columns(\"A:C\").Select
Selection.Sort Key1:=Range(\"A\" & entête), Order1:=xlAscending, Key2:=Range(\"C\" & entête) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
Columns(\"D:F\").Select
Selection.Sort Key1:=Range(\"D\" & entête), Order1:=xlAscending, Key2:=Range(\"F\" & entête) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
While compteur <= valeur
DateA = Range(A & ligne).Value
NomC = Range(C & ligne).Value
DateD = Range(D & ligne).Value
NomF = Range(F & ligne).Value

If DateD <> \"\" And DateA = \"\" Then
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If

If DateD = \"\" And DateA <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If
\'Si la date dans D est inférieur à A, je transfère tout simplement D à F et
\'j\'écrase D à F par la suite des données
While DateD < DateA And DateD <> \"\"
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
DateD = Range(D & ligne).Value
compteur = compteur + 1
Wend

\'Prochaine étape = les dates identiques
DateA = Range(A & ligne).Value
NomC = Range(C & ligne).Value
DateD = Range(D & ligne).Value
NomF = Range(F & ligne).Value
If DateD = DateA And NomF = NomC And NomF <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
End If
If DateD = DateA And NomF <> NomC And NomF <> \"\" Then
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If
\'Si la date dans D est supérieur à A, je transfère tout simplement A à C et
\'j\'écrase A à C par la suite des données
If DateD > DateA And DateA <> \"\" And DateD <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
DateD = Range(D & ligne).Value
End If
compteur = compteur + 1
Wend
Range(\"A1\").Select
End Sub
Singe laid
gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 09/08/2008 à 16:12


Bonjour,
j\'ai voulu tester ta macro...hem...ça m\'a tout effacé !!!! [:o]
carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 09/08/2008 à 18:51


tit question en passant , combien peut t\'il y avaoir de valeur(de ligne) au maximum dans un colonne ?????

geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 10/08/2008 à 16:19


Bonjour,

Je refais ma réponse car le système a sauté.

La procédure copie les colonnes selon la demande dans les colonnes AA à AF tout en effaçant les colonnes A à F. J\'aurais dû ajouter une commande de déplacement à AA1.

Les colonnes originales A à F sont recopiés dans BA à BF
Singe laid
geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 10/08/2008 à 16:24


Bonjour,

Pour le nombre de valeur, la procédure compare les 3 colonnes avec les 3 autres colonnes pour 2 données avec entête ou sans entête ce qui donne 65536 lignes ou 65535 lignes de données.

En passant, comme j\'écris du Québec, il faut voir 6 heures entre l\'heure où j\'écris par rapport à l\'heure affichée au message.

Ma réponse de 16:19 a été écrite ici à 10:19. Ma journée commence alors que la votre est sur le bord de finir.
Singe laid
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 10/08/2008 à 21:01


bon alors j\'ai presque cerné le truc sans macro( sport cérébral [:D] )

le tout c\'est de savoir combien de ligne il peut y avoir au maximum

j\'ai travaillé pour 200 lignes mais ça donne un classeur monstreux [:o)]

pas grave ce qui compte c\'est le principe et le principe fonctionne

alors COMBIEN DE LIGNE ???????? [:D] [:D] [:D]
gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 10/08/2008 à 23:45


Bonjour,
ben...tu vas rire... [:Z] j\'en sais rien ! [:o] c\'est pas prévisible à l\'avance

carpe diem
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 11/08/2008 à 00:48


ta bien une estimation du max , y\'a que ça qui m\'interesse

pour l\'instant je peut traité 100 ligne c assez ou pas [:D]

ça donne un monstre de feuille de calcul, mais pas grave c pour la beautée du geste, faire ça sans MACRO [:D] [:D] [:D]

geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 11/08/2008 à 16:21


Bonjour,

Avec la macro, le maximum de ligne est sans importance.

Quel est ta solution exactement s.v.p.
Singe laid
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 11/08/2008 à 16:32 Modifié par spiralbol le 11/08/2008 à  16:


une solution MONSTREUSE, mais c\'est pas grave c pour le fun, j\'adore ce genre de manipulation [:D]

evidement les MACRO sont plus rapide et moins lourde, mais je voulais voir si on pouvais obtenir le même résultat avec des formules bien torteuse, et ben OUI. j\'ai obtenue la liste voulu, reste a en faire qu\'une avec tout parce que je ai deux

une avec les données de la liste de droite (double et orpheline)et une avec la liste des données de gauche orpheline.

il faut encore que j\'intègre les données orphelines de gauche dans la liste compléte de droite.

je réfléchi je réfléchi [:D]

je vais tanter de t\'expliquer ma façon de faire dans un prochain post [:D] [:D]

tu verra c\'est pas piqué des hannetons


spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 11/08/2008 à 16:58 Modifié par spiralbol le 11/08/2008 à  16:


Le procédé j\'ai essayé de faire une explication simple .

Chaque ligne contient 3 données : une date, un nom, un prix et ce dans deux tableau

1er) je concatène les 3 données de chaque tableau en les séparant d\'un caractère identifiable, ce qui me donne une seule donnée par ligne de tableau, je me retrouve donc avec deux séries de donnée, tableau de droite et tableau de gauche

2em) ensuite j\'extrais la valeur numérique des tout les caractères des donnés une à une et par tableau

3em) j\'additionne toute ces valeurs ce qui me donne une valeur numérique correspondant a la donnée de chaque ligne pour chaque tableau

4em) je compare toute les valeurs numérique du tableau de droite au tableau de gauche, les valeurs qui sont identique correspondent a des données d\'origine identique dans les deux tableaux, ceux qui ne trouve pas de correspondance sont des lignes orphelines

5em) il ne reste plus cas faire l\'inverse, c\'est-à-dire reconstitué les deux tableaux en recomposant chaque valeur: date, nom; prix pour chaque ligne en laissant vierge sur le tableau de gauche ou de droite les lignes qui non pas trouvé de correspondance.

[:o)] [:o)]

gaston gaston
1 621 contributions
Membre depuis le 01/03/2001
Envoyé le 11/08/2008 à 17:15


Bonjour,
commence avec 100 lignes, on verra après

carpe diem
geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 11/08/2008 à 18:51


Bonjour,


Voici la procédure modifiée afin de faire apparaître le résultat voulu dans la colonne A à F commme il devrait être et effacer le contenu de AA à AF.

J\'ai simplement ajouter 2 lignes à la fin.

Sub Macro1()
\'
\' Macro1 Macro
\' Macro enregistrée le 2008-07-24 par St-Gelais Jacques
\'

\'
Range(\"H1\").Formula = \"=COUNTA(C[-7]:C[-7])\"
Range(\"I1\").Formula = \"=COUNTA(C[-6]:C[-6])\"
Range(\"K1\").Formula = \"=COUNTA(C[-7]:C[-7])\"
Range(\"L1\").Formula = \"=COUNTA(C[-6]:C[-6])\"
Range(\"J1\").Formula = \"=MAX(RC[-1],RC[2])\"

valeurA = Range(\"H1\").Value \'NBVAL(A:A)
valeurD = Range(\"K1\").Value \'NBVAL(D:D)
valeur = valeurA + valeurD \'soit le maximum possiblement
A = \"A\"
C = \"C\"
D = \"D\"
F = \"F\"
AA = \"AA\"
AC = \"AC\"
AD = \"AD\"
AF = \"AF\"
If UCase(Left(Range(\"A1\").Value, 4)) = \"DATE\" Then
entête = 2
Range(AA & \"1:\" & AF & \"1\").Value = Range(A & \"1:\" & F & \"1\").Value
Else
entête = 1
End If
ligne = entête
ligneA = ligne
ligneD = ligne
PetiteLigne = ligne
compteur = ligne
\'Je fais une copie de sécurité avant tout
Columns(\"BA:BF\").Value = Columns(\"A:F\").Value

\'Je classe les 3 première et les 3 autres.
Columns(\"A:C\").Select
Selection.Sort Key1:=Range(\"A\" & entête), Order1:=xlAscending, Key2:=Range(\"C\" & entête) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
Columns(\"D:F\").Select
Selection.Sort Key1:=Range(\"D\" & entête), Order1:=xlAscending, Key2:=Range(\"F\" & entête) _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
:=xlSortNormal
While compteur <= valeur
DateA = Range(A & ligne).Value
NomC = Range(C & ligne).Value
DateD = Range(D & ligne).Value
NomF = Range(F & ligne).Value

If DateD <> \"\" And DateA = \"\" Then
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If

If DateD = \"\" And DateA <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If
\'Si la date dans D est inférieur à A, je transfère tout simplement D à F et
\'j\'écrase D à F par la suite des données
While DateD < DateA And DateD <> \"\"
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
DateD = Range(D & ligne).Value
compteur = compteur + 1
Wend

\'Prochaine étape = les dates identiques
DateA = Range(A & ligne).Value
NomC = Range(C & ligne).Value
DateD = Range(D & ligne).Value
NomF = Range(F & ligne).Value
If DateD = DateA And NomF = NomC And NomF <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
End If
If DateD = DateA And NomF <> NomC And NomF <> \"\" Then
Range(AD & PetiteLigne & \":\" & AF & PetiteLigne).Value = Range(D & ligne & \":\" & F & ligne).Value
Range(D & ligne & \":\" & F & valeur).Value = Range(D & ligne + 1 & \":\" & F & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
End If
\'Si la date dans D est supérieur à A, je transfère tout simplement A à C et
\'j\'écrase A à C par la suite des données
If DateD > DateA And DateA <> \"\" And DateD <> \"\" Then
Range(AA & PetiteLigne & \":\" & AC & PetiteLigne).Value = Range(A & ligne & \":\" & C & ligne).Value
Range(A & ligne & \":\" & C & valeur).Value = Range(A & ligne + 1 & \":\" & C & valeur + 1).Value
PetiteLigne = PetiteLigne + 1
DateD = Range(D & ligne).Value
End If
compteur = compteur + 1
Wend
Columns(\"A:F\").Value = Columns(\"AA:AF\").Value
Columns(\"AA:AF\").ClearContents
Range(\"A1\").Select
End Sub
Singe laid
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 11/08/2008 à 22:54 Modifié par spiralbol le 11/08/2008 à  22:


bon j\'ai terminé

ça donne un classeur de monstreux
41 MO en version 97
4 MO en version 2007 [:D] [:D] [:D]

mais ça marche , je suis content dans être venue a bout, a part quelques erreurs minime dans les dates du deuxieme tableau tout fonctionne.

maintenant que j\'ai mis au point le principe je pourrais trés bien l\'optimisé pour le rendre moins lourd et plus rapide, parce que je suis sur qu\'il y a un tas de cellule remplis de fonction qui ne servent a rien.


mais bon , ce que je voulais c\'est arriver a le faire sans MACRO, donc je suis content. J\'aime ce genre de chalange

j\'essais de t\'envoyé la purée GASTON, je te previent comme je l\'ai dit au début c\'est une ebauche non optimisé, comme tu verra il suffit de modifier les données des double tableau de droite, pour que le double tableau de gauche fasse le trie.

j\'espere que l\'email va passer 41 MO ça ne devrais pas coinçé [:D] [:D] [:D]
geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 12/08/2008 à 05:24


Bonjour,

Tu as combien de lignes de données avec ton fichier de 41 MO?

Peux-tu me l\'envoyer? Même chose pour le fichier de Gaston juste pour voir le temps d\'exécution.

Je ne vaux rien en fonction Excel; je suis plus fort en VBA.

Bye vous à deux.
Singe laid
spiralbol spiralbol
5 370 contributions
Membre depuis le 11/02/2003
Envoyé le 12/08/2008 à 10:34 Modifié par spiralbol le 12/08/2008 à  10:


(quote]Je ne vaux rien en fonction Excel; je suis plus fort en VBA[/quote]

ben moi c\'est le contraire [:D]

mon fichier heuuuuuuuuuuu y\'a 5 onglets chaque feuille de calcul contient environ 100 ligne ( pour 100 donnée ) et en nombre de colonne ça va de 6 a 100 e fonction de ce que j\'y fait

j\'ai pas put envoyé le fichier a GASTON ça boite mail( l\'adresse que j\'ia ne repond pas) [;(]

pour toi Geo tu peut avoir mon adresse ici

>http://spiralbol.free.fr/contact.htm<

envois moi un ti mot je te renverrais la purée par retour du courrier
je te prévient ce n\'est qu\'une ebauche absolument pas optimisé, donc TRES LOURDE et TRES LENTE, c\'était juste pour étudier le principe, une fois celui ci établie , je doit pouvoir faire mieux mais la c\'est une autre histoire, je suis en vaccance quand même [:D] [:D] [:D]

geogeojacke geogeojacke
12 contributions
Membre depuis le 30/07/2008
Envoyé le 12/08/2008 à 13:17


Bonjour,

Gaston et toi envoyez-moi vos fichiers à

geogeojacke@yahou.ca

C\'est une adresse que je ne me sert plus mais elle serait encore valide.

Bye
Singe laid

Discussion trop ancienne

Cette discussion a été automatiquement fermée car elle n'a plus reçue de nouveau message depuis trop longtemps.

Nous vous suggérons de créer un nouveau message

« Retour sur la liste des messages de ce forum