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 :

Création de fonctions Excel: Choix(ParamArray Possibilites()) - pas à pas qui s'arrête


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    enquiquineur d'unparia
    Inscrit en
    Février 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : enquiquineur d'unparia

    Informations forums :
    Inscription : Février 2014
    Messages : 82
    Par défaut Création de fonctions Excel: Choix(ParamArray Possibilites()) - pas à pas qui s'arrête
    Hello,

    Alors voilà j'ai créé cette fonction que je souhaite appeler dans ma page excel pour me prendre la première valeur qui est un nombre qu'elle rencontre.

    Cependant le code ne marche pas, sans que je comprenne pourquoi.

    Le pas à pas déclenché par le calcul d'une cellule contenant la formule (je suis en calcul manuel) s'arrête après le test isNumeric...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Option Explicit
     
    Public Function ChoixSpot(ParamArray Possibilites()) As Variant
        Dim Valr() As Variant, i As Integer
        Valr = Possibilites(0).Value2
        For i = 0 To UBound(Valr)
            If (IsNumeric(Valr(i))) Then
                ChoixSpot = Valr(i + 1)
                Exit Function
            End If
        Next i
    End Function
    Si quelqu'un a une idée je suis preneur !

    EDIT : Je crois que il n'arrive pas à accéder aux différents indices de Valr(i)...

    Merci

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 170
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu déclares Valr comme un tableau sans dimension et tu lui passes la valeur du premier élément du tableau de ton argument Possibilites or Valr n'a aucune dimension
    Que cherches-tu à faire exactement avec cette fonction, parce-que pour moi ton explication n'est pas claire ?

    A lire Les fonctions personnelles dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre confirmé
    Homme Profil pro
    enquiquineur d'unparia
    Inscrit en
    Février 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : enquiquineur d'unparia

    Informations forums :
    Inscription : Février 2014
    Messages : 82
    Par défaut
    Hello,

    Vlr est un tableau de n éléments en réalité.
    C'est Possibilites() qui est un tableau de taille 1, et je vois qu'il stocke toutes mes valeurs sont en Possibilites(0).Value2(n) avec n de 0 à N.

    Je veux donc parcourir tout le tableau Value2(), et dès que je trouve une valeur numérique, la fonction s'arrête et me renvoie cette valeur.
    J'ai stocké le tableau dans Vlr car j'ai cru que c'était le fait de parcourir Possibilites() qui faisait bugger.

    (je viens de voir que le code transmis avait une petite coquille dans le test IF, créée lors de la transmission du msg, i commence à 0 et le tableau à 1.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Option Explicit
     
    Public Function ChoixSpot(ParamArray Possibilites()) As Variant
        Dim Valr() As Variant, i As Integer
        Valr = Possibilites(0).Value2
        For i = 0 To UBound(Valr)
            If (IsNumeric(Valr(i + 1))) Then
                ChoixSpot = Valr(i + 1)
                Exit Function
            End If
        Next i
    End Function

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 170
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pour profiter des avantages qu'offre la boîte de dialogue "Insertion de fonction" avec ParamArray, il est préférable de nommer l'argument avec le chiffre 1 à la fin comme Possibilite1

    Vlr est un tableau de n éléments en réalité.
    A aucun moment tu ne précises n
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Valr = Possibilites(0).Value2
    Comme je l'ai écrit Valr est un tableau sans dimension et le fait de lui passer une valeur provoque une erreur et la procédure s'arrête.
    Comme ceci cela ira mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function ChoixSpot(ParamArray Possibilite1()) As double
     Dim i As Integer
     For i = 0 To UBound(Possibilite1)
      If IsNumeric(Possibilite1(i)) Then ChoixSpot = Possibilite1(i): Exit Function
     Next
    End Function
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    J'ai analysé le code de façon générale mais il n'y a rien qui me choque !

    Pourrais tu nous donner un exemple de l'appel de cette fonction avec si possible le contenue des valeurs transposent!

  6. #6
    Membre confirmé
    Homme Profil pro
    enquiquineur d'unparia
    Inscrit en
    Février 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : enquiquineur d'unparia

    Informations forums :
    Inscription : Février 2014
    Messages : 82
    Par défaut
    @ Philippe Tulliez : J'ai toujours eu du mal à me faire comprendre
    La fonction que tu m'as donnée était celle que j'avais créée initialement.

    Je vais reprendre point par point mon raisonnement :

    J'ai en cellule : B6 : =+ChoixSpot(B$7:B$99)
    avec un break point dans la fonction sur la ligne : For i = 0 To UBound(Possibilite1)
    J'actualise ma cellule B6 (F2 + Enter)
    La fonction se lance, stoppée par le break point.
    J'analyse la variable locale Possibilite1(); la fenêtre me dit :
    Possibilite1 > Possibilite1 (0) > Value2 > Value2(1 à 93)

    Donc Possibilite1() est de taille 1 (ou 0 selon la base considérée), et les variables du range (B$7:B$99) sont stockées dans un attribut tableau de données de Possibilite1(0).Value2(1 à 93)
    Donc selon moi, il s'agit du tableau Possibilite1(0).Value2(1 à 93) que je devrais analyser.

    Pour le moment j'ai en valeur récupérée avec la fonction actuelle 0.


    @dysorthographie : La fonction que j'essaye de faire est la suivante :
    Elle sera utilisée dans une cellule excel au dessus d'une liste de nombre générés par différentes macros.
    La fonction 'scannera' et retournera le premier nombre valide qu'elle rencontre.
    (Les macro qui génèrent la liste, peuvent renvoyer des valeurs #N/A #VALEUR et autre, je veux donc récupérer la première valeur valide rencontrée).


    Exemple de listes :

    Liste 1 :
    #NA
    13
    44
    22
    #VALEUR
    => La fonction retourne 13.


    Liste 2 :
    33
    #NA
    22
    50
    => La fonction retourne 33.

    Liste 3 :
    22
    50
    55
    66
    => La fonction retourne 22.

    Voilà voilà,

    merci bien !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function ChoixSpot(ParamArray Possibilite1()) As Double
    Dim Valr As Variant, i As Integer
        Valr = Possibilite1(0)
     For i = 1 To UBound(Valr)
      If IsNumeric("" & Valr(i, 1)) Then ChoixSpot = Valr(i, 1): Exit Function
     Next
    End Function

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 170
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    La fonction renvoie la première valeur numérique trouvée dans une plage de cellules contiguë ou des plages non contiguës. Dans cet exemple les cellules vides ne sont pas prises en compte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Function ChoixSpot(ParamArray Possibilite1() As Variant)
     Dim rng As Variant, c As Variant
      For Each rng In Possibilite1
       If IsObject(rng) Or IsArray(rng) Then
        For Each c In rng
         If Len(c) And IsNumeric(c) Then ChoixSpot = c.Value: Exit Function
        Next c
       End If
      Next rng
    End Function
    Exemple d'utilisation
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =ChoixSpot(A2:A4;B6:B14)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Membre confirmé
    Homme Profil pro
    enquiquineur d'unparia
    Inscrit en
    Février 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : enquiquineur d'unparia

    Informations forums :
    Inscription : Février 2014
    Messages : 82
    Par défaut
    Si j'ai bien compris, Value2 avait 2 dimensions ! Je suis miro

    Merci à vous 2 !

    Bonne journée & Bon We

    MS.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    ou bien sans boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
        Debug.Print ChoixSpot([A4:A8])
    End Sub
     
    Function ChoixSpot(plage As Range)
        Dim pl As Range
        On Error Resume Next
        Set pl = plage.SpecialCells(xlCellTypeConstants, xlNumbers)
        Set pl = Union(pl, plage.SpecialCells(xlCellTypeFormulas, xlNumbers)) 'supprimer si inutile
        On Error GoTo 0
        If pl Is Nothing Then ChoixSpot = CVErr(xlErrNA) Else ChoixSpot = pl(1)
    End Function
    eric

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/02/2015, 13h54
  2. Création d'une nouvelle fonction Excel (VBA)
    Par alinehg dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 27/05/2008, 20h20
  3. Réponses: 4
    Dernier message: 26/03/2008, 18h35
  4. Création en C# de Fonctions Excell
    Par Smogling dans le forum C#
    Réponses: 1
    Dernier message: 09/01/2007, 14h27
  5. Fonction Excel : ne fonctionne pas
    Par jojodoudou dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 19/09/2006, 15h44

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