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 :

Fonction Macro VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut Fonction Macro VBA
    Bonjour,

    La fonction suivante me renvoie #Valeur! et je voudrais si possible connaitre la cause.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    Function calcul_TAT(f As Integer)
    Dim r As Long, C As Long, J As Long
     
     
    r = Cells(f, 3).Value
     
    C = 0
    J = 0
    i = f
     
     
     
    If Not IsEmpty(Cells(i - 1, 4)) Then
     
         If IsNumeric((Cells(i - 1, 4))) Then
     
     
               Do Until C + Cells(i, 4).Value >= r
               C = C + Cells(i, 4): Cells(f, 14) = C
               i = i - 1
               J = J + 1
     
               If Not IsNumeric(Cells(i, 4)) Then
     
               Exit Do
               End If
     
               If IsEmpty(Cells(i, 4)) Then
     
               Exit Do
               End If
     
     
               Loop
     
     
               'Cells(f, 18) = J
               X = f - J
               'Cells(f, 19) = X
     
                   If Not IsEmpty(Cells(X, 4)) Then
                        If IsNumeric(Cells(X, 4)) Then
                           Cells(f, 15).Value = Cells(f, 14).Value + Cells(X, 4).Value
                        Else
                           MsgBox "Données historiques insuffisantes", vbExclamation, "Attention"
                           Cells(f, 15) = Cells(f, 14) * (J + 1) / J
                           Cells(f, 12).Interior.Color = RGB(255, 165, 0)
                        End If
                   Else
     
                      MsgBox "Données historiques insuffisantes", vbExclamation, "Attention"
                      Cells(f, 15) = Cells(f, 14) * (J + 1) / J
                      Cells(f, 12).Interior.Color = RGB(255, 165, 0)
                   End If
     
               Cells(f, 14).EntireColumn.Hidden = True
               Cells(f, 15).EntireColumn.Hidden = True
               Cells(f, 16) = Cells(f, 3) / (Cells(f, 15) / (J + 1))
               Cells(f, 16).EntireColumn.Hidden = True
     
     
               Cells(f, 12) = Cells(f, 16)
     
          Else
     
               MsgBox "Données historiques insuffisantes", vbExclamation, "Attention"
     
               Cells(f, 12).Interior.Color = RGB(255, 165, 0)
               Cells(f, 12) = Cells(f, 3) / Cells(f, 4)
          End If
     
    Else
     
        MsgBox "Données historiques insuffisantes", vbExclamation, "Attention"
        Cells(f, 12).Interior.Color = RGB(255, 165, 0)
        Cells(f, 12) = Cells(f, 3) / Cells(f, 4)
     
    End If
     
     
    calcul_TAT = Cells(f, 12)
     
    End Function

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    à la simple lecture de ton code, tu utilises une fonction pour manipuler des cellules (valeurs et formats).

    Or, une fonction sert à retourner "quelque chose" (valeur, objet etc...).

    Si tu testes ta fonction en pas à pas, je te parie qu'elle s'arrête dès la ligne 43 ou 75 (suivant dans quelle partie des tes If la fonction va atterrir) pour afficher #Valeur dans la cellule appelante.


    il te faut plutôt créer une procédure

  3. #3
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Merci pour ta réponse.

    En effet à la base j'avais fait une procédure qui me convenait très bien.

    Mais mon besoin maintenant est d'avoir plutôt une fonction qui a le même but.

  4. #4
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Une fonction, ne peut pas modifier un mise en forme. Tu dois "sortir" ta ligne 75 de la fonction.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    Ta fonction n'est ni plus ni moins une Sub que tu as renommé en Function. Il te faut passer les arguments à ta fonction comme par exemple des "Range" ou leurs valeurs. Les contrôles type "IsEmpty()", "IsNumeric()" doivent se faire avant l'appel de la fonction afin d'être sûr de passer des arguments qui ne risques pas de créer des erreurs.
    Ici, tu commence la boucle par une opération et ensuite tu contrôle si la cellule contient une valeur numérique ou si elle contient quelque chose :
    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
     
    Do Until C + Cells(i, 4).Value >= r '<-- opération
     
    '    C = C + Cells(i, 4): Cells(f, 14) = C
    '    i = i - 1
    '    J = J + 1
     
        If Not IsNumeric(Cells(i, 4)) Then '?? <-- c'est un peu tard !
     
    '        Exit Do
    '
    '    End If
     
        If IsEmpty(Cells(i, 4)) Then '?? <-- et ici, aussi !
     
    '        Exit Do
    '
    '    End If
     
    Loop
    Comme Clément et Joe te l'ont justement dit, une fonction est là pour retourner une valeur ou un tableau de valeurs. A la limite, la seule partie qui pourrait se trouver dans une fonction c'est la boucle qui pourrait te retourner la valeur à la fin

  6. #6
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    J'ai mis le exit do pour sortir de la boucle si la cellule qui précède est vide ou n'est pas numérique. D'où le i = i - 1 juste avant.
    Si tu peux m'expliquer davantage ton interpellation pour que je puisse comprendre.

    Sinon je voudrais savoir si d'après vous en vu du code proposé, pourrait-t-il être adapté en fonction ou devrais-je toujours passer par une procédure?

Discussions similaires

  1. [XL-2007] Macro VBA - envoi email via Outlook en fonction d'une date / échéance
    Par Flo18goldengirl dans le forum Excel
    Réponses: 2
    Dernier message: 27/08/2014, 17h24
  2. Réponses: 1
    Dernier message: 21/08/2014, 13h39
  3. Réponses: 7
    Dernier message: 11/08/2012, 17h49
  4. [XL-2007] macro VBA en fonction d'une date
    Par clempy49 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/06/2012, 14h08
  5. [XL-2003] Macro VBA - fonction "Cells.Select"
    Par hunteshiva dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/09/2011, 10h31

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