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 :

Liste de valeur unique [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Homme Profil pro
    Secrétaire
    Inscrit en
    Avril 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Secrétaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2020
    Messages : 51
    Points : 44
    Points
    44
    Par défaut Liste de valeur unique
    Bonjour,

    Je cherche le moyen de faire une liste unique de valeur sur la colonne A (Nom d'entreprise)
    Cette liste sera dynamique
    Je sais faire les boucles avec For Next ou avec For each Select case...

    J'ai essayer de combiner nom(i) avec Range("A2:A5000").AdvancedFilter, Unique:=True mais cela n'a rien donné de bon.

    Le but est de ne pas copier une liste unique vers une autres colonne et de sélectionner les valeurs mais bien d'avoir les valeurs nom(i) que je vais utiliser plus tard dans mon code.
    S'il faut passer par Array ou dictionary cela ne me dérange pas (mais je maitrise pas du tout pour le moment)

    Ma colonne ne dépassera jamais 10000 lignes et le nombre d'entreprise différente pas plus d'une centaine
    Et petit plus cela serait formidable que la liste nom(i) soit par ordre alphabétique

    Merci pour votre aide

  2. #2
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    961
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 961
    Points : 4 078
    Points
    4 078
    Par défaut
    Bonjour,
    Je vous propose de faire cela en trois étapes:
    1) Charger les données en mémoire.
    2) Trier ces données par ordre croissant.
    3) Ne retenir que les données dont la précédente n'est pas identique.

    je propose d'utiliser un tableau structuré pour la lecture des données car c'est plus efficace qu'une plage de données classique.

    Exemple pour obtenir les valeurs uniques d'après la colonne "Prénom" du tableau structuré nommé "Tableau1" :
    Code VBA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Exemple()
     
    Dim V As Variant, i As Long
    V = TS_ValeurUnique(Range("Tableau1"), "Prénom")
    For i = 0 To UBound(V)
        Debug.Print V(i)
    Next i
     
    End Sub

    La fonction générique (vous en trouverez d'autres dans cette documentation: Fonctions pour gérer les tableaux structurés)

    Code VBA : 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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    '------------------------------------------------------------------------------------------------
    Public Function TS_ValeurUnique(TS As Range, ByVal Colonne As Variant) As Variant
    '------------------------------------------------------------------------------------------------
    ' Renvoie une liste sans doublon (valeur unique) en base 0 de la colonne d'un tableau structuré,
    ' classée par ordre croissant.
    '------------------------------------------------------------------------------------------------
    ' TS : La plage du Tableau Structuré.
    ' Colonne : Le numéro de la colonne, ou le nom de la colonne.
    '           Si vide ou 0 alors prend la dernière colonne du Tableau Structuré.
    '------------------------------------------------------------------------------------------------
    ' Renvoie : Une mémoire contenant les valeurs uniques où la première valeur est en index 0.
    '------------------------------------------------------------------------------------------------
    ' Exemple pour obtenir les valeurs uniques d'après la colonne "Prénom" du
    ' tableau structuré nommé "Tableau1" :
    'Dim V As Variant, i As Long
    'V = TS_ValeurUnique(Range("Tableau1"), "Prénom")
    'For i = 0 To UBound(V)
    '    Debug.Print V(i)
    'Next i
    '------------------------------------------------------------------------------------------------
    Dim NomColonne As String, StrSQL As String
    Dim i As Long, k As Long
    Dim X() As Variant, V() As Variant
     
    ' Gestion des erreurs:
    On Error GoTo Gest_Err
    Err.Clear
     
    ' Retrouve le numéro de la colonne et vérifie sa cohérence (ou -1 si erreur):
    Colonne = TS_IndexColonne(TS, Colonne)
    If Colonne = -1 Then Err.Raise vbObjectError
     
    ' Charge les données de la colonne:
    X = TS.ListObject.ListColumns(Colonne).DataBodyRange.Value
     
    ' Trie les données (en base 1):
    Call TS_QuickSort(X(), 1, UBound(X))
     
    ' Renvoie les données sans doublon:
    ReDim V(0 To UBound(X))
    V(0) = X(1, 1)
    For i = 1 To UBound(X)
      If X(i, 1) <> V(k) Then k = k + 1: V(k) = X(i, 1):
    Next i
    ReDim Preserve V(0 To k)
     
    ' Renvoie les données sous forme de variable:
    TS_ValeurUnique = V
     
    ' Fin du traitement:
    Gest_Err:
     
    ' Fin du traitement:
    If Err.Number <> 0 Then
        MsgBox Err.Number & " : " & Err.Description, vbInformation, "TS_ValeurUnique"
    End If
    Err.Clear
     
    End Function
     
    '------------------------------------------------------------------------------------------------
    Private Function TS_IndexColonne(TS As Range, ByVal Colonne As Variant) As Long
    '------------------------------------------------------------------------------------------------
    ' Recherche le numéro de la colonne d'un tableau structuré.
    '------------------------------------------------------------------------------------------------
    ' TS : La plage du Tableau Structuré.
    ' Colonne : Le numéro de la colonne, ou le nom de la colonne.
    '           Si vide ou 0 alors renvoie le numéro de la dernière colonne du tableau.
    '------------------------------------------------------------------------------------------------
    ' Renvoie : Le numéro de la colonne dans le tableau,
    '           ou -1 si erreur.
    '------------------------------------------------------------------------------------------------
    ' Gestion des erreurs:
    On Error GoTo Gest_Err
    Err.Clear
     
    ' S'il faut traiter la dernière colonne:
    If Colonne = "" Or Colonne = 0 Then Colonne = TS.ListObject.ListColumns.Count
     
    ' Retrouve le numéro de la colonne si c'est le nom qui est passé en argument,
    ' une erreur est déclenchée si le nom n'existe pas:
    If TypeName(Colonne) = "String" Then
        Colonne = TS.ListObject.ListColumns(Colonne).Index
    End If
    ' Contrôle la cohérence de la colonne passée en argument:
    If Colonne < 0 Or Colonne > TS.ListObject.ListColumns.Count Then
        TS_IndexColonne = -1
    Else
        TS_IndexColonne = Colonne
    End If
     
    ' Fin du traitement:
    Gest_Err:
    Err.Clear
     
    End Function
     
    '----------------------------------------------------------------------------------------
    Private Sub TS_QuickSort(ByRef TabDonnées() As Variant, ByVal Gauche As Long, ByVal Droite As Long)
    '----------------------------------------------------------------------------------------
    ' Algorithme QuickSort optimisé pour trier un tableau.
    '----------------------------------------------------------------------------------------
    Dim i As Long, j As Long, Temp As Variant, Pivot As Variant
     
    i = Gauche
    j = Droite
    Pivot = TabDonnées((Gauche + Droite) / 2, 1)
     
    Do
        While Pivot > TabDonnées(i, 1): i = i + 1: Wend
        While TabDonnées(j, 1) > Pivot: j = j - 1: Wend
     
        If j + 1 > i Then
            Temp = TabDonnées(i, 1)
            TabDonnées(i, 1) = TabDonnées(j, 1)
            TabDonnées(j, 1) = Temp
            If LBound(TabDonnées, 2) = 0 Then
                Temp = TabDonnées(i, 0)
                TabDonnées(i, 0) = TabDonnées(j, 0)
                TabDonnées(j, 0) = Temp
            End If
            j = j - 1: i = i + 1
        End If
     
    Loop Until i > j
     
    If Gauche < j Then Call TS_QuickSort(TabDonnées(), Gauche, j)
    If i < Droite Then Call TS_QuickSort(TabDonnées(), i, Droite)
     
    End Sub
    '----------------------------------------------------------------------------------------
    '----------------------------------------------------------------------------------------

    Bonne continuation.

  3. #3
    Membre du Club
    Homme Profil pro
    Secrétaire
    Inscrit en
    Avril 2020
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Secrétaire
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2020
    Messages : 51
    Points : 44
    Points
    44
    Par défaut
    Merci pour votre aide et pour le lien
    C'est ce qu'il me fallait

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 19/09/2018, 10h54
  2. [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
  3. Liste dynamique avec valeur unique de selected
    Par livininchina dans le forum Langage
    Réponses: 2
    Dernier message: 31/08/2012, 15h43
  4. Réponses: 5
    Dernier message: 18/07/2008, 09h50
  5. Réponses: 4
    Dernier message: 30/01/2007, 21h41

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