Relier deux feuilles et les copier dans une autre

Résolu
Signaler
Messages postés
58
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
26 août 2010
-
Messages postés
58
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
26 août 2010
-
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.

Merci bien.

4 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
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)
Messages postés
58
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
26 août 2010

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
Messages postés
58
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
26 août 2010

Rofl, bon je vois que j'ai du boulôt .

Je regarde cela et te tiens au jus. Dans tous les cas merci pour tes conseil (et la refonte du code base ).

B.
Messages postés
58
Date d'inscription
lundi 18 septembre 2006
Statut
Membre
Dernière intervention
26 août 2010

Ben oh surprise, c'est exactement ce que je voulais, à deux trois poils de c.. pret.

Encore merci.
B.