Création d'une fonction personnalisée VBA

Bonjour j'aimerai créer une fonction personnalisée en vba excel qui me dit si une range de cellules est vide ou non. Je l'ai fait seulement lorsque je l'appelle, je n'ai pas le retour escompté.
Public Function ESTNONVIDE(Cellules As Range) As String

    Dim i As Integer, MaCell As Range, NONVIDE As String
    ESTNONVIDE = "NOK"
    For Each MaCell In Cellules.Cells
        If MaCells.Value <> "" Then
            ESTNONVIDE = "OK"
            Exit For
        End If
    Next

End Function

La fonction a été placée dans un module. Lorsque j'appelle la fonction dans une cellule d'une feuille excel dans "C40" par exemple

=ESTNONVIDE(C37:F37)

, j'ai le message suivant:

#VALEUR!

Pouvez-vous me dire ou se trouve le problème ?

Merci d'avance

Bonjour

Quand tu crées une function tu indiques une variable plage en argument (on ne voit pas ta ligne Function)

Il ne faut donc pas utiliser de Dim

Cependant la fonction NBVAL fait déjà ce calcul donc quel est l'intérêt de ta Fonction perso ?

Pardon le code complet est

Public Function ESTNONVIDE(Cellules As Range) As String
    Dim i As Integer, MaCell As Range, NONVIDE As String
    ESTNONVIDE = "NOK"
    For Each MaCell In Cellules.Cells
        If MaCells.Value <> "" Then
            ESTNONVIDE = "OK"
            Exit For
        End If
    Next

End Function

En fait c'est le début d'un plus large projet. Le but étant pour l'instant d'apprendre à créer une fonction personnalisée. Merci

RE

Quand je donne des cours VBA, je prends des exemples utiles dans la vie réelle, que les stagiaires pourront réutiliser...

2 modifs (car une plage peut être très grande)

Public Function ESTNONVIDE(Cellules As Range) As String
    Dim i As Long, MaCell As Range
    ESTNONVIDE = "NOK"
    For Each MaCell In Cellules.Cells
        If MaCells <> "" Then
            ESTNONVIDE = "OK"
            Exit For
        End If
    Next

End Function

Bonjour à tous,

Je partage l'avis de mon camarade 78Chris ! Quel est l'intérêt de créer une telle fonction ?

Au cas où, j'ai quand même une proposition à faire :

Public Function ESTNONVIDE(paramarray plages()) As Boolean

for i = lbound(plages) to ubound(plages)
    if application.countblank(plages(i)) > 0 then Exit function
next i

ESTNONVIDE = True

End Function

Je l'ai transformée en booléenne et elle est fonctionnelle sur des sélections multiples.

Cdlt,

RE

Au cas où, j'ai quand même une proposition à faire...

J'ai aussi failli proposer du booleen

on a cité les 2 fonctions complémentaires NBVAL et NB.VIDE qui permettent de se passer de la fonction...

Bien pensé le multi plages

Oui, il est vrai que j'ai triché en utilisant NBVIDE mais c'est quand même plus rapide que boucler sur les cellules.

Après, un exercice est un exercice...

A plus,

Merci à tous. C'est parfait

Dans le même genre, j'aimerais pouvoir faire une condition en se basant sur le résultat d'une mise en forme. J'ai plusieurs cellules qui se mettent en rouge si le résultats des tests est NOK et en vert sinon (à noter que la condition pour laquelle elles se mettent en vert ou rouge varie d'une cellule à l'autre).

A la fin des tests, j'aimerais savoir si l'ensemble de mes contrôles sont OK. Pour cela, je fais une condition qui boucle sur l'ensemble des cellules et qui vérifie si leur couleur est rouge. Seulement, la fonction me signale une erreur à la deuxième ligne de la boucle, je ne comprend pas.

Public Function fTestStatut(ParamArray plages()) As Boolean

    For i = LBound(plages) To UBound(plages)
        If plages(i).DisplayFormat.Interior.Color <> RGB(156, 0, 6) Then
            Exit Function
        End If
    Next
    fTestStatut = True
End Function

SVP

Merci d'avance

Zut alors, c'est mal choisi. Je ne sais pas pourquoi mais apparemment il n'est pas possible d'utiliser la propriété .displayformat dans une fonction....

Il faut soit passer par une procédure, soit se contenter de .interior.color (mais donc plus rien à voir avec la MFC)

Ok d'accord merci bien.

Je pense que je suis obligé d'utiliser cette propriété lorsque le coloriage fais suite à une mise en forme conditionnelle.

Oui, mais il faut le faire dans une Sub, pas dans une fonction. Essayez de mettre un point d'arrêt sur la ligne du If, puis exécutez au pas à pas (touche F8), vous verrez que l'exécution s'arrête net dans la fonction.

RE à tous

Ils vont peut-être finir par l'adapter, mais quand ????

J'ai découvert aujourd'hui par hasard qu'on peut maintenant soustraire des cellules d'une sélection continue ou discontinue, ce qui manquait terriblement dans Excel.

Je ne sais de quand cela date car Bill ne m'a même pas prévenu, lol !

Rechercher des sujets similaires à "creation fonction personnalisee vba"