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.

10testfile-moddb.xlsx (19.16 Ko)

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 With

J'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

Rechercher des sujets similaires à "modification alimention base donnee"