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)
Bonjour Vikoune,
Pour poster du code, vous pouvez utiliser les balises </> du ruban d'icônes. Exemple :
sub macro()
'mon code
end subPour 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_agence1Bonjour,
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 subOn 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 !