1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    janvier 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Arts - Culture

    Informations forums :
    Inscription : janvier 2018
    Messages : 1
    Points : 1
    Points
    1

    Par défaut Ventiler une base en feuilles et onglets - VBA

    Bonjour à tous,

    Débutant en VBA, je me lance dans mon 1er gros projet. J’ai beau éplucher les forums je ne trouve pas la solution

    Mon problème : Je dispose d’une base de données (TEST). Je souhaiterais :

    - Étape 1 : Ventiler la base TEST sur plusieurs classeurs sur la base du champ CRITERE 1 (colonne N). Ces feuilles doivent être les mêmes que la base de données sur la forme et le fond (maintien des formules entre autre). Idéalement le classeur prendrait le nom du critère.

    - Étape 2 : Sur l nouveau classeur crée, en plus du 1er onglet qui reprendrait toutes les données du CRITERE 1, il faudrait ventiler ce 1er onglet sur plusieurs autres onglets sur la base du CRITERE 2 (colonne O). Idem maintien du tableau tel qu’il est et attribution d’un nom à l’onglet sur la base du critère 2.

    Cela fait 2 jours que je fais des tests dans tous les sens mais rien à faire, aucune de mes macros ne fonctionnent.

    Merci par avance pour votre aide.

    Lilma
    Test Fichiers sources - v12.xlsm

  2. #2
    Rédacteur

    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    janvier 2010
    Messages
    7 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : janvier 2010
    Messages : 7 738
    Points : 18 091
    Points
    18 091
    Billets dans le blog
    6

    Par défaut

    Bonjour,
    L'utilisation de la méthode AdvancedFilter (filtre avancé d'excel) de l'objet Range aurait pu résoudre le problème facilement sauf que tu souhaites conserver les formules mais il y a une solution à tout.
    Qu'as-tu déjà fait écrit comme code ?
    As-tu fait une analyse des différentes étapes à réaliser sur base de tes connaissances en Excel car finalement ce que tu peux faire manuellement, tu peux le réaliser par VBA et l'enregistreur de macros est là pour t'aider ?
    Il faudrait d'abord lire Les filtres avancés ou élaborés dans Excel
    Donc en vue de mettre sur une piste.
    Pour pouvoir splitter en autant de feuilles qu'il n'y a d'éléments uniques dans une colonne (Critère 1), il suffit d'utiliser l'option Sans doublon du filtre avancé d'excel et ensuite utiliser cette liste comme critère pour lancer l'exportation des données.
    Il faut veiller que chaque exportation se fasse dans une feuille temporaire qu'ensuite tu copies vers un nouveau classeur pour la première exportation et ensuite pour les autres exportations, il faudra copier les données vers ce même classeur.
    La méthode AdvancedFilter ne conserve que le résultats des formules s'il y en a donc il faudra parcourir chaque cellule de la première ligne des colonnes de la feuille de départ et copier les formules de chaque colonne dans les colonnes des feuilles cibles (voir comment copier les formules dans une colonne entière dans ce billet Comment écrire une formule dans une plage de cellules en VBA ?
    Pour savoir si une cellule contient une formule, c'est la propriété HasFormula de l'objet Range ainsi Range("C2").HasFormula renverra True ou False suivant le cas.
    Une fois les exportations terminées répéter les opérations pour le critère 2

    Reviens demander de l'aide quand tu auras commencé tes premières lignes de programmation.

    D'autre lecture sur le même sujet Excel VBA – Exporter des lignes suivant critères avec la méthode AdvancedFilter
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Quelques contributions : USERFORM - Créer, Consulter, Modifier et Supprimer des enregistrements à l'aide d'un formulaire - Géolocalisation d'une adresse avec Excel et Google sans VBA

  3. #3
    Membre émérite
    Homme Profil pro
    Responsable des études
    Inscrit en
    juillet 2014
    Messages
    1 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2014
    Messages : 1 267
    Points : 2 435
    Points
    2 435

    Par défaut

    Bonjour,

    Ci dessus une macro a adaptée que j'utilise pour séparer un fichier en différentes feuilles suivant les valeurs de la première colonne, il te faudrait donc adapter le code pour ta colonne N, et ajouter le déplacement de la feuille dans un nouveau classeur a la fin du traitement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Sub OngletsNom()
    'cette macro sépare les données ,de la feuille dont le nom est dans la variable data, en une feuille par valeur différentes
    'cette macro n'a pas besoin que les données soient triées car elle utilise les filtres avancés.
     
    Application.ScreenUpdating = False
    Dim FEUILLE_DEST As Worksheet
    Dim var As Object
    Dim Plage As Range
    Dim Cell As Range
    Dim i As Long
    Data = "RSS_data"
     
    ' création de l'objet SortedList
    Set var = CreateObject("System.Collections.SortedList")
     
     
    With ThisWorkbook.Worksheets(Data).Cells(1, 1)
        Set Plage = .CurrentRegion  ' plage des données (avec les titres)
        For Each Cell In .CurrentRegion.Columns(1).Cells   ' boucle pour créer la liste sans doublon
            If Not var.containskey(Cell.Value) And Cell.Row > 1 Then
                var.Add Cell.Value, Cell.Text
            End If
        Next Cell
    End With
     
     
    For i = 0 To var.Count - 1
     
        ' ici on gère le fait que la feuille existe ou non
        On Error Resume Next
            Set FEUILLE_DEST = ThisWorkbook.Worksheets(Plage.Cells(1, 1) & "_" & var.getbyindex(i))
        On Error GoTo 0
     
        ' si la feuille n'existe pas : on la crée et la renomme avec le nom de la var
        If FEUILLE_DEST Is Nothing Then
            Set FEUILLE_DEST = ThisWorkbook.Worksheets.Add
            FEUILLE_DEST.Name = Plage.Cells(1, 1) & "_" & var.getbyindex(i)
            FEUILLE_DEST.Move After:=Sheets(ActiveWorkbook.Sheets.Count)
     
        ' si la feuille existe : on efface tout
        Else
            FEUILLE_DEST.Cells.Clear
        End If
     
        ' utilisation du filtre avancé
        With FEUILLE_DEST
            .Cells(1, 1) = Plage.Cells(1, 1) ' nom du critère (l'entête de la colonne 1)
            .Cells(2, 1) = var.getbyindex(i)            ' valeur du critère : nom de la var (qui est le nom de la feuille)
            Plage.AdvancedFilter xlFilterCopy, .Cells(1, 1).CurrentRegion, .Cells(4, 1), False  ' application du filtre avancé
            .Cells(1, 1).Resize(3, 1).EntireRow.Delete ' nettoyage de la zone des critères (= suppression des lignes 1 à 3)
        End With
     
        Set FEUILLE_DEST = Nothing
    Next i
     
     
    Application.DisplayAlerts = True
    'auto ajustement de la taille des colonnes pour plus de lisibilité
    For Each sh In ThisWorkbook.Sheets
        sh.Cells.EntireColumn.AutoFit
    Next sh
     
    Application.ScreenUpdating = True
    End Sub
    J'aimerais bien aller vivre en Théorie, car en Théorie tout se passe bien.

Discussions similaires

  1. [WD-2007] Connection à une base excel pour Publipostage : Macro VBA
    Par astroflo dans le forum VBA Word
    Réponses: 2
    Dernier message: 10/02/2012, 10h14
  2. [AC-2003] Enregistrer une base de données Acces en vba
    Par mmmxtina dans le forum VBA Access
    Réponses: 6
    Dernier message: 20/07/2009, 16h19
  3. Comment créer une connexion avec une base de données MySql en VBA
    Par jinkey dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/12/2008, 16h39
  4. Problème de récupération de données d'une base SQL sous Excel en VBA
    Par seba57_r dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 19/11/2007, 19h03
  5. Creation d'une base de donnees en TXT [VBA-E]
    Par Adri1l dans le forum Excel
    Réponses: 1
    Dernier message: 08/08/2006, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo