Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Copie sous conditions inter fichiers

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Chapi_chapo

XLDnaute Nouveau
Bonjour,

Je travail actuellement à la réalisation d'une macro exel, et ne m'y connaissant pas, et bien je suis venu demander de l'aide🙂
J'aimerais que celui-ci permette différentes choses :

  • Je dispose de deux fichier xlsx différents,
  • Ci-joint nommé fichier A et fichier B,
  • Ils sont ici (en gros)remplis aléatoirement,
  • Il s'agirais de regarder si la cellule B1 du fichier B, existe sur le fichier A (à la colonne B aussi),
  • Si elle existe une fois, on copie les colonnes F à H de cette même ligne du fichier A vers le B,
  • Si elle existe plusieurs fois, on vérifie qu'elle est la bonne ligne à l'aide de la colonne C, (on effectue pareil que pour la B, on cherche parmi les bon résultat de la première recherche qu'elle est la bonne ligne, et on copie la suite).
  • Si il n'y a aucune occurrence, on n'ajoute rien.

J'ai donc les 3 fichiers en pièces jointes, le "A" qui compote plus de colonnes,
Le "B" auquel il faut trouver les colonnes correspondantes (si elle existes, dans "A"),
Et donc le résultat pour l'exemple dans le "B après passage de la macro".

Pour tout vous dire, je ne m'y connais absolument pas en macro ou VB, mais ayant déjà codé quelque peu (très peu, mais je me dis que ça aurais suffit dans ce cas),
Je pense que cela n'est pas très difficile, si toutefois cela vous prend trop de temps, je me renseignerais sur les différentes fonctions pour m'en charger.😎

Et si bien sur, tout cela n'est pas claire, n'hésitez pas, je tacherais de ré expliquer / refaire des fichiers exemple plus propre. Je vois doit bien ça, vous risquez de me faire gagner pas mal de temps !😀

Merci bien !

Chapi_chapo

PS : Je travail sur Exel 2007.
 

Pièces jointes

Re : Copie sous conditions inter fichiers

Bonsoir Chapi_chapo et bienvenu, bonsoir le forum,

D'abord félicitations pour ton premier fil où les explications sont claires et les fichiers exemples présents. C'est tellement rare que je tenais à le souligner...

Une proposition avec le code ci-dessous :
Code:
Sub Macro1()
Dim a As Workbook 'déclare la variable a (claseurA)
Dim b As Workbook 'déclare la variable b (claseurB)
Dim oa As Object 'déclare la variable oa (Onglet A)
Dim ob As Object 'déclare la variable ob (Onglet B)
Dim dla As Integer 'déclare la variable dla (Dernière Ligne de l'onglet A)
Dim pla As Range 'déclare la variable pla (PLage A)
Dim dlb As Integer 'déclare la variable dlb (Dernière Ligne de l'onglet B)
Dim plb As Range 'déclare la variable plb (PLage B)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)

Set a = Workbooks("ClasseurA.xlsx") 'définit le classeur a
Set b = Workbooks("ClasseurB.xlsx") 'définit le classeur b
Set oa = a.Sheets("Feuil1") 'définit l'onglet de travail du claseur a
Set ob = b.Sheets("Feuil1") 'définit l'onglet de travail du claseur b
dla = oa.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée dla de la colonne B de longlet oa
Set pla = oa.Range("B1:B" & dla) 'définit la plage pla
dlb = ob.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée dlb de la colonne B de longlet ob
Set plb = ob.Range("B1:B" & dlb) 'définit la plage plb
For Each cel In plb 'boucle sur toutes les cellules de la plage plb
    'condition 1 : si le nombre d'occurrences de la cellule cel dans la plage pla est égal à 1
    If Application.WorksheetFunction.CountIf(pla, cel) = 1 Then
        'définit la recherche r (recherche la valeur de la cellule cel dans la plage pla)
        Set r = pla.Find(cel.Value, , xlValues, xlWhole)
        oa.Range(oa.Cells(r.Row, 6), oa.Cells(r.Row, 8)).Copy cel.Offset(0, 4) 'copie les cellules des colonnes F à H
    End If 'fin de la condition 1
    'condition : 2 si le nombre d'occurrences de la cellule cel dans la plage pla est supérieur à 1
    If Application.WorksheetFunction.CountIf(pla, cel) > 1 Then
        'définit la recherche r (recherche la valeur de la cellule cel dans la plage pla)
        Set r = pla.Find(cel.Value, , xlValues, xlWhole)
        pa = r.Address 'définit l'adresse de la première occurrence trouvée
        Do 'exécute
            'condition 3 : si la valeur en colonne C de cel correspond à la valeur en colonne C de r
            If cel.Offset(0, 1).Value = r.Offset(0, 1).Value Then
                oa.Range(oa.Cells(r.Row, 6), oa.Cells(r.Row, 8)).Copy cel.Offset(0, 4) 'copie les cellules des colonnes F à H
            End If 'fin de la condition 3
            Set r = pla.FindNext(r) 'redéfinit la recherche r (occurrence suivante0
        Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrences ailleurs qu'en pa
    End If 'fin de la condition 2
Next cel 'prochaine cellule de la boucle
End Sub

[Édition]
Si tu places la macro dans l'un des deux fichiers il faudra modifier le nom puisqu'il me semble qu'un fichier avec macro change d'extension (je suis sous Excel 2003 donc j'ai pas ce genre de problème)... Donc la ligne :
Code:
Set b = Workbooks("ClasseurB.xlsx") 'définit le classeur b
devrait devenir :
Code:
Set b = Workbooks("ClasseurB.xlsm") 'définit le classeur b
 
Dernière édition:
Re : Copie sous conditions inter fichiers

Bonsoir !

D'abord félicitations pour ton premier fil où les explications sont claires et les fichiers exemples présents. C'est tellement rare que je tenais à le souligner...

Merci bien ! Mais bon, cela me semble tout à fait normal, afin de vous simplifier la tâche, vous qui nous aidez gracieusement !
Je tiens tout d'abord a te dire un grand merci pour la propreté de ton code, avec la multitude de commentaire, qui je crois, mon permit de comprendre grosso modo le code.
Toutefois, j'ai essayer de le lancer, mais si je met la macro dans le fichier "A", la ligne :
Code:
Set b = Workbooks("ClasseurB.xlsx") 'définit le classeur b
Plante, et inversement.
suis-je censé ouvrir les fichier d'une façon particulière ? Entrer la macro ailleurs ?

L'erreur indiqué par le débogueur est :
Erreur d'exécution '9':

L'indice n'appartient pas à la sélection
Je me suis dis qu'en y ajoutant le chemin d'accès du fichier, cela lui permettrais, je sais pas, de le trouver... mais non.

Alors je suis toute ouïe !

En te remerciant !

chapi_chapo

EDIT : J'ai bien pris en compte ton Edit 😉
 
Dernière édition:
Re : Copie sous conditions inter fichiers

Bonsoir Chapi_chapo, bonsoir le forum,

Copie le code que je t'ai donné dans le ClasseurB et enregistre-le. Normalement, tu vas être obligé de changer l'extension. Il va passer de ClasseurB.xlsx à ClasseurB.xlsm. Maintenant modifie aussi le code en conséquence, (voir [Édition] du post précédent), enregistre à nouveau le ClasseurB et lance le code. Ça devrait fonctionner. Je n'ai pas précisé mais il faut impérativement que les deux classeurs soient ouverts !
 
Re : Copie sous conditions inter fichiers

Bonsoir Robert,

Magnifique !

J'y ai réalisé les 2/3 modification que je voulais, avec particulièrement l'ouverture automatique du deuxième fichier, l'enregistrement sous un nouveau nom après, etc...

J'aurais juste une question, parce que la vérification est longue à effectuer (mais je la ferais bien sur !), tu réalise bien la recherche sur la colonne B, et si tu as plusieurs possibilité tu effectue, parmi ces possibilité la recherche par la colonne C. Et tu copie le contenu des colonne F à H (6 à 8) du fichier A à la ligne trouvé, au fichier B de la ligne d'ou provenait la recherche je l'ai un peu vérifié, mais bon, si l’algorithme le dit, il y a pas de raison, mais je souhaitais juste vérifier que l'on se soit bien compris.

Merci beaucoup,

Si tu me confirme ça, je sens que je vais pouvoir passer le sujet en résolu, ce serai fait dans un temps record !

Un forum super actif ! Et au passage supra compétant !

Merci bien !

et bonne nuit !
 
Re : Copie sous conditions inter fichiers

Bonjour Chap_chapo, bonjour le forum,

Voilà exactement ce que fait la macro (mais je me demande à quoi ça sert que je commente les codes ?) :

• Boucle sur toutes les cellules cel de la colonne B du classeurB
• Compte dans la colonne B du classeurA le nombre de fois que la valeur de cel existe
• si une seule occurrence trouvée, copie les valeurs des colonnes F à H de la ligne de l'occurrence trouvé et les colle dans la ligne de cel en F, G et H
• si plusieurs occurrences existent :
Vérifie, pour chaque occurrence trouvée, le contenu de la colonne adjacente C. Si il est identique au contenu de la colonne C de cel alors la copie se fait...
• puis au passe à la cellule suivante de la colonne B du classeurB.

Comme dans ton exemple tu n'avais pas daigné mettre un doublon je n'ai pas pu tester. Je te laisse le soin de le faire...
 
Re : Copie sous conditions inter fichiers

Bonsoir Robert,

mais je me demande à quoi ça sert que je commente les codes ?
Cela ma servit, malheureusement, cela ne me suffisait pas à comprendre le fonctionnement de ces lignes :
Code:
If Application.WorksheetFunction.CountIf(pla, cel) = 1 Then
        'définit la recherche r (recherche la valeur de la cellule cel dans la plage pla)
        Set r = pla.Find(cel.Value, , xlValues, xlWhole)
        oa.Range(oa.Cells(r.Row, 6), oa.Cells(r.Row, 8)).Copy cel.Offset(0, 4) 'copie les cellules des colonnes F à H
    End If 'fin de la condition 1
    'condition : 2 si le nombre d'occurrences de la cellule cel dans la plage pla est supérieur à 1
    If Application.WorksheetFunction.CountIf(pla, cel) > 1 Then
        'définit la recherche r (recherche la valeur de la cellule cel dans la plage pla)
        Set r = pla.Find(cel.Value, , xlValues, xlWhole)
        pa = r.Address 'définit l'adresse de la première occurrence trouvée
        Do 'exécute
            'condition 3 : si la valeur en colonne C de cel correspond à la valeur en colonne C de r
            If cel.Offset(0, 1).Value = r.Offset(0, 1).Value Then
                oa.Range(oa.Cells(r.Row, 6), oa.Cells(r.Row, 8)).Copy cel.Offset(0, 4) 'copie les cellules des colonnes F à H
            End If 'fin de la condition 3
            Set r = pla.FindNext(r) 'redéfinit la recherche r (occurrence suivante0
        Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrences ailleurs qu'en pa
    End If 'fin de la condition 2

Mais avec ton explication, cela me semble plus claire, et cela répond exactement à ce que je voulais !😎

Comme dans ton exemple tu n'avais pas daigné mettre un doublon je n'ai pas pu tester. Je te laisse le soin de le faire...
Effectivement, j'ai oublié de le mettre, mais j'ai déjà quelque peu testé hier soir, et cela me semblait exact. Toutefois je compte réaliser d'autres tests ce soir afin de terminer tout ceci !

Un grand merci pour le temps que tu m'a consacré😉, coder ceci m'aurais pris des siècles 🙁.

Bonne journée

Chapi_chapo.

PS : Je passerai en résolu après les tests de ce soir, qui j'en suis sur, seront concluant ! 😎
 
Re : Copie sous conditions inter fichiers

Bonjour Chapi_chapo, bonjour le forum,

Ne te prend pas la tête avec le [RÉSOLU] car après moults débats dans la forum il est acquis qu'un sujet peut paraître résolu pour l'un mais pas pour l'aute. C'est pour cela d'ailleurs qu'il n'y a pas de bouton spécifique pour ça... L'essentiel étant que ça marche pour toi !
 
Re : Copie sous conditions inter fichiers

Bonjour Robert,

Soit !😎

Mais j'ai des questions en plus !😱

Voici mon code avec mes rajouts (oui c’est bien des rajouts bien pas propre😎), mais je pense que tu devrais comprendre leur principe :

Code:
Sub test()
'
' autrefichier Macro
'
Dim NomFichierOuvert As String
NomFichierOuvert = ThisWorkbook.Name

Dim NomOngletFichierOuvert As string
NomOngletFichierOuvert = "Feuil1"

Dim FichierPMI As string
FichierPMI = "test.xls"

Dim NomOngletFichierPMI As string
NomOngletFichierPMI = "Feuil1"

Dim CheminDossier As string
CheminDossier = Application.ActiveWorkbook.Path

Dim CheminFichierPMI As string
CheminFichierPMI = CheminDossier & "\" & FichierPMI

Workbooks.Open CheminFichierPMI
    
Dim a As Workbook 'déclare la variable a (claseurA)
Dim b As Workbook 'déclare la variable b (claseurB)
Dim oa As Object 'déclare la variable oa (Onglet A)
Dim ob As Object 'déclare la variable ob (Onglet B)
Dim dla As Integer 'déclare la variable dla (Dernière Ligne de l'onglet A)
Dim pla As Range 'déclare la variable pla (PLage A)
Dim dlb As Integer 'déclare la variable dlb (Dernière Ligne de l'onglet B)
Dim plb As Range 'déclare la variable plb (PLage B)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)

Set a = Workbooks(NomFichierOuvert) 'définit le classeur a
Set b = Workbooks(FichierPMI) 'définit le classeur b
Set oa = a.Sheets(NomOngletFichierOuvert) 'définit l'onglet de travail du claseur a
Set ob = b.Sheets(NomOngletFichierPMI) 'définit l'onglet de travail du claseur b
dla = oa.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée dla de la colonne B de longlet oa
Set pla = oa.Range("B4:B" & dla) 'définit la plage pla
dlb = ob.Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée dlb de la colonne B de longlet ob
Set plb = ob.Range("B2:B" & dlb) 'définit la plage plb
For Each cel In plb 'boucle sur toutes les cellules de la plage plb
    'condition 1 : si le nombre d'occurrences de la cellule cel dans la plage pla est égal à 1
    If Application.WorksheetFunction.CountIf(pla, cel) = 1 Then
        'définit la recherche r (recherche la valeur de la cellule cel dans la plage pla)
        Set r = pla.Find(cel.Value, , xlValues, xlWhole)
        oa.Range(oa.Cells(r.Row, 6), oa.Cells(r.Row, 26)).Copy cel.Offset(0, 4) 'copie les cellules des colonnes F à Z
    End If 'fin de la condition 1
    'condition : 2 si le nombre d'occurrences de la cellule cel dans la plage pla est supérieur à 1
    If Application.WorksheetFunction.CountIf(pla, cel) > 1 Then
        'définit la recherche r (recherche la valeur de la cellule cel dans la plage pla)
        Set r = pla.Find(cel.Value, , xlValues, xlWhole)
        pa = r.Address 'définit l'adresse de la première occurrence trouvée
        Do 'exécute
            'condition 3 : si la valeur en colonne C de cel correspond à la valeur en colonne C de r
            If cel.Offset(0, 1).Value = r.Offset(0, 1).Value Then
                oa.Range(oa.Cells(r.Row, 6), oa.Cells(r.Row, 26)).Copy cel.Offset(0, 4) 'copie les cellules des colonnes F à H
            End If 'fin de la condition 3
            Set r = pla.FindNext(r) 'redéfinit la recherche r (occurrence suivante0
        Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrences ailleurs qu'en pa
    End If 'fin de la condition 2
Next cel 'prochaine cellule de la boucle

Dim SelectionAvantCopie As String
    Windows(FichierPMI).Activate
SelectionAvantCopie = "A2:Z" & dlb
    Range(SelectionAvantCopie).Select 'Sélectionne de la Cellule A2 à Z de la dernière ligne dont la collonne B est remplie
    Selection.Copy
    Windows(NomFichierOuvert).Activate
    Range("A4").Select 'Séleection de la Cellule A4 du fichier planning
    ActiveSheet.Paste 'Copie de la sélection venant du fichier PMI

Dim dlc As Integer
dlc = dlb + 2
SelectionAvantCopie = "A4:X" & dlc
Range(SelectionAvantCopie).Select

Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    With Selection.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideVertical)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    With Selection.Borders(xlInsideHorizontal)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With 'mise en place quadrillage
  With Selection.Font
        .Name = "Calibri"
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
        .TintAndShade = 0
        .ThemeFont = xlThemeFontMinor
    End With 'Mise en calibri 10

    Dim NomFichier As String
    Dim NomCompletFichier As String
    Dim CheminCompletFichier As String
    
    
    NomFichier = "Test"
    Dim stHeureExport As String
    stHeureExport = "_" & Year(Date) & Format(Month(Date), "00") & Format(Day(Date), "00") & "-" & Format(Hour(Time), "00") & "h" & Format(Minute(Time), "00")
    NomCompletFichier = CheminDossier & "\" & NomFichier & stHeureExport & ".xlsm"
    CheminCompletFichier = CheminDossier & "\" & NomCompletFichier
    'Copie de la feuille courante dans un nouveau classeur et enregistrement
    ActiveSheet.Copy
    ActiveWorkbook.SaveAs NomCompletFichier, FileFormat:=52
   
    
  
Windows(NomFichierOuvert).Activate
ActiveWorkbook.Close SaveChanges:=False

Windows(FichierPMI).Activate
ActiveWorkbook.Close SaveChanges:=False

Windows(NomCompletFichier).Activate
MsgBox "Voici le fichier généré sous le nom : " & vbCrLf & NomCompletFichier

End Sub

Comme tu peux le voir ici :
Code:
ActiveWorkbook.SaveAs NomCompletFichier, FileFormat:=52
J'enregistre mon travail sur un nouveau fichier, avec un titre différent à chaque fois, mais bien au format .xlsm.
Et mon but serait de pouvoir relancer ma macro à partir de ce fichier, d'ou la récupération de son titre puisqu'il évoluerai :
Code:
Dim NomFichierOuvert As String
NomFichierOuvert = ThisWorkbook.Name

Alors existe t'il un moyen de réinjecté la macro utilisé à l'intérieur du nouveau fichier, ou alors d'enregistrer particulièrement la macro pour y avoir accès à partir de n'importe qu'elle fichier .xlsm.
Afin que je puisse relancer ma macro (la même) à partir du nouveau fichier ?

[EDIT]J'ai Totalement la méthode d'exécution de la macro, ce problème ne se pose plus, toute fois, il est résoluble en enregistrant la macro sur PERSOL.XLSB, ce qui pose quand même 2/3 problèmes.[/EDIT]


Accessoirement (ce n'est pas très grave), saurais-tu pourquoi ceci marche :
Code:
Windows(NomFichierOuvert).Activate
ActiveWorkbook.Close SaveChanges:=False
Le fichier se ferme bien

Alors que ceci ne marche pas :
Code:
Windows(FichierPMI).Activate
ActiveWorkbook.Close SaveChanges:=False
J'ai une piste potentielle sur le fait que ce fichier est ouvert en mode compatibilité, en est-ce la raison ?

Et pareil, au passage, la MsgBox :
Code:
MsgBox "Voici le fichier généré sous le nom : " & vbCrLf & NomCompletFichier
Ne s'affiche pas, une idée ?

[EDIT2]Ce problème est également résolu, je fermais le fichier lanceur de la macro, et exécutait après des instructions....
J'ai donc changé l'ordre ! Et ça marche ![/EDIT]


Merci beaucoup !

Chapi_chapo
 
Dernière édition:
Re : Copie sous conditions inter fichiers

Bonjour Robert et les autres,

Alors alors, faisons un point (.) 😎:

Toutes les fonctionnalités actuelles fonctionnent à merveille,
J'ai cependant une dernière question :

Lorsque que tu copie la fin de la ligne du fichier A au B :
Code:
Set r = pla.Find(cel.Value, , xlValues, xlWhole)
        oa.Range(oa.Cells(r.Row, 6), oa.Cells(r.Row, 26)).Copy cel.Offset(0, 4)
Existe-t-il un moyen de prendre en compte la mise en forme, c'est-à-dire si la case copié est coloré, de bien conserver cette couleur et de la copier sur l'autre fichier.

En ce qui concerne le quadrillage ou la taille de cellule, je m'en fou, seul la couleur de fond m'intéresse !

Merci !

Chapi_chapo
 
Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
10
Affichages
121
Réponses
6
Affichages
82
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…