Modification et alimention d'une base de donnee
Bonjour a tous,
Je reste bloque sur un projet.
Veuillez m'excuser, par avance, si ce sujet a déjà été traité. J'ai cherché sur le forum mais les résultats que je trouve sont trop éloignés du résultat que je recherche, et donc difficillement adaptable.
Le cas qui m'amène ici :
J'ai un tableau extrait d'un outil. Je n'ai pas la possibilité de modifier en amont les données extraites (je ne suis pas l'auteur de l'extraction).
A partir de ce tableau il me faut faire plusieurs calculs afin de l'analyser.
Aujourd'hui, il y abeaucoup d'étapes, manuelles, de transformation afin d'arriver au résultat.
Cette extraction est mensuelle.
Je souhaiterais donc reconstruire cette base de données en y enlevant les éléments dont je n'ai pas besoin.
Ces données doivent ensuite être ajoutée a la suite d'une base de données qui conservera l'historique.
Les étapes dont j'ai besoin dans cette macro sont les suivantes :
1. Selectionner les données de certaines colonnes et lignes (avec des contraintes prédéfinies) ;
2. Verfier si la ligne est déjà existante dans le tableau à destination (si oui, la remplacer) ;
3. Copier les lignes et colonne voulues à la suite d'une base de donnees existante.
Je joint à ce post un fichier exemple : Les données de l'onglet DB doivent être ajoutées à l'onglet M_DB avec les contraintes precitées.
Un grand merci par avance pour quiconque passant du temps a m'aider
Bonjour,
une proposition de solution via une macro
Option Explicit
Sub aargh()
Dim wsdb As Worksheet
Dim wsmdb As Worksheet
Dim plagewsmdb As Range, re As Range
Dim dldb As Long, dlmdb As Long
Dim i As Long
Set wsdb = Sheets("DB")
Set wsmdb = Sheets("M_DB")
dldb = wsdb.Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne wsdb
dlmdb = wsmdb.Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne wsmdb
Set plagewsmdb = wsmdb.Cells(2, 1).Resize(dlmdb, 1) 'plage des n° d'articles sur wsmdb
'on marque d'un x les articles de MDB présents dans DB
For i = 2 To dldb
Set re = plagewsmdb.Find(wsdb.Cells(i, 1), lookat:=xlWhole)
If Not re Is Nothing Then
re.Value = "x"
End If
Next i
' on supprime de mdb les articles marqués d'un x
wsmdb.Cells(2, 1).Resize(dlmdb, 6).Sort key1:=wsmdb.Cells(2, 1), order1:=xlAscending, Header:=xlNo
plagewsmdb.SpecialCells(xlCellTypeConstants, 2).EntireRow.Delete
dlmdb = wsmdb.Cells(Rows.Count, 1).End(xlUp).Row
' on filtre les données à copier de DB
With wsdb
'mise en place du filtre
.Rows(1).Copy
.Rows(1).Insert shift:=xlDown
Application.CutCopyMode = False
.Rows("2:4").Insert shift:=xlDown
.Range("B2") = "Cat 1"
.Range("B3") = "Cat 2"
.Range("C2:C3") = "<>MEIA"
.Range("A5:F" & dldb + 4).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
.Range("A1:F3"), Unique:=False
'copie des lignes sélectionnées
.Range("A6:F" & dldb + 4).SpecialCells(xlVisible).Copy wsmdb.Cells(dlmdb + 1, 1)
'suppression du filtre
.Rows("1:4").Delete shift:=xlUp
.ShowAllData
End With
End Sub
Merci beaucoup h2so4.
Ca me parait correspondre parfaitement à mon besoin je tente de l'adapter a mon fichier.
Si c'est un succés je marquerai le poste comme résolu.
Bonjour,
J'ai rarement vu un base de données importée aussi bien faite
Je me serais pas pris la tête avec du compliqué dans ce cas l'export total à chaque fois et un Tableau croisé dynamique
sur cette base pour filtrer ce que je souhaites.
@H2so4,
Pourrais-tu juste me faire une brève explication de cette partie du code :
With wsdb
.Rows(1).Copy
.Rows(1).Insert shift:=xlDown
Application.CutCopyMode = False
.Rows("2:4").Insert shift:=xlDown
.Range("B2") = "Cat 1"
.Range("B3") = "Cat 2"
.Range("C2:C3") = "<>MEIA"
.Range("A5:F" & dldb + 4).AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
.Range("A1:F3"), Unique:=False
.Range("A6:F" & dldb + 4).SpecialCells(xlVisible).Copy wsmdb.Cells(dlmdb + 1, 1)
.Rows("1:4").Delete shift:=xlUp
.ShowAllData
End WithJ'ai du mal à comprendre l'impacte des
.Range("B2").Range("B3")etc... Dans le cas où, par exemple, je dois ajouter plus de critères : j'ajoute
.Range("B4") = "critère 3"?
Par avance, merci
Edit :
je précise un peu plus : Ce que j'ai plus de mal a comprendre est pourquoi aller chercher la ligne 2 puis la ligne 3. Et comment Excel comprend que le filtre s'aplique à toute la colonne ?
Bonjour,
J'ai rarement vu un base de données importée aussi bien faite
Je me serais pas pris la tête avec du compliqué dans ce cas l'export total à chaque fois et un Tableau croisé dynamique
sur cette base pour filtrer ce que je souhaites.
Bonjour Xmenpl,
Bien sûr, la vraie base de données est plus complexe que cela.
Je t'avoue que l'objectif est d'automatiser cette base de donnees qui sera la source de plusieurs analyses.
Ceci n'est qu'une phase dans un projet plus large. J'ai volontairement ciblé ce qui me pose problème.
Bonjour,
Pourrais-tu juste me faire une brève explication de cette partie du code :
et
je précise un peu plus : Ce que j'ai plus de mal a comprendre est pourquoi aller chercher la ligne 2 puis la ligne 3. Et comment Excel comprend que le filtre s'applique à toute la colonne ?
il s'agit de l'automatisation de l'option filtre avancé du menu données. Je t'invite à lire la documentation ou à voir les vidéos à ce sujet et revenir ici s'il reste des points à éclaircir.
Bonjour H2so4,
il s'agit de l'automatisation de l'option filtre avancé du menu données. Je t'invite à lire la documentation ou à voir les vidéo à ce sujet et revenir ici s'il reste des points à éclaircir.
Merci beaucoup je ne connaissais pas les filtres élaborés.
Ton code colle encore mieux avec mes besoin.
Je n'ai pas eu le temps de l'adapter mais cela convient je clôture le poste en résolu.
Et merci encore de ton aide