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 :

[VBA]Fonction personnalisée avec "If"


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 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 3
    Par défaut [VBA]Fonction personnalisée avec "If"
    Bonjour à tous,

    Je travaille actuellement sur un tableau de bord comptable, dans lequel je dois mensualiser des charges d'amortissement.
    Pour ceux qui ne connaissent pas, pas de panique, dans la pratique, je cherche juste à comparer des dates et en fonction du résultat, de me faire un calcul.
    Avec les SI imbriqués de base de Excel, je faisais une usine à gaz tellement y'avait de cellules et ça ne fonctionnait pas de toute façon.
    Je me suis donc orienté vers une formule personnalisée.

    En l'état, elle se présente comme ceci :
    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
     
    Function AmtMensuel(DebutExercice, FinExercice, DebutAmt, FinAmt, DebutMois, FinMois, VO, Plan, Jours, Coeff) As Single
     
    ' ==> CAS D'UN BIEN PRESENT A L'ACTIF PENDANT TOUT L'EXERCICE
    ' ==> La ligne suivante calcule l'amortissement si le bien est à amortir sur TOUT L'EXERCICE
    If DebutExercice = DebutAmt And FinAmt = FinExercice Then AmtMensuel = VO / Plan * (FinMois + 1 - DebutMois) / Jours * Coeff
     
    ' ====>> CAS DES ACQUISITIONS DANS L'EXERCICE <<====
    ' ==> La ligne suivante rend impossible l'amortissement d'un bien LES MOIS PRECEDANT AVANT SON ACQUISITION
    If DebutExercice < DebutAmt < FinExercice And DebutMois < FinMois < DebutAmt Then AmtMensuel = 0
     
    ' ==> La ligne suivante calcule l'amortissement d'un bien ACQUIS DANS LE MOIS
    If DebutExercice < DebutAmt < FinExercice And DebutMois < DebutAmt < FinMois Then AmtMensuel = VO / Plan * (FinMois + 1 - DebutAmt) / Jours * Coeff
     
    ' ==> La ligne suivante calcul l'amortissement d'un bien LES MOIS SUIVANT SA CESSION
    If DebutExercice < DebutAmt < FinExercice And DebutAmt < DebutMois < FinMois Then AmtMensuel = VO / Plan * (FinMois + 1 - DebutMois) / Jours * Coeff
     
    ' ====>> CAS DES CESSIONS/FINS D'AMORTISSEMENT DANS L'EXERCICE <<====
    ' ==> La ligne suivante calcul l'amortissement d'un bien LES MOIS PRECEDENT SA CESSION
    If DebutExercice < FinAmt < FinExercice And DebutMois < FinMois < FinAmt Then AmtMensuel = VO / Plan * (FinMois + 1 - DebutMois) / Jours * Coeff
     
    ' ==> La ligne suivante calcul l'amortissement d'un bien CEDE DANS LE MOIS
    If DebutExercice < FinAmt < FinExercice And DebutMois < FinAmt < FinMois Then AmtMensuel = VO / Plan * (FinAmt + 1 - DebutMois) / Jours * Coeff
     
    ' ==> La ligne suivante rend impossible l'amortissement d'un bien LES MOIS SUIVANT SA CESSION/FIN D'AMT
    If DebutExercice < FinAmt < FinExercice And FinAmt < DebutMois < FinMois Then AmtMensuel = 0
     
    End If
    End Function
    L'idée est simple :
    - j'ai une date de début et de fin d'exercice (01/01/08 au 31/12/08)
    - je peux avoir une date d'acquisition d'un bien (peut se situer avant le 01/01/08)
    - je peux avoir une date de cession d'un bien (peut se situer dans l'exercice)
    - je cherche à rapporter le calcul au mois, donc du 01/01/08 au 31/01/08...

    Les annotations avant chaque lignes de codes expliquent le calcul recherché...
    Seulement au final, ma fonction ne fonctionne pas !!
    Genre si le bien est acquis dans l'exercice, au 01/07/08 par exemple, la formule me calcule aussi l'amortissement avant l'acquisition, ce qui est incohérent.
    Je pense que c'est une erreur de syntaxe, mais mes cours de Excel remontant un peu, je suis paumé...
    Quelqu'un peut-il m'aider?
    Je peux développer si vous ne comprenez pas...

    Edit : si nécessaire, je peux joindre une page du Tableau de Bord en question avec la formule appliquée pour être explicite...

  2. #2
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 48
    Par défaut
    Mmmh je vois pas bien ton erreur mais j'ai 2 questions :

    1 - C'est impossible que t'aies un bien acquis ET cédé durant l'exercice ? Parce que dans ce cas là ca pose problème
    2 - Ca pose pas un problème aussi si le bien est acquis ou cédé à une date égale à DebutMois ou FinMois ?

    A part ca, je pense que ton programme gagnerait en lisibilité si tu utilisais des Else

  3. #3
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 3
    Par défaut
    Salut Magemax, merci d'avoir pris le temps de me lire.

    1. Effectivement, un bien peut être acquis et cédé dans un même exercice. Je ne l'ai pas pris en compte, parce que ça n'est pas arrivé jusque là, et qu'en rédigeant la formule, je le faisais possibilité par possiblité).
    Mais je vais l'intégrer, merci de le souligner.

    2. De la même manière, une date égale à un début ou fin de mois est possible, mais pareil, j'ai fait du pas-à-pas... Ca sous-entend donc de placer des >= ou <= à quelques endroits...

    Ok pour les Else pour la lisibilité, mais je ne me souviens plus de la syntaxe...
    J'ai tenté par des ElseIf, des Else: If mais j'avoue que je me souviens plus bien... Et pourtant mes cours remontent à pas plus tard qu'il y a 3 ou 4 mois...

    J'ai annexé la feuille de calculs où est appliquée la formule...
    Comme tu peux le constater, j'ai des 0 partout... Alors que je devrais avoir des résultats !!
    Fichiers attachés Fichiers attachés

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut FWSMulder et le forum
    J'ai une formule, mais le résultat que je cherche n'est pas bon, alors, avec une baguette magique et une boule de cristal donnez moi le bon résultat
    Je pense que c'est une erreur de syntaxe, mais mes cours de Excel remontant un peu, je suis paumé...
    Quelqu'un peut-il m'aider?
    Je peux développer si vous ne comprenez pas...
    Je pense que t'es à côté de la plaque : si c'était une erreur de syntaxe, Excel le signalerait.
    Mais peut-être que c'est une erreur de raisonnement ?
    Mais n'étant pas comptable, je ne peut rien vérifier réellement, à moins d'avoir des données, la méthode et le résultat à atteindre!!!

    À tout hazard : si tes If ne s'excluent pas mutuellement, le dernier étant Vrai donnera le résultat, quelque soit les précédents Vrai qui aient trituré la valeur.

    If DebutExercice < FinAmt < FinExercice and ... => faux : Excel ne comprend pas les mélanges d'instruction comme toi

    if A < B < C then => ça revient à écrire
    if (A < B) < C then comme (A < B) est un test logique, la réponse d'excel ne peut être que Tue (-1) ou False (0) Donc, ça revient à comparer une date, c'est-à-dire le nombre de jour ecoulé depuis le 01/01/1900 à la date. Donc, sauf si ta date est égale à 1/1/1900, toujours vrai, quelque soit tes dates.=> donc c'est le dernier If qui gagne !

    Si à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If DebutExercice < FinAmt < FinExercice and ...
    tu avais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If ((DebutExercice < FinAmt) and (FinAmt < FinExercice)) and
    Ton test vérifierait qu'effectivement, FinAmt est bien comprise entre les 2 bornes DebutExercice et FinExercice.
    mais ça, c'est pas une erreur de syntaxe, mais de compréhension d'Excel et de manque d'huile de coude . Je mets des parenthèse, parce que j'ai la flemme de contrôler les ordres de priorités des opérateurs (mais ici, on s'en fout) et que ça rend plus lisibles mes formules.

    Donc, tu peux déjà t'amuser à rendre cohérentes toutes tes formules
    d'ailleurs :
    FinAmt < DebutMois < FinMois
    DebutMois < FinMois < FinAmt
    il me semble que ça coule de source, non ?
    A+

    EDIT : je viens de voir ton fichier, mais pas envie de tout recommencer, comme en plus je ne sais absolument pas quels résultats attendre...
    Petit précision : à la première ligne colle, ça évitera de revenir.
    Et si t'avais donné le fichier avant...

  5. #5
    Candidat au Club
    Inscrit en
    Août 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 3
    Par défaut
    Nom de **** !!!!
    Effectivement, c'était bien ça !!!
    Je pensais que Excel comprenais les ordres de grandeurs imbriqués (comme moi, comme tu le soulignes...). Bah nan, effectivement.
    Une première modif en prenant en compte ta remarque me semble efficace, faut juste que je vérifie les résultat. Mais à première vue, j'avais calculé au préalable les résultats à obtenir et ça me semble cohérent, c'est nickel.
    Grand merci à toi Gorfael.

    Juste à prendre en compte les deux remarques de Magemax et ça sera bon.

    Je vérifie mes résultats demain et je confirme si le problème est résolu.

    Parenthèse : pour Application.Volatile (j'ai bien compris que ça modifiat le résultat dès que la fonction perso était modifiée), je le mets avant toutes mes lignes de commandes et ça suffit ? Parce que j'ai du revalider la formule pour que ça fonctionne, mais je pense que c'est pour prendre en compte une première fois Application.Volatile et après il gère tout seul...

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut FWSMulder et le forum
    hè oui! À force de voir ce que peut faire Excel, on en oublie qu'il est bête comme... un logiciel
    Function Macro(...)
    application.volatile
    ... le reste de ton code
    end function
    Volatile va obliger Excel à recalculer la function à chaque fois qu'il calcule la feuille.. Si tu ne le mets pas, tu peux avoir des erreurs
    A+

Discussions similaires

  1. Création des fonctions personnalisées avec mysql
    Par mutkas10 dans le forum Débuter
    Réponses: 3
    Dernier message: 24/06/2009, 18h41
  2. Réponses: 2
    Dernier message: 15/05/2008, 23h26

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