Créer une fonction CRITERE

Bonjour,

Je voudrais créer une fonction qui réponde à cette syntaxe :

=CRITERE(opérateur;valeur)

L'objectif est entre autres de pouvoir faire varier l'opérateur.

Ça pourrait donner, par exemple :

=NB.SI(A1:A5;CRITERE(B1;C1))

où B1 contient l'opérateur ">" et C1 la valeur "3".

Je précise que je n'y connais rien en VBA.

Merci.

Configuration: Mac OS X El Capitan

Microsoft Office 2016

Cordialement,

Victor Porée.

Bonsoir Victor

Edit : auto-correction

Il est tout à fait possible de mettre dans ton exemple

=NB.SI(A1:A5;B1&C1)

A+

Bonsoir,

Ça marchera bien sûr ! Mais ça ne présente strictement aucun intérêt !!

Une fonction personnalisée pour réaliser une concaténation élémentaire, c'est du temps perdu...

Cordialement.

Salut au toi grand passioné

MFerrand a écrit :

Ça marchera bien sûr !

As-tu essayé ?

perso ça ne fonctionne pas mais effectivement ça ne représente aucun intérêt

A+

Salut Bruno,

Cela fonctionne très bien, c'est assimilable à une variable String...

Les fonctions personnalisées se combinent généralement bien aux fonctions natives, et peuvent être utilisées le cas échéant en MFC (ce qui peut s'avérer une solution dans les cas où la MFC renâcle devant un assemblage trop complexe de fonctions classiques...)

Cordialement.

Bonjour tout le monde,

Merci pour vos réponses,

Au temps pour moi, j'avais mal identifié le problème. Effectivement, une simple concaténation fonctionne parfaitement. C'est avec la fonction SI que ça ne fonctionne pas :

=SI(A1&B1&C1;VRAI;FAUX)

C'est donc plutôt une fonction TEST dont j'aurais besoin :

=TEST(échantillon;opérateur;valeur)

en guise de test logique.

Ou peut-être serait-ce réalisable sans macro ?

Bon weekend.

bonjour,

une fonction personnalisée

Function test(échantillon, opérateur, valeur)
    test = Evaluate(échantillon & opérateur & valeur)
End Function

Bonjour h2so4,

Merci pour ta réponse,

Ça ne fonctionne pas chez moi. :/

bonjour,

l'as-tu bien mise dans un module standard ?

76test-critere.xlsm (13.43 Ko)

Bonjour le fil

Il faut penser à mettre

Application.volatile

au début de la fonction pour quelle puisse se recalculer à tout moment

A+

Bonjour,

Merci pour vos réponses,

Effectivement, ça fonctionne, mais uniquement avec des nombres entiers, et mes données sont uniquement des nombres décimaux. J'ai remarqué que ça fonctionne quand on remplace la virgule par un point, mais ça ne résout pas le problème. :/

Bonsoir,

une correction

Function test(échantillon, opérateur, valeur)
    test = Evaluate(replace(échantillon & opérateur & valeur,",","."))
End Function

un commentaire par rapport à l'instruction

application.volatile

Marks a user-defined function as volatile. A volatile function must be recalculated whenever calculation occurs in any cells on the worksheet. A nonvolatile function is recalculated only when the input variables change. This method has no effect if it's not inside a user-defined function used to calculate a worksheet cell.

sur base de cette info, mettre l'instruction application.volatile n'est pas utile pour ce cas-ci. Elle provoquerait le recalcul de la fonction alors que ce n'est pas nécessaire.

application.volatile est utile lorsqu'Excel ne peut déterminer avant l'exécution de la fonction les cellules qui sont utilisées pour calculer le résultat d'une fonction,

exemple :

Function test(n)
'fait la somme des n cellules précédentes sur la même ligne
    l = Application.Caller.Row
    c = Application.Caller.Column
    For j = c - 1 To c - n Step -1
        If j < 1 Then Exit For
        s = s + Cells(l, j)
    Next j
    test = s
End Function

Encore merci h2so4 pour ta réponse,

Effectivement, ça marche, mais pas quand l'échantillon est une plage. :/

Pour que ce soit plus simple — parce que je ne pose clairement pas les bonnes questions, et j'en suis sincèrement désolé — je t'ai joint un exemple simplifié de ce que je veux faire.

17test.xlsm (36.05 Ko)

Bonjour,

cas où l'échantillon est une plage, function matricielle sélectionner la plage qui doit recevoir le résultat et valider par CTRL-MAJ ENTREE

Function test(échantillon, opérateur, valeur)
    Dim r(), i, v, nc
    nc = Application.Caller.Columns.Count
    If échantillon.Count = 1 Then
        test = Evaluate(Replace(échantillon & opérateur & valeur, ",", "."))
    Else
        i = -1
        For Each v In échantillon
            i = i + 1
            ReDim Preserve r(i)
            r(i) = Evaluate(Replace(v & opérateur & valeur, ",", "."))
        Next v
        If nc = 1 Then test = Application.Transpose(r) Else test = r
    End If
End Function

Bonjour h2so4,

Tout fonctionne à merveille. Je te remercie infiniment pour ton aide plus que précieuse, et pour ta patience aussi. Ha ha !

À bientôt et bon dimanche,

Victor Porée.

Bonjour h2so4,

Me revoilà, malheureusement. Ha ha !

Il me faudrait juste une petite modification, la formule TEST ne fonctionne pas lorsqu'il y a une cellule sans valeur dans la plage. :/

Une idée ?

Bon weekend !

bonsoir

un correction

Function test(échantillon, opérateur, valeur)
    Dim r(), i, v, nc
    nc = Application.Caller.Columns.Count
    If échantillon.Count = 1 Then
        test = Evaluate(Replace(échantillon & opérateur & valeur, ",", "."))
    Else
        i = -1
        For Each v In échantillon
            i = i + 1
            ReDim Preserve r(i)
            if v="" then
            r(i)=""
           else
            r(i) = Evaluate(Replace(v & opérateur & valeur, ",", "."))
           end if
        Next v
        If nc = 1 Then test = Application.Transpose(r) Else test = r
    End If
End Function

Merci pour la correction,

Ça ne fonctionne malheureusement pas. :/

bonjour,

nouvel essai

Function test(échantillon, opérateur, valeur)
    Dim r(), i, v, nc
    nc = Application.Caller.Columns.Count
    If échantillon.Count = 1 Then
        test = Evaluate(Replace(échantillon & opérateur & valeur, ",", "."))
    Else
        i = -1
        For Each v In échantillon
            i = i + 1
            ReDim Preserve r(i)
            If v = "" Then
            r(i) = 0
           Else
            r(i) = Evaluate(Replace(v & opérateur & valeur, ",", "."))
           End If
        Next v
        If nc = 1 Then test = Application.Transpose(r) Else test = r
    End If
End Function

Bonjour h2so4,

Ça fonctionne !

Je te remercie infiniment, tu es un Dieu. Ha ha !

Bon dimanche.

Rechercher des sujets similaires à "creer fonction critere"