Concaténer des lignes sur un classeur différents selon une condition

Bonjour à tous, je suis relativement nouveau en VBA bien que j'ai quelques base en programmation mais je ne parviens pas à résoudre mon problème.

J'ai deux classeurs quasi similaires situés à un répertoire d'écart (Le fichier destination est dans le répertoire précédent au fichier source). Les deux classeurs ont les mêmes colonnes mais le classeur source reçoit chaque semaine des données supplémentaires.

Je souhaiterai si possible faire en sorte que mon classeur destination ne récupère que les lignes manquantes (apparues dans le classeur source pendant la semaine) selon un identifiant unique situé en colonne A.

Je précise d'avance que je ne peux pas simplement ajouter les dernières lignes du classeur source car il arrive parfois que des données s'ajoutent ailleurs qu'à la fin de celui-ci.

Pourriez-vous m'aider ?

Je vous remercie par avance.

Bonjour,

Je pense que vous ne donnez pas assez d'éléments pour une aide appropriée...

Est-ce vous ne pourriez pas tout simplement, pour mettre à jour la destination, remplacer les données existantes ? Alors vous auriez toutes les lignes de la source sans vous soucier de savoir quelles en sont les nouvelles...

Cdlt,

Bonjour, je doit en effet être trop vague, c'est la première fois que je pose une question sur un forum.

Pour faire simple je récupère toutes les semaines un classeur (source) avec des données; j'aoute à ce classeur des informations supplémentaires en fonction de ces données (des noms par exemple) et je voudrais ajouter ces informations à un classeur général (destination) qui conserve donc les informations présentes dès le début et celles ajoutées pour chaque semaines.

Je possède des identifiants unique pour chaque ligne d'informations mais je ne vois pas comment mettre mon code en forme, je ne sais pas comment mettre en place ma condition "si absent du classeur alors ajouter la ligne d'informations".

Je ne peux pas simplement remplacer les données car le classeur destination contient les données des semaines précédentes

Cordialement.

Voici ma tentative de code

(Petite Update avec la V2 qui semble fonctionner mais si qqn peut jeter un oeil pour une correction)

8test-code-vba-v2.txt (969.00 Octets)

Bonjour Vikoune,

Pour poster du code, vous pouvez utiliser les balises </> du ruban d'icônes. Exemple :

sub macro()
'mon code
end sub

Pour votre problème, il faut que vous précisiez tous les noms d'objets impliqués dans le code :

- classeurs source et destination (chemins complets),

- feuilles source et destination (noms des feuilles),

- plages sources et destinations (références),

- numéros de colonnes du critère (donc avec les identifiants) sur la plage source et sur la plage de destination.

Avec ces informations essentielles, il sera possible d'avoir un début de code.

Cdlt,

Bonjour 3GB et merci pour ton aide.

Je ne peux pas vraiment donner toutes les informations que tu me demandes car elles sont confidentielles et je réalise que cela rend ton intervention bien compliquée... Je vais essayer de faire au mieux avec des exemple

Chemin doc source : "C:\Users\Documents\VBA\repertoire"

Chemin doc destination : "C:\Users\Documents\VBA"

Colonne contenant l'identifiant unique : A

Code qui semble fonctionner:

test_derniere_case_1 = xWb_source.Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
 test_derniere_case_2 = xWb_verba.Sheets(1).Range("A" & Rows.Count).End(xlUp).Row
 test_derniere_colonne = xWb_verba.Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column

'Déplacement dans les lignse du doc source
For Each Cell_agence1 In xWb_source.Sheets(1).Range("A2:A" & test_derniere_case_1)
'Verification de l'utilité d'agit sur la ligne car si vide non intéressante
    If xWb_source.Sheets(1).Range("B" & Cell_agence1.Row) <> "" Then
'Déplacement dans les lignes du doc destination
        For Each Cell_agence2 In xWb_verba.Sheets(1).Range("A2:A" & test_derniere_case_2)
'Si on retrouve le même identifiant on passe au suivant pour éviter les doublons
            If xWb_source.Sheets(1).Range("A" & Cell_agence1.Row) = xWb_verba.Sheets(1).Range("A" & Cell_agence2.Row) Then
            GoTo next_cell
            End If
'Si on ne trouve pas d'équivalent et que nous sommes à la fin alors on rajoute les éléments de la ligne manquantes
            If xWb_source.Sheets(1).Range("A" & Cell_agence1.Row) <> xWb_verba.Sheets(1).Range("A" & Cell_agence2.Row) And Cell_agence2.Row = test_derniere_case_2 Then
                For compteur = 1 To test_derniere_colonne
                    xWb_verba.Sheets(1).Cells(Cell_agence2.Row + 1, compteur) = xWb_source.Sheets(1).Cells(Cell_agence1.Row, compteur)
                Next compteur
'Comme nous venons d'ajouter une ligne je fais +1 à mon compteur de ligne du doc destination
                test_derniere_case_2 = test_derniere_case_2 + 1
            End If
        Next Cell_agence2
    End If
next_cell:
Next Cell_agence1

Bonjour,

Voici un premier essai d'adaptation du code :

Sub test()

'affecations préalables

with xWb_verba.Sheets(1) 'avec feuille destination
    dld = .Range("A" & .Rows.Count).End(xlUp).Row 'dernière ligne destination
    dcd = .Cells(1, .Columns.Count).End(xlToLeft).Column 'derniere col destination
    set rdest = .cells(2, 1).resize(dld - 1, dcd) 'plage destination (A2 retaillé à nb lignes - 1 et nb colonnes)
    with xWb_source.Sheets(1) 'avec feuille source
        dls = .Range("A" & .Rows.Count).End(xlUp).Row 'derniere ligne source
        t = .cells(2, 1).resize(dls - 1, dcd).value 'tableau dynamique prend valeur plage source
    end with
    For i = lbound(t) to ubound(t) 'pour chaque ligne du tableau
        If application.countif(rdest.columns(1), t(i, 1)) = 0 then 'si identifiant absent de colonne 1 de plage destination
            n = n + 1 'incrementation n
            for k = lbound(t, 2) to ubound(t, 2) 'pour chaque colonne
                t(n, k) = t(i, k) 'on alimente l'item n avec la ligne en cours (on retient ainsi les valeurs inexsitantes)
            next k
        end if
    next i
    if n > 0 then .cells(dld + 1, 1).resize(n, dcd).value = t 'si n > 0, on colle les valeurs après dern ligne vide
end with

end sub

On utilise ici des tableaux dynamiques pour accélérer la procédure. Je me suis fié à l'énoncé de départ donc on teste l'existence de tous les identifiants de la source (présents en colonne 1) dans la colonne 1 de la destination. Dès lors qu'un identifiant n'est pas trouvé, il est "retenu" dans le tableau (on prend toutes les valeurs de la ligne en cours). Ensuite, on colle le tout dans la destination.

Cdlt,

Super merci beaucoup ! Je ne pourrai essayer ça que demain mais ça à l'air de correspondre à ce que je cherche !

Rechercher des sujets similaires à "concatener lignes classeur differents condition"