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 :

problème création fonction excel


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Par défaut problème création fonction excel
    Bonjour,

    Je débute en Visual Basic et je rencontre un problème pour créer une fonction sous excel.
    J'ai rédigé le code ci-dessous dans un module VBA, la procédure (sub) s'execute très bien et me donne la valeur souhaitée, en revanche quand j'utilise ma fonction directement dans excel, cela inscrit simplement #VALUE! en lieu et place de la valeur qui s'affiche dans ma messagebox.

    Merci beaucoup par avance,

    Code:

    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
    Dim Plage As Ranges
     
    Function TotalRefacturable(Plage)
        Dim compteur As Integer, cellule As Range
     
        resultat = 0
     
        For Each cellule In Range(Plage)
     
            Select Case cellule.Offset(0, 1).Value
            Case "Y"
                resultat = resultat + cellule.Value
     
            Case "N"
                'Test
            Case Else
                'Test
            End Select
        Next
     
        TotalRefacturable = resultat
     
    End Function
     
     
    Sub test()
    MsgBox (TotalRefacturable("C9:C17"))
    End Sub

  2. #2
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut FONCTION
    Bonjour,

    Plusieurs remarques

    1 - en VBA ne prend jamais d'"S".

    2 - Tu dois déclarer le type de ta variable à l'intérieur de l'argument déclaré

    Exemple à adapter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function BlaBla (Plage as Range) as String

  3. #3
    Membre éclairé Avatar de bastou93
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

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

    Informations forums :
    Inscription : Août 2010
    Messages : 217
    Par défaut
    De meme défini tes objets et leur type dans la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function TotalRefacturable(Plage as Range)
    Comme ta fonction ne revoie rien utilise Sub et essaye de spécifié Public ou Private selon tes besoins!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub TotalRefacturable(Plage as Range)
    Essaye comme cela. Pour le value sa peut etre due au format de tes celulles aussi a voir

    Bastien

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à tous,

    Le résultat de la procédure établie par notre ami est bien une valeur.

    Il faut donc déclarer une fonction plutôt qu'une procédure.

    Quant à l'argument, si j'ai bien compris, il s'agit d'un objet Range.

    En complément,

    Pour être appelée à l'intérieur d'une procédure, la fonction doit être codée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
    MsgBox TotalRefacturable(Range("A1:A7"))
    End Sub
    (à adapter)

    Enfin, et peut-être surtout,le résultat peut très bien être retourné par la fonction "Sommeprod", du moins pour le cas "Y"

    Exemple

    =SOMMEPROD((B1:B7="Y")*(A1:A7))

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    La fonction SOMME.SI d'Excel n'est elle pas suffisante?

    Sinon, la traduction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function TotalRefacturable(Plage As Range) As Double
     
    TotalRefacturable = Application.SumIf(Plage.Offset(0, 1), "Y", Plage)
    End Function

  6. #6
    Candidat au Club
    Inscrit en
    Août 2011
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 3
    Par défaut
    Merci à tous pour votre aide.

    Mon code marche si on remplace For Each cellule In Range(Plage)
    par For Each cellule In Plage.

    En revanche, je ne comprends pas pourquoi j'arrivais à obtenir le résultat désiré dans une messagebox et qu'une erreur était générée dans mon fichier excel...

    Je n'avais pas non plus pensé à la fonction sumif, c'est beaucoup plus pratique ^^

  7. #7
    Membre éclairé Avatar de Orhleil
    Homme Profil pro
    Intégrateur fonctionnel
    Inscrit en
    Mai 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Intégrateur fonctionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 81
    Par défaut
    Salut à toi,
    Je te conseille de bien déclarer les types de tes variables ainsi que ce que renvoie ta fonction.
    Je ne sais pas ce que contiennent tes cellules mais je suppose que ce sont des nombres, donc par précaution j'utiliserais CInt (ou CLng) pour m'assurer que VBA les considère bien comme tel. Comme tu n'as pas déclaré resultat, il pourrait aussi s'agir d'un String, et dans ce cas le + serait interprété comme un caractère de concaténation. A mon avis comme tu n'utilises pas la variable compteur, tu as inversé compteur et resultat dans la déclaration.
    Je ne suis pas certain que le problème vienne de là, mais ton code sera moins ouvert aux erreurs :
    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
    Dim Plage As Range
     
    Function TotalRefacturable(Plage As String) As Integer
        Dim resultat As Integer, cellule As Range
     
        resultat = 0
     
        For Each cellule In Range(Plage)
     
            Select Case cellule.Offset(0, 1).Value
            Case "Y"
                resultat = resultat + CInt(cellule.Value)
     
            Case "N"
                'Test
            Case Else
                'Test
            End Select
        Next
     
        TotalRefacturable = resultat
     
    End Function
     
     
    Sub test()
    MsgBox (TotalRefacturable("C9:C17"))
    End Sub
    Cela t'aide-t-il ?

Discussions similaires

  1. [MySQL] Problème création fonction Upload
    Par eclectique_95470 dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 10/03/2012, 21h01
  2. problème création rapport excel avec apache poi
    Par jakcam dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 07/10/2009, 14h07
  3. Réponses: 2
    Dernier message: 13/03/2007, 15h35
  4. Création en C# de Fonctions Excell
    Par Smogling dans le forum C#
    Réponses: 1
    Dernier message: 09/01/2007, 14h27
  5. Réponses: 5
    Dernier message: 30/03/2006, 14h52

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