Microsoft 365 Copier des données avec conditions à l'aide d'une macro

Coralie01120

XLDnaute Occasionnel
Bonjour,

J'ai besoin de votre aide. Je bloque sur une macro qui paraît simple mais je ne sais pas du tout par où commencer...

Voici mon besoin : Je souhaite venir copier des données en y intégrant des conditions.

J'ai simplifié au maximum les données dans les deux fichiers ci-joint.

Le classeur BDD change tous les mois, il est composé de :
Colonne A = N° travaux
Colonne B = Outil utilisé

Le classeur CONSO est composé de :
Colonne A = N° travaux
Colonne B = Outil utilisé
Objectif de la macro :
Venir copier dans le tableau du classeur CONSO les N° de travaux du classeur BDD en enlevant les deux derniers chiffres et en ne faisant qu'1 ligne par travaux et en ne copiant pas les travaux sans outils associés en colonne B et s''il y a plusieurs outils utilisés faire une autre ligne en dessous.

Dans le classeur CONSO, les données affichées sont les résultats attendus.

Je vous remercie pour votre aide.
Bonne fin de journée.
 

Pièces jointes

  • BDD.xlsx
    8.9 KB · Affichages: 18
  • CONSO.xlsx
    8.2 KB · Affichages: 9

job75

XLDnaute Barbatruc
Bonjour Coralie01120, François, le forum,

Voici une solution VBA assez élaborée :
VB:
Sub MAJ()
Dim chemin$, fichier$, sep1$, sep2$, d As Object, tablo, i&, x$, xx$, s, j%, y$, n&, dest As Range
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = "BDD.xlsx" 'à adapter
sep1 = " " 'séparateur 1ère colonne
sep2 = "-" 'séparateur 2ème colonne
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
Application.ScreenUpdating = False
On Error Resume Next
Workbooks(fichier).Close False 'si le fichier est ouvert
Err = 0
With Workbooks.Open(chemin & fichier)
    If Err Then MsgBox "'" & fichier & "' introuvable !", 48: Exit Sub
    tablo = .Sheets(1).UsedRange.Resize(, 2) 'matrice, plus rapide
    .Close False
End With
On Error GoTo 0
For i = 1 To UBound(tablo)
    x = tablo(i, 1): xx = tablo(i, 2)
    If x <> "" And xx <> "" Then
        x = Split(x, sep1)(0)
        s = Split(xx, sep2)
        For j = 0 To UBound(s)
            xx = Trim(s(j))
            y = x & Chr(1) & xx
            If Not d.exists(y) Then
                d(y) = ""
                n = n + 1
                tablo(n, 1) = x: tablo(n, 2) = xx
            End If
        Next j
    End If
Next i
'---restitution---
With Feuil1 'CodeName
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    Set dest = .[B3] '1ère cellule du tableau, à adapter
    With .Cells(.Rows.Count, dest.Column).End(xlUp)(2) '1ère cellule vide
        If n Then
            .Resize(n, 2) = tablo
            .Resize(n, 3).Borders.Weight = xlThin 'bordures
        End If
    End With
    dest.CurrentRegion.RemoveDuplicates Array(1, 2), Header:=xlNo 'supprime les doublons
End With
End Sub
L'exécution est très rapide car on utilise un tableau VBA et le Dictionary.

Téléchargez les fichiers joints dans le même dossier (le bureau).

A+
 

Pièces jointes

  • CONSO(1).xlsm
    21.1 KB · Affichages: 13
  • BDD.xlsx
    9.1 KB · Affichages: 11

Coralie01120

XLDnaute Occasionnel
Bonjour
Ci joint ma solution par macro
sinon tu peux utiliser power query tuto: https://www.excel-downloads.com/media/categories/power-query.5/
A+ François
Bonjour Fanfan38,

Votre solution fonctionne mais comme l'a souligné Job75 l'outil est composé de plusieurs lettres et chiffres (ex : XMC02154788). Comment faire pour faire apparaître l'ensemble de l'outil et non pas que la première lettre ?
J'ai tenté la fonction Split comme énoncé mais je n'arrive pas à l'intégrer...
Cordialement,
 

Coralie01120

XLDnaute Occasionnel
Bonjour,

Votre macro compare les deux fichiers si je ne dis pas de bêtise.

Mon fichier BDD a des colonnes séparant les données Travaux et Outils ce qui n'est pas le cas pour le fichier CONSO. Du coup la macro ne fonctionne plus sur mon fichier.

Avec la macro de Fanfan38 je peux adapter les colonnes...

Je vous remercie
 

job75

XLDnaute Barbatruc
Mon fichier BDD a des colonnes séparant les données Travaux et Outils ce qui n'est pas le cas pour le fichier CONSO.
Pour que ce soit compréhensible j'ai ajouté une colonne intermédiaire dans le fichier BDD.

Voyez ce fichier (2) et les 2 corrections sur la macro :
VB:
With Workbooks.Open(chemin & fichier)
    If Err Then MsgBox "'" & fichier & "' introuvable !", 48: Exit Sub
    tablo = .Sheets(1).UsedRange.Resize(, 3) 'matrice, plus rapide, sur 3 colonnes
    .Close False
End With
On Error GoTo 0
For i = 1 To UBound(tablo)
    x = tablo(i, 1): xx = tablo(i, 3)
 

Pièces jointes

  • CONSO(2).xlsm
    21.2 KB · Affichages: 8
  • BDD.xlsx
    9.3 KB · Affichages: 1

job75

XLDnaute Barbatruc
Ah mais puisqu'à la fin RemoveDuplicates supprime les doublons pas besoin de Dictionary.

Voyez ce fichier (3) et cette macro, plus simple :
VB:
Sub MAJ()
Dim chemin$, fichier$, sep1$, sep2$, tablo, i&, x$, xx$, s, j%, n&, dest As Range
chemin = ThisWorkbook.Path & "\" 'à adapter
fichier = "BDD.xlsx" 'à adapter
sep1 = " " 'séparateur 1ère colonne
sep2 = "-" 'séparateur 2ème colonne
Application.ScreenUpdating = False
On Error Resume Next
Workbooks(fichier).Close False 'si le fichier est ouvert
Err = 0
With Workbooks.Open(chemin & fichier)
    If Err Then MsgBox "'" & fichier & "' introuvable !", 48: Exit Sub
    tablo = .Sheets(1).UsedRange.Resize(, 3) 'matrice, plus rapide, sur 3 colonnes
    .Close False
End With
On Error GoTo 0
For i = 1 To UBound(tablo)
    x = tablo(i, 1): xx = tablo(i, 3)
    If x <> "" And xx <> "" Then
        x = Split(x, sep1)(0)
        s = Split(xx, sep2)
        For j = 0 To UBound(s)
            xx = Trim(s(j))
            n = n + 1
            tablo(n, 1) = x: tablo(n, 2) = xx
        Next j
    End If
Next i
'---restitution---
With Feuil1 'CodeName
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    Set dest = .[B3] '1ère cellule du tableau, à adapter
    With .Cells(.Rows.Count, dest.Column).End(xlUp)(2) '1ère cellule vide
        If n Then
            .Resize(n, 2) = tablo
            .Resize(n, 3).Borders.Weight = xlThin 'bordures
        End If
        
    End With
    dest.CurrentRegion.RemoveDuplicates Array(1, 2), Header:=xlNo 'supprime les doublons
    .Range(.Cells(.Rows.Count, dest.Column).End(xlUp)(2), .Rows(.Rows.Count)).Delete 'car il y a des lignes vides en bas du Usedrange
    With .UsedRange: End With 'actualise la barre de défilement verticale
End With
End Sub
Edit : ajouté la suppression des lignes vides en bas du UsedRange.
 

Pièces jointes

  • CONSO(3).xlsm
    21.1 KB · Affichages: 2
  • BDD.xlsx
    9.3 KB · Affichages: 2
Dernière édition:

Discussions similaires

Réponses
9
Affichages
342

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
315 127
Messages
2 116 534
Membres
112 770
dernier inscrit
vetosalah