Somme de coefficient égale à 100

Bonjour

Je suis actuellement en formation contrôle de gestion,

Nous avons donc commencé le VBA, et pour progresser, je fais des exercices moi-même.

Mais je bloque complétement sur celui-ci:

Exercice 6
Veuillez réaliser un programme demandant à l’utilisateur de rentrer la valeur numérique de 4 coefficients (entiers) dont la somme doit être égale à 100, la saisie devant se faire via des boites de dialogue. Lors de la saisie du 4ème coefficient, le programme propose automatiquement la valeur permettant à la somme des 4 coefficients d’arriver à la valeur 100. Ces coefficients sont mémorisés respectivement dans les cellules A2, B2, C2 et D2. Le programme vérifie en permanence que la somme des coefficients entrés n’excède pas 100. Si cette somme excède 100, le programme demande à l’utilisateur de recommencer, soit de rentrer les quatre coefficients.

Je ne sais pas comment faire pour vérifier qu'à chaque coefficient saisie je contrôle que la somme soit < 100 et sinon retourner à la première saisie...

Merci de votre aide

Bonjour Florian63 et

Merci de joindre le fichier que tu as déjà réalisé, normalement.

@+

Bonjour

voici mon code:

Sub co()

coef1 = InputBox("Sasir le 1er coefficient")
Cells(2, 1) = coef1

coef2 = InputBox("Sasir le 2ème coefficient")
Cells(2, 2) = coef2

coef3 = InputBox("Sasir le 3ème coefficient")
Cells(2, 3) = coef3

coef4 = InputBox("Sasir le 4ème coefficient", "4ème coefficient", 100 - coef1 - coef2 - coef3)
Cells(2, 4) = coef4

End Sub

Bonjour,

Voici un essai :

Sub Coeff()

dim i%
dim reponse as double, vdefaut as double, somme as double

for i = 1 to 4
    if i < 4 then vdefaut = "" else vdefaut = 100 - somme 'si i < 4, valeur par defaut est vide, sinon elle vaut 100 - somme des entrées
    reponse = inputbox("Entrez le coefficient n° " & i, "Saisie des coefficients", vdefaut) 'renvoie de la saisie (avec vdefaut dans inputbox)
    if not isnumeric(reponse) or reponse <=0 or reponse >= 100 then 'si mauvaise saisie, sortie
        msgbox "saisie incorrecte, veuillez réessayer", vbcritical
        exit sub
    end if
    cells(2, i).value = reponse 'valeur reprise en cellule A2 à D2
    somme = somme + reponse 'actualisation de la somme (vaut 0 à la 1e itération)
    if i < 4 then 'si i < 4
        if somme >= 100 then 'si somme >= 100, sortie (adapter si coeff peut valoir 0) et contenus effacés
            msgbox "Dépassement du plafond", vbcritical
            range("A2:C2").clearcontents
            exit sub
        end if
    else
        if somme <> 100 then 'sinon, si i = 4, si somme differente de 100, sortie et contenus effacés
            msgbox "Dépassement du plafond", vbcritical
            range("A2:D2").clearcontents
            exit sub
        end if
    end if  
next i

Msgbox "Coefficients archivés en ligne 2" 'si boucle réalisée sans sortie, message confirmation

end sub

Cdlt,

Et un second essai s'il faut continuer jusqu'à obtenir une somme à 100 :

Sub Coeff()

dim i%
dim reponse as double, vdefaut as double, somme as double

while somme <> 100
    if i > 0 then 'si i > 0, cad si ce n'est pas la 1ere tentative
        somme = 0 'reinitialisation somme
        range("A2:D2").clearcontents 'contenus effacés
        if not msgbox("Réessayer ?", vbyesno) = vbyes then exit sub 'demande si on continue, si oui, reprise, sinon, sortie
    end if
    for i = 1 to 4
        if i < 4 then vdefaut = "" else vdefaut = 100 - somme 'si i < 4, valeur par defaut est vide, sinon elle vaut 100 - somme des entrées
        reponse = inputbox("Entrez le coefficient n° " & i, "Saisie des coefficients", vdefaut) 'renvoie de la saisie (avec vdefaut dans inputbox)
        if not isnumeric(reponse) or reponse <=0 or reponse >= 100 then 'si mauvaise saisie, sortie
            msgbox "saisie incorrecte, veuillez réessayer", vbcritical
            exit for
        end if
        cells(2, i).value = reponse 'valeur reprise en cellule A2 à D2
        somme = somme + reponse 'actualisation de la somme (vaut 0 à la 1e itération)
        if i < 4 then 'si i < 4
            if somme >= 100 then 'si somme >= 100, sortie (adapter si coeff peut valoir 0) et contenus effacés
                msgbox "Dépassement du plafond", vbcritical
                exit for
            end if
        else
            if somme <> 100 then 'sinon, si i = 4, si somme differente de 100, sortie et contenus effacés
                msgbox "Dépassement du plafond", vbcritical
                exit for
            end if
        end if  
    next i
wend

Msgbox "Coefficients archivés en ligne 2" 'si boucle réalisée sans sortie, message confirmation

end sub

Cdlt,

Bonjour le fil,

Une autre solution avec saisie obligatoire de chiffre

Sub co()
  Dim Ind As Integer
  Dim Coef(4) As Single, Calcul As Single, Reste As Single
  Dim FlgOk As Boolean  ' Flag d'erreur de saisie

SaisieCoef:
  Calcul = 0: Reste = 0
  ' Demander la saisie des 4 coefficients
  For Ind = 1 To 4
    ' Si saisie du 4ème coef, donner le reste par défaut
    If Ind = 4 Then Reste = 100 - Calcul
    ' Demander la saisie
    Coef(Ind) = Application.InputBox("Merci de saisir le " & Ind _
      & IIf(Ind = 1, "er", "ème") & " coefficient", _
      Title:="Saisie totale = " & Calcul & "/100", _
      Default:=Reste, Type:=1)
    ' Calculer le total
    Calcul = Calcul + Coef(Ind)
    ' Vérifier la saisie
    If Calcul > 100 Then
      MsgBox "Saisie impossible, le total dépasse les 100%", vbCritical, "OUPS..."
      FlgOk = False: Exit For
    Else
      ' C'est ok, on enregistre la valeur
      Cells(2, Ind) = Coef(Ind)
      FlgOk = True
    End If
  Next Ind
  ' Vérifier le flag de saisie
  If FlgOk = False Then GoTo SaisieCoef
  ' Sinon c'est fini
  MsgBox "Merci pour votre saisie", vbInformation, "C'EST FINI"
End Sub

@+

Bonjour

Merci pour votre aide

@3GB

j'ai une erreur d'incompatibilité de type dès cette ligne:

If i < 4 Then vdefaut = "" Else vdefaut = 100 - somme 'si i < 4, valeur par defaut est vide, sinon elle vaut 100 - somme des entrées
reponse = InputBox("Entrez le coefficient n° " & i, "Saisie des coefficients", vdefaut) 'renvoie de la saisie (avec vdefaut dans inputbox)

@BrunoM45

ça fonctionne mais si mon total est <100 ça ne redemande pas de saisir, car le total doit être égal à 100.

Merci

@3GB en fait le problème venait de:

If i < 4 Then vdefaut = ""

il fallait mettre If i < 4 Then vdefaut = 0

par contre comment le faire recommencer si on est pas égal à 100 ??

merci beaucoup

Oui, en effet, l'erreur vient de là.

J'ai adapté mon code en m'inspirant de celui de Bruno (notamment pour contraindre le type, merci !) :

Sub Coeff()

dim i%
dim reponse as double, vdefaut as double, somme as double

while somme <> 100
    if i > 0 then 'si i > 0, cad si ce n'est pas la 1ere tentative
        somme = 0 'reinitialisation somme
        range("A2:D2").clearcontents 'contenus effacés
        if not msgbox("Réessayer ?", vbyesno) = vbyes then exit sub 'demande si on continue, si oui, reprise, sinon, sortie
    end if
    for i = 1 to 4
        if i < 4 then vdefaut = 0 else vdefaut = 100 - somme 'si i < 4, valeur par defaut est vide, sinon elle vaut 100 - somme des entrées
        reponse = inputbox("Entrez le coefficient n° " & i, "Saisie des coefficients", vdefaut,,,,,1) 'renvoie de la saisie (avec vdefaut dans inputbox)
        if reponse <=0 or reponse >= 100 then 'si mauvaise saisie, sortie
            msgbox "saisie incorrecte, veuillez réessayer", vbcritical
            exit for
        end if
        cells(2, i).value = reponse 'valeur reprise en cellule A2 à D2
        somme = somme + reponse 'actualisation de la somme (vaut 0 à la 1e itération)
        if i < 4 then 'si i < 4
            if somme >= 100 then 'si somme >= 100, sortie (adapter si coeff peut valoir 0) et contenus effacés
                msgbox "Dépassement du plafond", vbcritical
                exit for
            end if
        else
            if somme <> 100 then 'sinon, si i = 4, si somme differente de 100, sortie et contenus effacés
                msgbox "La somme des coefficients ne vaut pas 100", vbcritical
                exit for
            end if
        end if  
    next i
wend

Msgbox "Coefficients archivés en ligne 2" 'si boucle réalisée sans sortie, message confirmation

end sub

Ce n'est pas testé mais a priori il recommence lorsque la somme est différente de 100.

Cdlt,

Bonjour à tous, merci pour votre aide, j'ai avancé sur mon code, il fonctionne bien pour la sommes différente de 100,

Cependant j'ai toujours 2 problèmes:

1-La valeur saisie n'est pas un nombre, je pensé qu'avec ça cela fonctionnait mais ce n'est pas le cas:

reponse = InputBox("Entrez le coefficient n° " & i, "Saisie des coefficients", vdefaut) 'renvoie de la saisie (avec vdefaut dans inputbox)
If IsNumeric(reponse) = False Or reponse <= 0 Or reponse >= 100 Then 'si mauvaise saisie, sortie

ça me marque erreur d'execution 13

2- ainsi que si je saisi pas un entier mais 13,5 par exemple, on devrait devoir ressaisir puisque ce n'est pas un entier.

Merci de votre aide.

Voici tout mon code

Sub Coeff()

Dim i As Integer

Dim reponse As Double, vdefaut As Double, somme As Double

SaisieCoef:
somme = 0
For i = 1 To 4
    If i < 4 Then vdefaut = 0 Else vdefaut = 100 - somme 'si i < 4, valeur par defaut est vide, sinon elle vaut 100 - somme des entrées
    reponse = InputBox("Entrez le coefficient n° " & i, "Saisie des coefficients", vdefaut) 'renvoie de la saisie (avec vdefaut dans inputbox)
    If IsNumeric(reponse) = False Or reponse <= 0 Or reponse >= 100 Then    'si mauvaise saisie, sortie
        MsgBox "saisie incorrecte, veuillez réessayer", vbCritical
        GoTo SaisieCoef
    End If
    Cells(2, i).Value = reponse 'valeur reprise en cellule A2 à D2
    somme = somme + reponse 'actualisation de la somme (vaut 0 à la 1e itération)
    If i < 4 Then 'si i < 4
        If somme >= 100 Then 'si somme >= 100, sortie (adapter si coeff peut valoir 0) et contenus effacés
            MsgBox "Dépassement du plafond", vbCritical
            GoTo SaisieCoef
        End If
    Else
        If somme > 100 Then 'sinon, si i = 4, si somme supérieur à 100, sortie et contenus effacés
            MsgBox "Dépassement du plafond", vbCritical
            Range("A2:D2").ClearContents
            GoTo SaisieCoef
                ElseIf somme < 100 Then 'sinon, si i = 4, si somme infèrieur à 100, sortie et contenus effacés
                    MsgBox "Total infèrieur à 100", vbCritical
                    Range("A2:D2").ClearContents
            GoTo SaisieCoef
        End If
    End If

Next i

MsgBox "Coefficients archivés en ligne 2" 'si boucle réalisée sans sortie, message confirmation

End Sub

Bonjour,

Alors, code essayé et fonctionnel chez moi avec la contrainte cependant de n'avoir aucun coefficient nul. Ce détail est à voir...

L'erreur provient du fait qu'il y a une méthode inputbox et une fonction inputbox qui n'ont pas exactement les mêmes paramètres. Donc ma rectification calquée sur la proposition du Bruno était toujours bloquante. Voici le code :

Sub Coeff()

Dim i%
Dim reponse As Double, vdefaut As Double, somme As Double

While somme <> 100 Or i < 4
    If i > 0 Then 'si i > 0, cad si ce n'est pas la 1ere tentative
        somme = 0 'reinitialisation somme
        Range("A2:D2").ClearContents 'contenus effacés
        If Not MsgBox("Réessayer ?", vbYesNo) = vbYes Then Exit Sub 'demande si on continue, si oui, reprise, sinon, sortie
    End If
    For i = 1 To 4
        If i < 4 Then vdefaut = 0 Else vdefaut = 100 - somme 'si i < 4, valeur par defaut est vide, sinon elle vaut 100 - somme des entrées
        reponse = Application.InputBox("Entrez le coefficient n° " & i, "Saisie des coefficients", vdefaut, , , , , 1) 'renvoie de la saisie (avec vdefaut dans inputbox)
        If reponse <= 0 Or reponse >= 100 Then 'si mauvaise saisie, sortie
            MsgBox "saisie incorrecte, veuillez réessayer", vbCritical
            Exit For
        End If
        Cells(2, i).Value = reponse 'valeur reprise en cellule A2 à D2
        somme = somme + reponse 'actualisation de la somme (vaut 0 à la 1e itération)
        If i < 4 Then 'si i < 4
            If somme >= 100 Then 'si somme >= 100, sortie (adapter si coeff peut valoir 0) et contenus effacés
                MsgBox "Dépassement du plafond", vbCritical
                Exit For
            End If
        Else
            If somme <> 100 Then 'sinon, si i = 4, si somme differente de 100, sortie et contenus effacés
                MsgBox "La somme des coefficients ne vaut pas 100", vbCritical
                Exit For
            End If
        End If
    Next i
Wend

MsgBox "Coefficients archivés en ligne 2" 'si boucle réalisée sans sortie, message confirmation

End Sub

Cdlt,

Super merci, ça fonctionne super hormis qu'on puisse saisir un nombre avec virgule, qu'on ne doit pas pouvoir faire...

une idée?

J'ai pas compris ? Le but serait d'empêcher la saisie de nombre décimaux ?

Si c'est le cas, dernier (et je l'espère ultime) essai :

Sub Coeff()

Dim i%
Dim reponse, vdefaut As Integer, somme As Integer

'Range("A2:D2").ClearContents 'contenus effacés à chaque lancement

While somme <> 100 Or i < 4
    If i > 0 Then 'si i > 0, cad si ce n'est pas la 1ere tentative
        somme = 0 'reinitialisation somme
        Range("A2:D2").ClearContents 'contenus effacés
        If Not MsgBox("Réessayer ?", vbYesNo) = vbYes Then Exit Sub 'demande si on continue, si oui, reprise, sinon, sortie
    End If
    For i = 1 To 4
        If i < 4 Then vdefaut = 0 Else vdefaut = 100 - somme 'si i < 4, valeur par defaut est vide, sinon elle vaut 100 - somme des entrées
        reponse = Application.InputBox("Entrez le coefficient n° " & i, "Saisie des coefficients", vdefaut) 'renvoie de la saisie (avec vdefaut dans inputbox)
        if IsNumeric(reponse) then if reponse <> int(reponse) then reponse = -1 'si décimal, passer reponse en negatif (pour renvoyer erreur)
        If Not IsNumeric(reponse) Or reponse <= 0 Or reponse >= 100 Then 'si mauvaise saisie, sortie
            MsgBox "saisie incorrecte, veuillez réessayer", vbCritical
            Exit For
        End If
        Cells(2, i).Value = reponse 'valeur reprise en cellule A2 à D2
        somme = somme + reponse 'actualisation de la somme (vaut 0 à la 1e itération)
        If i < 4 Then 'si i < 4
            If somme >= 100 Then 'si somme >= 100, sortie (adapter si coeff peut valoir 0) et contenus effacés
                MsgBox "Dépassement du plafond", vbCritical
                Exit For
            End If
        Else
            If somme <> 100 Then 'sinon, si i = 4, si somme differente de 100, sortie et contenus effacés
                MsgBox "La somme des coefficients ne vaut pas 100", vbCritical
                Exit For
            End If
        End If
    Next i
Wend

MsgBox "Coefficients archivés en ligne 2" 'si boucle réalisée sans sortie, message confirmation

End Sub

Cdlt,

Bonjour

un nombre entier est un nombre sans virgule, on a pas le droit de saisir un coefficient qui vaut 10,5, et je ne trouve pas de test du style isInteger pour le contrôler.

Merci

Bonjour,

Avez-vous testé le code ?

A ma connaissance, il n'existe pas de fonction testant si le nombre est un entier. J'ai donc mis la ligne :

if IsNumeric(reponse) then if reponse <> int(reponse) then reponse = -1 'si décimal, passer reponse en negatif (pour renvoyer erreur)

Si la saisie est numérique, alors si la partie entière du nombre est différente du nombre, alors la variable reponse vaut -1 et conduira à sortir de la boucle à la condition suivante.

Cdlt,

Rechercher des sujets similaires à "somme coefficient egale 100"