IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA : extraire tous les résultats d'un filtre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut VBA : extraire tous les résultats d'un filtre
    Bonjour,

    J'ai un fichier provenant d'une extraction de ma base qui comprend tous les produits de tous mes fournisseurs et j'ai besoin d'envoyer à mes fournisseurs tous leurs produits (et leurs produits uniquement).

    Pour la procédure manuelle, je fais autant de copie de mon fichier que j'ai de fournisseurs. Pour chacun d'eux je filtre sur les fournisseurs non voulus et je supprime les lignes filtrées (normal, il ne faut pas que le fournisseur puisse lire les infos des concurrents en "dé-filtrant").

    Etant une action ultra répétitive et complétement automatisable (je pense), j'ai pensé aux macros.

    J'ai réussi à extraire la liste des fournisseurs dans une autre feuille en pensant m'appuyer dessus pour des boucles.... mais non (en plus les boucles étant longues à traiter, je préfère les éviter). Je bloque donc pour l'exprimer en vba (for each .... ?).

    J'ai vraiment essayé mais je sèche.

    PS : le nombre/nom de fournisseurs peux varier d'une extraction à une autre.

    Merci d'avance pour vos propositions

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Septembre 2013
    Messages
    783
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2013
    Messages : 783
    Par défaut
    Bonjour,

    Sans passer par du VBA, vous pouvez utiliser le filtrage avancé d'Excel, qui sauf erreur, peut vraiment faire tout ce que vous demandez .... automatiquement et sans code
    Voir tuto si besoin sous http://philippetulliez.developpez.co...dvancedfilter/

    Après, vous pouvez passer par le VBA pour l'automatisation (parcourir tous les founrnisseurs et les extraire puis les passer au filtre)

    Vincent

  3. #3
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 128
    Par défaut
    Bonjour,

    Où est ta question ? Je ne la vois pas.

    Mais dans le doute, si j'essaie de comprendre ce que tu veux faire, c'est sélectionner des données filtrées ?
    Dans ce cas, utilise cet exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim maRange as Range
    set maRange = ...ce que tu veux ...
    maRange.SpecialCells(xlVisible).Select
    Et là tu fais les opérations que tu veux.

    Slooby.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Une petite maccro qui sépare un tableau en plusieurs onglets suivant les valeurs d'une colonne en utilisant les filtres avancées:
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    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
     
    'suppression des sheets "bilan..." si aucune valeur
    Application.DisplayAlerts = False
    For Each sh In ThisWorkbook.Sheets
        If sh.Name Like Plage.Cells(1, 1) & "*" Then
            b = False
            For j = 0 To var.Count - 1
            Debug.Print Plage.Cells(1, 1)
            Debug.Print var.getbyindex(j)
            If sh.Name = Plage.Cells(1, 1) & "_" & var.getbyindex(j) Then b = True
            Next j
            If b = False Then sh.Delete
        End If
    Next sh
    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
    Ici j'utilise la colonne 1 pour le filtre mais ça peut se modifier.
    Les différents tableaux sont sur des onglets mais on pourrait aussi créer de nouveaux classeurs.
    Si tu rajoutes quelques colonnes l'envoi de mail peut aussi s'automatiser.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 128
    Par défaut
    T'as beau nous montrer ton code et ce qu'il fait, tu n'as toujours pas posé de question...

    On ne peut pas deviner la question ET trouver la réponse

    Slooby.

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Citation Envoyé par Slooby Voir le message
    T'as beau nous montrer ton code et ce qu'il fait, tu n'as toujours pas posé de question...

    On ne peut pas deviner la question ET trouver la réponse

    Slooby.
    Sauf que je ne suis absolument pas le posteur originel de ce fil ...
    J'ai juste proposé un code qui je pense répond à ces attentes

+ Répondre à la discussion
Cette discussion est résolue.

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