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

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2021
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Création d'une fonction VBA pour calcul de primes
    Bonjour,
    Dans le cadre d'un projet j'aurai besoin de créer (en VBA) une macro me permettant de calculer automatiquement des primes en fonction de deux facteurs :
    - le nombre de semaine travaillé
    - le poste occupé.
    J'ai créé ma boucle me permettant de traiter chaque ligne et de voir si l'algo analyse correctement (msgbox....). Or, pour calculer, c'est plus compliqué, j'ai tenté de le faire avec des formules, en vain, et je ne connais pas assez la mise en forme pour trouver les problèmes.
    J'ai alors tenté avec cette technique, ça marche.. sauf que le résultat ne reste pas affiché. Il s'affiche puis s'efface dès que le prochain calcul s'effectue, et ainsi de suite. Chaque résultat vient remplacer le précédent sur l'ensemble de la colonne...
    Y a t'il quelqu'un pour me conseiller ou m'aider à résoudre ce problème ?
    Voici ma procédure :

    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
    Public Sub PrimePoste1()
    Range("F9").Select
    
    Do While ActiveCell <> ""
        If ActiveCell.Offset(0, 1) >= 5 Then
            If ActiveCell.Offset(0, -2) = "Grutier" Or ActiveCell.Offset(0, -2) = "Centralier" Then
                MsgBox "prime +250e"
                Range ("H9:H32").Value = Range ("G9") * Range ("G9") / Range ("G33") + 250
            Else
                MsgBox "prime"
                Range ("H9:H32").Value = Range ("G9") * Range ("G9") / Range ("G33")
            End If
    
        Else
            MsgBox "inférieur à 5"
            Range("H9:H32").Value = 0
        End If
    
        ActiveCell.Offset(1, 0).Activate
    
    Loop
    
    End Sub

    Merci d'avance pour vos réponses !

  2. #2
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    juillet 2016
    Messages
    2 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : juillet 2016
    Messages : 2 832
    Points : 4 928
    Points
    4 928
    Par défaut
    Bonjour,

    Voici une proposition d'après votre code, avec 3 procédés différents, les 3 solutions donnent bien le même résultat.
    -Une par macro
    -Une par fonction personnalisée
    -Une par formule
    RobiWavi_Création d'une fonction VBA pour calcul de primes.xlsm


    Le code pour la macro et la fonction personnalisée
    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
     
    Public Sub PrimePoste1()
        Dim i As Long
        Application.ScreenUpdating = False
        For i = 9 To 32
            If Cells(i, "F") <> "" Then
                If Cells(i, "G") >= 5 Then
                    If Cells(i, "D") = "Grutier" Or Cells(i, "D") = "Centralier" Then
                        Cells(i, "H") = Cells(i, "G") * Cells(i, "G") / Range("G33") + 250
                    Else
                        Cells(i, "H") = Cells(i, "G") * Cells(i, "G") / Range("G33")
                    End If
                Else
                    Cells(i, "H") = 0
                End If
            Else
                Cells(i, "H") = 0
            End If
        Next
    End Sub
     
    Function Prime_1(Poste As String, Nom As String, Sem As Long, Prime As Double) As Double
        If Nom <> "" Then
            If Sem >= 5 Then
                If Poste = "Grutier" Or Poste = "Centralier" Then
                    Prime_1 = Sem * Sem / Prime + 250
                Else
                    Prime_1 = Sem * Sem / Prime
                End If
            Else:
                Prime_1 = 0
            End If
        Else
            Prime_1 = 0
        End If
    End Function
    La formule Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI($G9>=5;SI(OU($D9={"Grutier";"Centralier"});$G9^2/$G$33+250;$G9^2/$G$33);0)
    La formule avec la fonction personnalisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =Prime_1($D9;$F9;$G9;$G$33)
    Cdlt

  3. #3
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    17 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : novembre 2003
    Messages : 17 148
    Points : 49 407
    Points
    49 407
    Billets dans le blog
    92
    Par défaut
    Saut.

    Perso, je travaillerais avec un tableau des métiers pour récupérer la prime éventuelle, histoire d'éviter d'utiliser des valeurs "hardcodées" dans ma formule (pour moi, un des 7 péchés capitaux d'Excel) (*)...

    Nom : 2021-04-07_111027.png
Affichages : 20
Taille : 8,5 Ko

    Bien sûr, cette formule doit s'intégrer dans la formule globale.


    (*) C'est au moins aussi vrai dans du code VBA. Le hardcoding (mettre des valeurs telles que "Grutier" ou 250 en dur dans le code), c'est vraiment une pratique à bannir.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/02/2019, 10h49
  2. [XL-2007] Création d'une fonction (VBA)
    Par BLACKEYED05 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/03/2015, 18h26
  3. Création d'une boucle VBA pour la fonction SOMME.SI
    Par choudoudou15 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 01/05/2009, 12h03
  4. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 14h28
  5. Réponses: 8
    Dernier message: 29/06/2006, 15h37

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