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 :

Peut-on écrire des fonctions matricielles en VBA ? [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Par défaut Peut-on écrire des fonctions matricielles en VBA ?
    Bonjour à tous,

    je cherche à créer une fonction à utiliser de façon matricielle dans plusieurs cellules.

    Pour clarifier par l'exemple, j'ai une première colonne de 9 cellules, contenant des valeurs avec des doublons (il n'y a que 4 valeurs uniques).

    Dans une seconde colonne, je voudrais afficher la liste des valeurs uniques contenues dans la première colonne (donc l'équivalent de la liste déroulante des filtres rapides).

    Je pensais faire une fonction matricielle étendue sur toute la seconde colonne, même si les valeurs uniques ne seraient affichées que dans les 4 premières lignes.

    Mais en fait, je n'arrive pas à coder une fonction personnelle qui génère un tableau et qui fonctionne comme une fonction matricielle que l'on tape sur une plage et non une cellule.

    À me relire, je ne sais pas si c'est très clair... essayons une petite image :
    Nom : Fonction matricielle rêvée.png
Affichages : 1294
Taille : 11,7 Ko

    Je sais bien que je pourrais faire la même chose avec le filtre "extraction sans doublons", mais je voudrais une fonction pour que ça soit dynamique si je rajoute des données. J'avais l'habitude de faire ça avec la fonction "VALEURS.UNIQUES" de Laurent Longre (MoreFunc) mais je suis passé en 64 bits, donc elle ne fonctionne plus. J'essaye de faire un équivalent simpliste en VBA...

    Merci d'avance de vos lumières !

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Comme ça :
    Nom : Matricielle.jpg
Affichages : 1196
Taille : 93,2 Ko

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Par défaut
    Salut Patrice740 et merci de la rapidité de ta réponse !! (j'aurais dû me coucher un peu plus tard hier...)

    Eh bin c'est jute nickel ! Ça marche pile poil ! Et en plus, en lisant ton code, j'ai appris ce qu'était un Dictionnaire (c'est lui qui fait le travail de rendre les entrées uniques, c'est ça ? Super pratique par rapport à tout ce que je faisais avant...) et quelques astuces de code (je n'aurais jamais osé t = rng.Value... je me serais lancé dans une boucle pour remplir les valeurs du tableau une à une avec les valeurs de la plage !)

    Bref super.

    Par curiosité, tu avais ce code ou quelque chose de similaire sous la main ? Juste pour savoir si je suis le seul à regretter certaines fonctions de Morefunc qui facilitaient bien la vie (à condition de distribuer Morefunc aux utilisateurs de nos fichiers) ?

    Encore merci.

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Citation Envoyé par Deltaplouf Voir le message
    ... j'ai appris ce qu'était un Dictionnaire (c'est lui qui fait le travail de rendre les entrées uniques, c'est ça ? Super pratique par rapport à tout ce que je faisais avant...) et quelques astuces de code (je n'aurais jamais osé t = rng.Value...
    Par curiosité, tu avais ce code ou quelque chose de similaire sous la main ?
    Rien sous la main, mais en cette période de faible activité, j'avais un peu de temps à occuper, et y avait longtemps que je n'avais pas écrit de fonction matricielle ...
    Effectivement, un dictionnaire n'accepte pas de doublons dans ses clés, et couplé à l'utilisation d'un tableau de valeurs c'est beaucoup plus rapide que travailler sur les cellules.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Par défaut
    Top top top ! J'entrevois plein de simplifications dans bon nombre de mes macros... j'attends la baisse de boulot pour la semaine prochaine, je vais pouvoir explorer tout ça.

    Encore merci.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 9
    Par défaut
    Pour faciliter la vie de ceux qui auraient besoin de réutiliser le code, le voici (avec juste quelques changements de noms de variables) :
    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
    Function ValeursUniquesMat(Plage As Range) As Variant
    'Fonction matricielle extrayant les valeurs uniques d'une liste de valeurs répétées
    'la liste de valeurs répétées doit être en une colonne, la fonction matricielle doit être posée de façon vectorielle en une colonne d'autant de lignes que la plage d'entrée
     
    Dim Dico As Dictionary
    Dim Matrice As Variant
    Dim Liste As Variant
    Dim I As Long
     
    'gestion de l'erreur si l'utilisateur ne sélectionne pas une plage en une colonne
    If Plage.Columns.Count > 1 Then
        ValeursUniquesMat = CVErr(XlCVError.xlErrRef)
    ElseIf Plage.Count = 1 Then 'si la plage est une cellule unique, la fonction renvoie la cellule unique
        Set ValeursUniquesMat = Plage
    Else 'dans tous les autres cas
        Set Dico = New Dictionary
        Matrice = Plage.Value
        For I = LBound(Matrice) To UBound(Matrice)
            Dico(Matrice(I, 1)) = "" 'remplit l'objet Dictionary avec les valeurs de la plage, et une valeur vide pour la définition associée
        Next I
        Liste = Dico.Keys 'Liste devient la liste des valeurs uniques, puisque les dicos n'acceptent pas d'entrées en doublon
        For I = LBound(Matrice) To UBound(Matrice)
            If I > UBound(Liste) + 1 Then
                Matrice(I, 1) = "" 'vide les valeurs de la fin du tableau puisque seules les premières lignes seront utiles
            Else
                Matrice(I, 1) = Liste(I - 1) 'remplit le tableau de résultat avec les entrées du dico (décalage de 1 car Matrice commence à 1 et Liste commence à 0)
            End If
        Next I
        ValeursUniquesMat = Matrice 'le résultat renvoyé par la fonction est le tableau de même taille que la plage, mais avec les premières valeurs égales à celle du dico
    End If
    End Function

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

Discussions similaires

  1. Peut-on utiliser des fonction regex pour un fichier XML sur Eclipse en JAVA ?
    Par Miigui dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 12/01/2018, 10h40
  2. Réponses: 7
    Dernier message: 18/01/2015, 17h36
  3. Peut-on définir des fonctions dans un script ?
    Par nchristedem dans le forum MATLAB
    Réponses: 20
    Dernier message: 11/08/2009, 11h38
  4. utilisation des fonction excel dans VBA
    Par ghosty04 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/04/2009, 11h24
  5. Réponses: 3
    Dernier message: 15/05/2008, 21h29

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