balthordu
Messages postés58Date d'inscriptionlundi 18 septembre 2006StatutMembreDernière intervention26 août 2010
-
17 août 2010 à 11:39
balthordu
Messages postés58Date d'inscriptionlundi 18 septembre 2006StatutMembreDernière intervention26 août 2010
-
18 août 2010 à 11:11
Bonjour à tous, j'ai un souci pour relier des valeurs dans deux feuilles.
Voici le topo
Feuille N Feuille N-1
Colonne A Colonne A
AAAA BBBB
BBBB DDDD
DDDD EEEE
Je voudrai en gros, par le biais d'une macro, avoir le résultat suivant sur lune feuille que je nomme BILAN
Feuille BILAN
Colonne A Colonne B
AAAA
BBBB BBBB
DDDD DDDD
EEEE
Donc en gros si vous avez compris, je veux relier les deux feuilles, et mettre sur la même ligne les colonnes identiques.
Voila le code que j'ai fait (en gros une double boucle, je récupere la valeur d'une cellule dans N, et je la compare avec toutes les cellule de N-1).
Sub relier()
Dim i, j As Double
Dim colA, colB As String
i = 1
j = 1
Sheets("BILAN").Select
While i <> 4
'récupération dans la feuille N
colA = ThisWorkbook.Sheets("N").Range("A" & i).Value
j = 1
While j <> 4
'récupération dans la feuille N-1
colB = Sheets("N-1").Range("A" & j).Value
'comparaison
If colA = colB Then
Sheets("BILAN").Range("A" & i).Value = colA
Sheets("BILAN").Range("B" & i).Value = colB
'Si pas de correspondance je range la cellule de la N dans la colonne A de la feuille bilan
Else
Sheets("BILAN").Range("A" & i).Value = colA
End If
j = j + 1
Wend
i = i + 1
Wend
End Sub
Et voici le résultat obtenu
Feuille BILAN
Colonne A Colonne B
AAAA
BBBB BBBB
DDDD DDDD
Et c'est totalement normal. Donc en gros je n'arrive pas a mettre la cellule EEEE. Car je vous explique, l'ordre chronologique doit être respecté. je ne peux pas me permettre d'avoir un résultat du genre.
Colonne A Colonne B
AAAA
EEEE
BBBB BBBB
DDDD DDDD
Ou un autre exemple. J'ai penser à rajouter en plus le code inverse, c'est a dire chercher dans N-1 et comparer a N. Mais je vais me retrouver avec des doublons et surtout l'ordre ne sera plus respecter. Voila si vous pouvez m'aider je sens qu'il ne me manque pas grand chose.
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 17 août 2010 à 12:53
Salut
Avant de rentrer dans le vif du sujet, il faut passer en revue ce code :
Dim i, j As Double ne signifie pas que i et j seront de type Double.
i sera de type Variant.
Il faut répéter le As autant de fois qu'il y a de variables
Dim i As Double, j As Double
PS : Un Double pour compter jusqu'à 4 est mal choisi. D'une part parce que son étendue est disproportionnée, mais surtout parce qu'il s'agit d'une variable à virgule, inutile dans ce cas.
Pour être large, un Long serait plus adapté
While-Wend Ce couple d'instruction est obsolète.
Il faut utilise Do-Loop qui aura l'avantage d'associer une autre instruction, Exit Do, qui te permettra de sortir de ta boucle.
Indentation Je te conseille de bien indenter ton code pour ne pas être obligé de lire 10 lignes avant de trouver la suite.
Nom des variables VB offre la possibilité de nommer des variables sur 256 caractères.
Pourquoi s'en priver ? cela donne de la clarté au code : i, j, colA, colB ne sont pas représentatifs de leur contenu.
Le code reformaté
Dim i As Long, j As Long
Dim colA As String, colB As String
i = 1
j = 1
Sheets("BILAN").Select
Do While i <> 4
'récupération dans la feuille N
colA = ThisWorkbook.Sheets("N").Range("A" & i).Value
j = 1
Do While j <> 4
'récupération dans la feuille N-1
colB = Sheets("N-1").Range("A" & j).Value
'comparaison
If colA = colB Then
Sheets("BILAN").Range("A" & i).Value = colA
Sheets("BILAN").Range("B" & i).Value = colB
Else
'Si pas de correspondance je range la cellule de la N dans la colonne A de la feuille bilan
Sheets("BILAN").Range("A" & i).Value = colA
End If
j = j + 1
Loop
i = i + 1
Loop
Il est chiant ce Jack avec ses conseils - ça ne résout pas mon problème
C'est clair.
Dans ton code, tu lis les cellules de la feuille N, puis tu vas les comparer aux cellules de la feuille N-1.
Ok, mais la feuille N-1 a des données qui ne figurent pas dans la feuille N, donc elles ne sont pas insérées. Logique.
En fait, tu fais une remise à zéro de ton 'compteur' j et c'est que ça coince.
D'une part, parce que tu refais une écriture à chaque boucle, même sur les données déjà écrites, et d'autre part parce que tu ne peux pas savoir si tu as épuisé les données de chaque feuille.
Bref, voilà du code tout cuit (pas mon habitude), mais le sujet m'intéressait
Dim lCompteurLigneN As Long
Dim lCompteurLigneN_1 As Long
Dim lCompteurLigneBilan As Long
Dim sCelluleN As String
Dim sCelluleN_1 As String
' Nettoyage feuille Bilan
Sheets("Bilan").Cells.ClearContents
' Init
lCompteurLigneN = 1
lCompteurLigneN_1 = 1
lCompteurLigneBilan = 1
' Tant que les données des 2 feuilles ne sont pas épuisées
Do While Not ((Sheets("N").Range("A" & CStr(lCompteurLigneN)).Value = "") And _
(Sheets("N-1").Range("A" & CStr(lCompteurLigneN_1)).Value = ""))
' Contenus des cellules de chaque feuille
sCelluleN = Sheets("N").Range("A" & CStr(lCompteurLigneN)).Value
sCelluleN_1 = Sheets("N-1").Range("A" & CStr(lCompteurLigneN_1)).Value
' Décision
If sCelluleN = "" Then
' On a épuisé les données de la feuille N
' C'est donc que la donnée provient de la feuille N-1
Sheets("Bilan").Range("A" & CStr(lCompteurLigneBilan)).Value = sCelluleN_1
' Incrémente ligne côté Bilan
lCompteurLigneBilan = lCompteurLigneBilan + 1
' Incrémente ligne côté feuille N-1, il en reste peut-être encore
lCompteurLigneN_1 = lCompteurLigneN_1 + 1
ElseIf sCelluleN_1 = "" Then
' On a épuisé les données de la feuille N-1
' C'est donc que la donnée provient de la feuille N
Sheets("Bilan").Range("A" & CStr(lCompteurLigneBilan)).Value = sCelluleN
' Incrémente ligne côté Bilan
lCompteurLigneBilan = lCompteurLigneBilan + 1
' Incrémente ligne côté feuille N, il en reste peut-être encore
lCompteurLigneN = lCompteurLigneN + 1
Else
' Les deux cellules renferment quelque chose
' Laquelle des donnée est ordonnée avant l'autre ?
If sCelluleN = sCelluleN_1 Then
' Les données sont les mêmes
' On insère donc les deux données sur la même ligne
Sheets("Bilan").Range("A" & CStr(lCompteurLigneBilan)).Value = sCelluleN
Sheets("Bilan").Range("B" & CStr(lCompteurLigneBilan)).Value = sCelluleN_1
' Incrémente ligne côté Bilan
lCompteurLigneBilan = lCompteurLigneBilan + 1
' Incrémente ligne des deux feuilles
lCompteurLigneN = lCompteurLigneN + 1
lCompteurLigneN_1 = lCompteurLigneN_1 + 1
ElseIf Asc(sCelluleN) < Asc(sCelluleN_1) Then
' La donnée de la feuille N est avant celle de la feuille N-1
' On en va donc insérer que la donnée de la feuille N
Sheets("Bilan").Range("A" & CStr(lCompteurLigneBilan)).Value = sCelluleN
' Incrémente ligne côté Bilan
lCompteurLigneBilan = lCompteurLigneBilan + 1
' Incrémente ligne côté feuille N uniquement
lCompteurLigneN = lCompteurLigneN + 1
Else
' La donnée de la feuille N-1 est avant celle de la feuille N
' On en va donc insérer que la donnée de la feuille N-1
Sheets("Bilan").Range("A" & CStr(lCompteurLigneBilan)).Value = sCelluleN_1
' Incrémente ligne côté Bilan
lCompteurLigneBilan = lCompteurLigneBilan + 1
' Incrémente ligne côté feuille N-1 uniquement
lCompteurLigneN_1 = lCompteurLigneN_1 + 1
End If
End If
Loop
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
balthordu
Messages postés58Date d'inscriptionlundi 18 septembre 2006StatutMembreDernière intervention26 août 2010 17 août 2010 à 11:45
Souci de présentation des résultats a cause de la mise en page. Dans le résultat que je voudrai obtenir dans la feuille bian. La cellule qui contient EEEE doit se trouver dans la colonne B, ligne 4