Macro qui fait intervenir deux fichiers excel ...

Benjo

XLDnaute Junior
Salut à tous,
une fois de plus je fais appel à vous car je bloque sur un point important.

Je vous explique :

j'ai deux fichiers "fichier 1" et "fichier 2".
Dans le fichier 1, j'ai des numéros de dossier
dans le fichier deux, j'ai aussi des numéros de dossier, mais avec une colonne prix.
Je dois prendre les prix et les collers dans le fichier 1.

Certains d'entre vous vont surement me conseiller de faire un tri et de copier/coller... bah nan, ca fonctionne pas car dans le fichier 2, il y a beaucoup, beaucoup, beaucoup de dossier qui me sont inutiles dans le fichier 1 (donc qui n'apparaissent pas dans le fichier 1).

L'idée c'est de faire une macro qui regarde le numéro de dossier dans le fichier 1, et va rechercher dans le dossier 2 où il se situe, et va faire un copier de la colonne juste à droite de ce numéro (c'est là où se situe le prix)pour ensuite la coller sur la colonne juste à droite du numéro de dossier du fichier 1... et recommence avec le numéro de dossier qui suit (dans le fichier 1, ligne du dessous)

Et ca, j'avou, je suis vraiment incapable de le faire seul...

Pensez vous pouvoir m'aider ?

Merci beaucoup les amis :)
@++
 
G

Guest

Guest
Re : Macro qui fait intervenir deux fichiers excel ...

Bonjour Benjo,

Avec une macro comme celle-ci cela devrait le faire:

A mettre dans un module du fichier1

Code:
Sub ExtrairePrixFiChier2()
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim Plage1 As Range, Plage2 As Range, c1 As Range, c2 As Range
    Set sh1 = ThisWorkbook.Sheets("Feuil1")
    Set sh2 = Workbooks("[COLOR=blue]Classeur2[/COLOR]").Sheets("Feuil1")
    Set Plage1 = sh1.Range("[COLOR=blue]A[/COLOR]1:[COLOR=blue]A[/COLOR]" & sh1.Range("[COLOR=blue]A[/COLOR]" & Rows.Count).End(xlUp).Row)
    Set Plage2 = sh2.Range("[COLOR=blue]A[/COLOR]1:[COLOR=blue]A[/COLOR]" & sh2.Range("[COLOR=blue]A[/COLOR]" & Rows.Count).End(xlUp).Row)
    For Each c1 In Plage1
        With Plage2
            'Chercher le numéro de dossier dans fichier 2 colonne A
            Set c2 = .Find(c1.Value, LookIn:=xlValues)
            If Not c2 Is Nothing Then      'Si le numéro est trouvé
                c1.Offset(, 1) = c2.Offset(, 1) 'Copier dans la cellule à droite de c1 la valeur à doite de la celluletrouvée (C2)
            End If
        End With
    Next c1
End Sub

Où tu dois remplacer Classeur2 par le nom du fichier2 tel qu'il apparaît dans la barre de titre d'excel lorsque tu l'ouvre.

Ici les numéro de dossier sont dans la colonne A des deux fichiers, à charge pour toi d'adapter à ton cas

A bientôt
 
Dernière modification par un modérateur:
G

Guest

Guest
Re : Macro qui fait intervenir deux fichiers excel ...

Re bonjour Benjo,

Détaillons la macro:

Sub ExtrairePrixFiChier2()
'Déclaration des variables
Dim sh1 As Worksheet, sh2 As Worksheet 'sh1 et sh2 objets Feuille de classeur
'Objets cellules uniques ou plage de cellules
Dim Plage1 As Range, Plage2 As Range, c1 As Range, c2 As Range

'Initialisation des Variables
'sh1 et sh2: référence aux feuilles des 2 classeurs ouvert
Set sh1 = ThisWorkbook.Sheets("Feuil1") 'Le classeur qui contient la macro.SaFeuille("Feuil1")
Set sh2 = Workbooks("Classeur2").Sheets("Feuil1") 'Le classeur ("Classeur2").SaFeuille("Feuil1")


'Plage1=Cellules de la colonne A du classeur1.Feuille1 à partir de la première ligne jusqu'à la dernière ligne qui contient une valeur en remontant de la fin:
'sh1.Range("A" & Rows.Count) où Rows.Count=nombre de lignes total de la feuille, soit pour une version excel<2007: 65536 ce qui donne Range("A65536") (Cellule A65536)

'Le .End(xlUp) quant à lui équivaut à faire un CTRL+Flèche haut à partir de la cellule choisie: remonter jusqu'à la première cellule non vide.

'Le .Row retourne le numéro de la ligne de la cellule trouvée
'Pour l'exemple admettons que la dernière cellule de la colonne A, remplie soit celle de la ligne 100
'La ligne de code ci-dessous retournera une référence à la plage de cellule A1:A100
Set Plage1 = sh1.Range("A1:A" & sh1.Range("A" & Rows.Count).End(xlUp).Row)

'Idem mais pour le classeur 2
Set Plage2 = sh2.Range("A1:A" & sh2.Range("A" & Rows.Count).End(xlUp).Row)
'Boucle
'Pour chaque cellule (c1 est une référence à la cellule en cours de traitement) de la plage de cellules 'Plage1"
For Each c1 In Plage1
' Travailler Sur Plage2'
With Plage2 'Chercher la valeur équivalente à c1
Set c2 = .Find(c1.Value, LookIn:=xlValues)

'Si C2 est initialisé c'est que la recherche a été fructueuse
If Not c2 Is Nothing Then
'Alors on attribut à la cellule décalée de une colonne à droite de c1 '.Offset(,1)' la valeur de la cellule trouvée (c2) décalée de un colonne à droite également
c1.Offset(, 1) = c2.Offset(, 1)
End If 'Fin de condition
End With 'Fin de travail sur la Plage2
Next c1 'Passer à la cellule suivante de Plage1
End Sub 'Fin de procédure


La méthode Offset(NLignes,NColonnes) décale un référence de cellule ou de plage de cellule (Objet Range) de Nlignes et NColonnes pour décaler une cellule d'une colonne à droite on peut écrire également ex: c1.Offset(0,1). Les paramètres NLignes et NColonnes peuvent être négatifs(1 seul ou tous les 2). Ils sont tous les deux optionels mais au moins des deux doit apparaître.

J'espère que ces quelques explications succintes t'aiderons à mieux comprendre. Lorsque tu est dans l'editeur de macro (VBE) positionne le curseur sur un mot du langage VBA et fait F1. L'aide s'ouvrira directement sur le mot concerné.

A bientôt
 
Dernière modification par un modérateur:

Benjo

XLDnaute Junior
Re : Macro qui fait intervenir deux fichiers excel ...

Ton explication est vraiment tip top !
Vraiment merci beaucoup !
J'avais un deuxieme truc à faire qui y ressemblait et j'ai essayé de le faire seul en tenant compte de tes explication... mais ca fonctionne pas encore au top.

Je t'explique (si jamais tu as encore le temps de me filer un coup de main :D)

J'ai donc toujours mes deux fichiers excel.
Dans le premier j'ai une colonne avec des numéros de dossier.
dans le second j'ai aussi des numéro de dossier. Le souci, c'est que dans ce second fichier, il y a des numéro en ligne et en colonne. En bref, sur une ligne, j'ai dans la 1er cellule un numéro de dossier, deux cellule à coté j'ai un autre numéro de dossier, deux cellules à coté encore un numéro de dossier etc. J'ai donc des numéros pour les colonnes A, C, E, G, I ... jusqu'à Z.
(je précise que dans les autres colonnes -b,d,f,h...- j'ai les prix, et ca m'interesse pas)

Ce que je cherche à faire :

Regarder dans le fichier 1 le 1er numéro de dossier (ligne 1), rechercher ce numéro dans le fichier 2. S'il est trouvé (et il est censé etre trouvé), ca prend le numéro de dossier de la colonne A (donc la plus à gauche) de la ligne où se situe le numéro trouvé, et ca le copie dans le fichier 1 sur la colonne juste à droite du numéro recherché (donc sur la meme ligne).

un exemple pour etre plus précis :

Fichier1, Ligne 1, colonne A(c'est la colonne où se situe les numéros de dossier). Il y a le numéro 98784 (par exemple). Je vais dans le fichier 2, je recherche ce chiffre. Je le trouve à la colonne E, ligne 4552. Je vais donc ligne 4552, colonne A, je copie le numéro que j'ai dans cette cellule, et je le colonne dans le fichier 1, ligne 1, colonne B.
Etc pour la ligne 2 de fichier 1 jusqu'à beaucoup de ligne :D

Je sais, c'est assez complexe et je suis meme pas sur que ce soit possible sous excel en vba.

En tout cas, si c'est possible, tu m'enleves une épine du pied de la taille d'un sabre !

Merci beaucoup :)
@++
 
G

Guest

Guest
Re : Macro qui fait intervenir deux fichiers excel ...

Bonjour Benjo,

J'ai un peu tardé à voir ton message.

Benjo à dit:
Fichier1, Ligne 1, colonne A(c'est la colonne où se situe les numéros de dossier). Il y a le numéro 98784 (par exemple). Je vais dans le fichier 2, je recherche ce chiffre. Je le trouve à la colonne E, ligne 4552. Je vais donc ligne 4552, colonne A, je copie le numéro que j'ai dans cette cellule, et je le colonne dans le fichier 1, ligne 1, colonne B.

En prenant toujours ce qu'on a fait avant:

Code:
    Dim sh1 As Worksheet, sh2 As Worksheet
    Dim Plage1 As Range, Plage2 As Range, c1 As Range, c2 As Range
    Set sh1 = ThisWorkbook.Sheets("Feuil1")
    Set sh2 = Workbooks("Classeur2").Sheets("Feuil1")
    Set Plage1 = sh1.Range("A1:A" & sh1.Range("A" & Rows.Count).End(xlUp).Row)
    Set Plage2 = [COLOR=red]sh2.UsedRange 'Toutes les cellules utilisée de la feuille [/COLOR]2
 For Each c1 In Plage1
        With Plage2
            'Chercher le numéro de dossier dans fichier 2 colonne A
            Set c2 = .Find(c1.Value, LookIn:=xlValues)
            If Not c2 Is Nothing Then      'Si le numéro est trouvé
                c1.Offset(, 1) = .[COLOR=red]cells(c2.row,1)  [/COLOR]
            End If
        End With
    Next c1

.Cells(c2.row,1) = La cellule de la colonne A (Première colonne) de la ligne de la cellule trouvée (c2.Row)

Si j'ai bien compris ce que tu voulais, si c'est pas cela, joins un fichier avec macro et quelques données cohérentes avec le fichier final et anonymisées.

A bientôt
 

Benjo

XLDnaute Junior
Re : Macro qui fait intervenir deux fichiers excel ...

MAGNIFIQUE !!!
ca fonctionne niquel, et en plus je commence a comprendre la logique du truc.

J'ai un autre travail à faire sur mon fichier qui ressemble à peu près à la meme chose, à la différence que je recherche une suppression de ligne.

Je vais essayé, et si j'y arrive pas, je précise ma recherche, avec un peu de chance, tu n'en a pas encore marre de m'aider :D

Merci 1000 fois en tout cas ;)

@++
 

Benjo

XLDnaute Junior
Re : Macro qui fait intervenir deux fichiers excel ...

Salut les amis, c'est encore moi.
Apres reflexion, il s'avere que ce que je cherche à faire ne ressemble pas beaucoup à ce que j'ai demandé juste en haut.

En fait, j'ai toujours deux fichiers.
Fichier 1 : Deux colonnes m'interessent : Colonne F et colonne J; et on s'interesse aux ligne à partir de la ligne 2

Fichier 2: on s'interessent aux colonne A et B dès la 1ere ligne

L'idée c'est de supprimer des lignes.
Donc, comme les deux premiere requettes :D je cherche à "balayer" le fichier 1, colonne F.


En fait, je regarde le contenu de la cellule de la ligne 2, colonne F du fichier 1. Je recherche la ligne de la cellule ayant le meme contenu que cette dernière qui se trouve dans le fichier 2 colonne 2. Imaginons que je la trouve ligne 4552.
Ensuite, si le contenu de la cellule juste à droite (donc colonne B, ligne 4552, fichier 2) est le meme que le contenu de la cellule du fichier 1, ligne 2, colonne I.
Par contre, si le contenu de la cellule du fichier 1, ligne 2, Colonne I est différent, on supprime toute la ligne de ce fichier 1 (dans notre exemple on supprime donc la ligne 2 du fichier 1).

Ensuite on passe à la ligne 3 du fichier 1 etc.

Et là c'est vraiment costaux !
Vous pensez pouvoir me filer un coup de main ?
En tout cas, merci beaucoup, votre aide m'est vraiment précieuse !

@+++
 
Dernière édition:
G

Guest

Guest
Re : Macro qui fait intervenir deux fichiers excel ...

Bonjour Benjo,

Heureux, que tu ai pu adapter à ton besoin.

Désolé pour le retard, mais il m'arrive (si! si!) de faire autre chose dans mon humble vie.:D

Pour répondre à ta question. Maintenant que tu sais faire une boucle de recherche d'une valeur d'un fichier sur un autre. Si la colonne dont la valeur à comparer est en colonne I sur les deux fichier:

Comme dans les autres cas c1=Cellule dont la Valeur est cherchée dans le fichier 2 ; c2 la cellule correspondante trouvée dans fichier 2.

sh1=Feuille du fichier1 et sh2= Feuille du Fichier2


ton test peut prendre cette forme:

Code:
If sh1.range("I" & c1.row) <> sh2.range("I" & c2.row) then 
[INDENT]'Supprimer toute la ligne de c1
c1.EntireRow.Delete
[/INDENT]End If

A bientôt
C'est pas plus compliqué.
 

Discussions similaires

Réponses
8
Affichages
148

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16