Récupérer des données d'un autre fichier Excel
Bonjour,
Voici ma problématique:
J'aimerais faire copier coller de données d'un fichier Excel à un autre, en prenant en compte une colonne spécifique.
Exemple:
Données à transférer: Du Tableau B au Tableau A (issues de deux fichier Excel différents)
Colonne référence: A
Colonne à transférer: C & D
J'aimerais que:
Si les données de la "colonne A Tableau B" sont identiques à la "colonne A Tableau A" que les colonnes "C & D du Tableau A" se remplissent par les données "des colonnes C & D du Tableau B".
J'espère avoir été assez précis dans ma demande
Michel
Bonjour,
Sub B_A()
Dim d As Object, aa, i&
Set d = CreateObject("Scripting.Dictionary")
aa = Worksheets("Tableau B").Range("A1").CurrentRegion
For i = 2 To UBound(aa)
d(aa(i, 1)) = Array(aa(i, 3), aa(i, 4))
Next i
aa = Worksheets("Tableau A").Range("A1").CurrentRegion
For i = 2 To UBound(aa)
If d.exists(aa(i, 1)) Then aa(i, 3).Resize(, 2).Value = d(aa(i, 1))
Next i
Worksheets("Tableau A").Range("A1").CurrentRegion.Value = aa
End Sub
Adapter.
Merci je suis trop novice pour l'adapter.
Voici le fichier excel en joint avec les deux tableaux, si vous pouviez l'adapter se serait parfait.
Bonjour,
je suis trop novice pour l'adapter.
Tu pouvais le savoir avant, et dans ce cas, fournir un fichier sans attendre.
Surtout qu'à part une petite erreur rectifiée ci-dessous, pas d'adaptation pour ton modèle de fichier.
Sub B_A()
Dim d As Object, aa, i&, j%
Set d = CreateObject("Scripting.Dictionary")
aa = Worksheets("Tableau B").Range("A1").CurrentRegion
For i = 2 To UBound(aa)
d(aa(i, 1)) = Array(aa(i, 3), aa(i, 4))
Next i
aa = Worksheets("Tableau A").Range("A1").CurrentRegion
For i = 2 To UBound(aa)
If d.exists(aa(i, 1)) Then
For j = 0 To 1
aa(i, j + 3) = d(aa(i, 1))(j)
Next j
End If
Next i
Worksheets("Tableau A").Range("A1").CurrentRegion.Value = aa
End Sub
bonjour
https://www.youtube.com/watch?v=gwW2CDdvUUs
gratuit
et inclus dans les Excel plus récents
faut apprendre les nouveautés (de 10 ans bientôt quand même ! )
il a été conçu par Microsoft tout exprès pour récupérer des données (entre fichiers ou à partir d'autres sources)
très pratique
sans programmation
amitiés
Merci à vous.
Je n'arrive pas à adapter votre formule.
Même en faisant simplement un copier/coller, j'ai un message d'erreur disant que le nom de la feuille n'est pas le bon.
Voici en joint mon fichier excel à faire évoluer, si possible.
Dans l'idée il faudrait déplacer les données des colonnes F à K de la feuille Analyses à Analyse_V2, en fonction de la colonne B.
Merci
Bonsoir,
Adaptation :
(NB- Tu as remarqué, j'espère qu'on travaille sur tableaux : on affecte ton tableau-source sur feuille à une variable aa, on construit un dictionnaire en parcourant ce tableau dont les éléments ont pour clé la valeur repère, et l'item un tableau des valeurs à récupérer, on réutilise la même variable aa pour y affecter ensuite le tableau-cible [feuille], on en parcourt les valeurs repères et si on dispose d'un élément du dictionnaire constitué précédemment qui correspond, on en introduit les valeurs récupérées dans le tableau, puis on réaffecte le tableau aa à la feuille).
1) Les noms de feuilles changent : Tableau A devient Analyses_V2 et Tableau B, Analyses. Pas de difficulté, il me semble à opérer ce changement.
2) La colonnes de valeurs repères à tester n'est plus A mais B, dans les 2 tableaux. On va donc avoir aa(i, 2) comme clé d'élément dico d(aa(i, 2)). Cela ne présente pas non plus de difficulté.
3) On avait 2 valeurs à prélever, ce qu'on faisait par Array(valeur1, valeur2). On en a 6 maintenant, que l'on pourrait prélever de la même façon (Array listant les 6 valeurs) mais pour faire plus simple
qui nous renvoie un tableau des 6 valeurs dans notre élément dico.
Pour la récupération et insertion dans le tableau cible, le tableau précédent du dico était de base 0, on faisait donc varier j de 0 à 1. Le tableau constitué avec Index est lui de base 1, on fait donc varier alors j de 1 à 6 (et ajustement de l'index de colonne de la cellule réceptionnaire).
Sub B_A()
Dim d As Object, aa, i&, j%
Set d = CreateObject("Scripting.Dictionary")
aa = Worksheets("Analyses").Range("A1").CurrentRegion
For i = 2 To UBound(aa)
d(aa(i, 2)) = WorksheetFunction.Index(aa, i, Array(6, 7, 8, 9, 10, 11))
Next i
aa = Worksheets("Analyses_V2").Range("A1").CurrentRegion
For i = 2 To UBound(aa)
If d.exists(aa(i, 2)) Then
For j = 1 To 6
aa(i, j + 5) = d(aa(i, 2))(j)
Next j
End If
Next i
Worksheets("Analyses_V2").Range("A1").CurrentRegion.Value = aa
End Sub
Evidemment ce code doit se placer dans un module standard de ton classeur. Je te laisse choisir la façon de le lancer (boîte de dialogue, bouton, raccourci...) à ta convenance.
Je te laisse aussi le soin d'ajuster les largeurs de colonnes F à K pour que l'insertion des valeurs s'y fasse correctement.
Cordialement.
Mferrand, merci infiniment d'avoir apporter ces explications complémentaires et nécessaires.
Effectivement, dans votre fichier Excel joint tout fonctionne, cependant lorsque je copie/colle le code, j'ai ce message d'erreur:
Erreur d'exécution 13: Incompatibilité de type.
Merci
T'en as plus un autre encore à sortir de ton chapeau !
On demande de présenter un fichier ayant en tous points mêmes caractéristiques que l'original, c'est bien pour un certain nombre de bonnes raisons.
Au cas particulier le problème provient du fait que certaines cellules contiennent plus de 255 caractères !
Comme ce phénomène débute colonne N, tu dois pouvoir limiter ton interventionsur une partie du tableau qui ne posera pas problème.
Egalement quand on donne comme directive de place le code dans un module standard, ce n'est pas pour que tu le places dans un module de feuille où il n'a pas sa place !
Bonjour,
Merci MFerrand, votre code ne fonctionnait pas chez moi, mais je suis sûr que c 'est parce que je ne savais bien l'utiliser.
Un amie m'a fait un nouveau code qui fonctionne, avec un ajout d'un pop up du nombre à analyser le voici:
Sub A()
i = 2
While Worksheets("Analyses").Range("B" & i) <> ""
i = i + 1
Wend
i = i - 1
MsgBox ("Il y'a " & i & " AM a analyser")
f = 2
While Worksheets("Analyse_V2").Range("B" & f) <> ""
For g = 2 To i
If Worksheets("Analyse_V2").Range("B" & f) = Worksheets("Analyses").Range("B" & g) Then
Sheets("Analyses").Select
Range(Cells(g, 6), Cells(g, 11)).Select
Selection.Copy
Sheets("Analyse_V2").Select
Range(Cells(f, 6), Cells(f, 11)).Select
ActiveSheet.Paste
End If
Next
f = f + 1
Wend
End Sub
Encore merci pour votre aide.
Bonjour,
J'ai expliqué pourquoi il ne fonctionnait pas... dans un fichier dont les caractéristiques différaient du fichier sur lequel avait été construite la procédure.
Et j'ai fourni une piste pour le faire fonctionner dans le fichier récalcitrant.
Evidemment cela nécessite de connaître un peu Excel... mais je ne peux passer mon temps à réécrire de multiples fois une procédure parce que le fichier fourni n'est pas conforme à celui qu'on veut traiter.
Lorsque je fais une proposition, elle consiste toujours en un code rigoureusement et parfaitement indenté, qui ne comporte aucun Select ou Activate parasites (tels ceux produits par l'enregistreur), dont les expressions sont systématiquement qualifiées (références explicites à l'objet parent), qui opère par tableaux en évitant de travailler directement sur feuilles et évite le copier-coller (sauf impossibilités, qui sont rares, car le code sera plus rapide).
Cordialement.
Bonjour,
Encore merci pour votre aide et je suis certain qu'une personne un peu plus aguerrie que moi aurait compris et bien utilisé votre code.
Encore merci pour vos retours en tout cas, à très bientôt.
Michel