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] : récupérer la liste de valeurs uniques d'une colonne dans des variables


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Femme Profil pro
    Analyst
    Inscrit en
    Septembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2018
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [VBA] : récupérer la liste de valeurs uniques d'une colonne dans des variables
    Bonjour à tous,

    Tout d'abord je viens de passer les 30 dernières mins à trouver une solution à mon problème donc je peux vous assurer que j'ai bien cherché avant de poster mais je n'ai pas trouvé ce qu'il me fallait.

    Je cherche, en VBA absolument même si je sais que cela serait beaucoup + simple et rapide sans, à récupérer les valeurs uniques d'une colonne, pour ensuite les réutiliser.
    Le but final est de scinder un classeur en plusieurs onglets selon une condition qui est la valeur que prend une colonne donnée.

    Par exemple j'ai 10 colonnes, la 10ème peut prendre 5 valeurs différentes ("valeur 1","valeur 2", ... "valeur 5") et je voudrais créer 5 onglets avec uniquement les lignes qui correspondent à la valeur, par exemple un premier onglet "valeur 1" où j'aurais toutes les lignes dont la 10ème colonne vaut "valeur 1"(et uniquement celles-là), etc.

    J'ai déjà fait quelques trucs en VBA mais je ne maîtrise pas les Array ou les Dictionnary et je pense qu'il faut passer par là.

    La 1ère étape est donc je pense de créer un Array/dictionnaire/ou autre, de tester chaque valeur de la 10ème colonne, et d'ajouter cette valeur si celle-ci n'est pas déjà dans l'objet (array/dictionnaire).
    Le but est ensuite que puisse facilement récupérer ces 5 valeurs pour intituler mes onglets, et refaire une boucle sur le tableau initial disant : dans l'onglet 1, si en ligne i la colonne 10 vaut "valeur 1" , alors ajoutez-la.

    Est-ce que quelqu'un a une solution simple svp ?


    Merci beaucoup par avance,

    Eléonore

  2. #2
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour,
    Je pense qu'il est aussi simple de passer par un filtre élaboré, vous pourrez ainsi effectuer une extraction sur chaque feuille (Feuil1 pour Valeur 1, etc). il suffit de mettre une zone d'extraction dans chaque feuille, et d'extraire les données correspondates à la feuille depuis celle-ci.
    https://philippetulliez.developpez.c...dvancedfilter/
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  3. #3
    Candidat au Club
    Femme Profil pro
    Analyst
    Inscrit en
    Septembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2018
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour Transitoire et merci pour ta réponse.

    Je suis d'accord que ce serait plus simple, mais je voudrais tout de même apprendre à créer un tableau Array ou un dictionnaire, lui ajouter des valeurs selon une condition (ex : le fait que la valeur ne soit pas déjà dedans), puis récupérer simplement ces valeurs pour les réutiliser Et c'est pour ce problème que je ne trouve pas de solution simple dans les forums ou tuto VBA.

    Eléonore

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,

    -L'exemple ci dessous comprend une fonction perso qui renvoie la liste des mots clés d'un champ.

    -Sélectionner J2:J20 e.g.
    =sansdoublonstrié(champ)
    -Valider avec maj+ctrl+entrée

    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
     
    Function SansDoublonsTrié(champ As Range)
      Application.Volatile
      Set d = CreateObject("Scripting.Dictionary")
      Tbl = champ                               ' Array pour rapidité
      For i = LBound(Tbl, 1) To UBound(Tbl, 1)
        For j = LBound(Tbl, 2) To UBound(Tbl, 2)
          If Not d.Exists(tmp) And Tbl(i, j) <> "" Then d(Tbl(i, j)) = ""
        Next j
      Next i
      Dim b()
      ReDim b(1 To Application.Caller.Rows.Count)
      i = 1
      For Each c In d.keys
        b(i) = c
        i = i + 1
      Next
      Tri b, 1, d.Count
      SansDoublonsTrié = Application.Transpose(b)
    End Function
    -Le Filtre élaboré permet d'extraire les lignes qui contiennent un mot clé choisi.


    Boisgontier

  5. #5
    Candidat au Club
    Femme Profil pro
    Analyst
    Inscrit en
    Septembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2018
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse Boisgontier (et plus généralement merci pour votre site et vos nombreux autres posts sur le Web qui m'ont toujours beaucoup servi !).
    Je comprends que, si je souhaite utiliser VBA, la solution largement conseillée est de passer de toute façon par un filtre, cependant je souhaiterais vraiment pour l'exercice et pour le futur pouvoir manier un Array ou un Dictionnaire. Avez-vous une solution à me proposer dans ce sens (ou simplement un tuto qui m'expliquerait comment manier ces objets, les remplir, tester une condition dessus, récupérer chacune des valeurs, etc.) ?

    Merci et bonne soirée,

    Eléonore

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonsoir,


    Extraction d'onglets par mot-clés sans le filtre avancé (les mots clés sont en colonnes 5,6,7,8)

    Le filtre est fait par une fonction: Tblres = FiltreArrayCléColRécup(TblBD, clé, Array(5, 6, 7, 8), Array(1, 2, 3, 4, 5, 6, 7, 8))

    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
    Sub Extrait()
      Application.ScreenUpdating = False
      Application.DisplayAlerts = False
      Set f = Sheets("BD")
      TblMotsClés = SansDoublonsTrié([E2:H1000])                 ' liste des mots clés triés
      TblBD = f.Range("A2:H" & f.[A65000].End(xlUp).Row).Value   ' pour rapidité
      For i = 1 To UBound(TblMotsClés)
         clé = TblMotsClés(i)
         Tblres = FiltreArrayCléColRécup(TblBD, clé, Array(5, 6, 7, 8), Array(1, 2, 3, 4, 5, 6, 7, 8))
         On Error Resume Next
         Sheets(clé).Delete
         On Error GoTo 0
         Sheets.Add After:=Sheets(Sheets.Count)              ' création feuille
         ActiveSheet.Name = clé
         [A2].Resize(UBound(Tblres), UBound(Tblres, 2) + 1) = Tblres
         f.[A1.H1].Copy [A1]                                 ' titre
      Next i
      f.Select
    End Sub

    Avec le filtre avancé


    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
     
    Sub Extrait()
      Application.ScreenUpdating = False
      Application.DisplayAlerts = False
      Set f = Sheets("BD")
      Nlig = [A1].CurrentRegion.Rows.Count
      Ncol = [A1].CurrentRegion.Columns.Count
      TblMotsClés = SansDoublonsTrié([E2:H1000])                 ' liste des mots clés triés
      For Each c In TblMotsClés
         f.[N1] = c
         On Error Resume Next
         Sheets(c).Delete
         On Error GoTo 0
         Sheets.Add After:=Sheets(Sheets.Count)   ' création
         ActiveSheet.Name = c
         '-- extraction
         f.[A1].Resize(Nlig, Ncol).AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=f.[L1:L2], CopyToRange:=[A1]
       Next c
       f.Select
    End Sub
    Boisgontier

  7. #7
    Candidat au Club
    Femme Profil pro
    Analyst
    Inscrit en
    Septembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Analyst
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2018
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci Boisgontier pour votre macro "Extrait" qui répond en effet à l'intégralité de mon problème (génération d'onglets contenant les lignes d'une BD selon un mot-clé), je n'ai en revanche pas tout compris il faudra donc que je me pose dessus plus longuement.

    Eléonore

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

Discussions similaires

  1. [XL-2010] Vérifier valeur unique sur une colonne
    Par halaster08 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 06/10/2016, 12h57
  2. [AC-2010] Compter les valeurs uniques d'une colonne
    Par GasGasGas dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/06/2014, 23h02
  3. [XL-2010] Récupérer une liste avec valeurs uniques depuis une colonne
    Par Onkas81 dans le forum Excel
    Réponses: 5
    Dernier message: 08/08/2013, 18h46
  4. Liste de valeurs possibles pour une colonne
    Par eagleleader dans le forum Développement
    Réponses: 4
    Dernier message: 17/09/2012, 06h28
  5. [Toutes versions] Déterminer les valeurs unique d'une colonne
    Par l.a.bdx dans le forum Excel
    Réponses: 10
    Dernier message: 31/01/2010, 07h16

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