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

tableau a tableau b

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

8v2-test.xlsx (12.06 Ko)

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 on va prélever ce fragment de ligne en utilisant la fonction INDEX d'Excel : WorksheetFunction.Index(aa, i, Array(6, 7, 8, 9, 10, 11))

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

16test-3.xlsm (92.32 Ko)

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 ! Excel a bien accru les possibilités en la matière mais elles ne sont pas généralisées à tous les éléments.

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).

Je ne peux donc que regretter que tu reviennes à un code non indenté et dont la philosophie est rigoureusement inverse. Qu'il fonctionne ou non, je me refuse catégoriquement à intervenir sur des codes de la sorte. Tant mieux pour toi si cela fonctionne et si tu t'en contentes.

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

Rechercher des sujets similaires à "recuperer donnees fichier"