Affecter une note grâce à une inputbox - Excel VBA

Résolu
Naririne Messages postés 106 Statut Membre -  
Naririne Messages postés 106 Statut Membre -
Bonjour !

Pourriez-vous m'aider s'il vous plait ?

J'ai une liste d'étudiants (A1:A21) qui ont des notes chacun (B1:B21) ainsi que des appréciations (C1:C21). Deux problèmes :

- Il peut arriver qu'un étudiant n'ait pas de note.
- Il se peut qu'un étudiant ait une note de 150 ou autre (faute de frappe, la note doit être comprise entre 0 et 20)

Comment demander à l'utilisateur grâce à une InputBox de saisir une note quand la cellule est vide ? Et de saisir une note valide le cas échéant ?

Ci dessous le code que j'ai :
(Pour le moment, je n'ai qu'une MsgBox pour dire de saisir une note valide)

Sub macro_appreciations

Dim i As Long
Dim note As Integer
Dim app As String
Dim cel As Range

nbeleves = Range("A1048576").End(xlUp).Row - 1

For i = 1 To nbeleves
note = Range("A1").Offset(i, 1).Value

    If note = 0 Then
            app = "Nul"
        ElseIf note >= 1 And note <= 5 Then
            app = "Très Insuffisant"
        ElseIf note >= 6 And note <= 9 Then
            app = "Insuffisant"
        ElseIf note >= 10 And note <= 15 Then
            app = "Bien"
        ElseIf note >= 16 And note <= 19 Then
            app = "Très Bien"
        ElseIf note = 20 Then
            app = "Excellent"
        Else
        MsgBox "Saisir une note valide"
        
    End If
Range("A1").Offset(i, 2) = app

Next i

End Sub


Merci d'avance pour votre aide !!

Peace !

8 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour,

    Tu peux résoudre ton problème sans utiliser VBA !

    une validation de données type liste avec tes notes de 0 à20 ce qui empêche des saisies farfelues
    un tableau annexe facile à modifier avec en colonnes les seuils 0,5 etc. et à coté l'appréciation...
    une RECHERCHEV dans la colonne C.

    toujours penser excel avant de penser VBA ! ;o)
    2
  2. ThauTheme Messages postés 1564 Statut Membre 160
     
    Bonjour le fil, bonjour le forum,

    Une proposition VBA :

    Sub macro_appreciations()
    Dim NE As Integer 'déclare la variable NE (Nombre d'Élèves)
    Dim I As Integer 'déclare la variable I (Incrément)
    Dim TC As Variant 'déclare la variable TC (Tableau de cellules)
    Dim BN As Variant 'déclare la variable BN (Boîte Note)
    Dim note As Integer 'déclare la variable note

    NE = Cells(Application.Rows.Count, 1).End(xlUp).Row - 1 'définit le nombre d'élèves (pourquoi -1 ?)
    TC = Range("A1:C" & NE) 'définit le tableau de cellules TC
    For I = 2 To UBound(TC, 1) 'boucle sur toutes les ligne du tableau TC (en partant de la seconde)
    'condition 1 : si la valeur en colonne 1 de la ligne est vide ou si elle est inférieure à 0 ou supérieure à 20
    If TC(I, 2) = "" Or TC(I, 2) < 0 Or TC(I, 2) > 20 Then
    Cells(I, 2).Interior.ColorIndex = 3 'colore la cellule de rouge
    NV: 'étiquette (Non Valide)
    BN = Application.InputBox("Veuillez saisir une note valide !", Type:=1) 'déffinit la boîte d'entrée BN
    If BN = False Then 'condition 2 : si bouton "Annuler" dans la boîte d'entrée BE
    'si "Non" au message retourne à la boîte d'entrée (via l'étiquette NV), si "Oui" au message passe à la note suivante (via l'étiquette "suite")
    If MsgBox("L'élève " & Cells(I, 1).Value & " n'est pas noté ! Voulez-vous continuer ?", vbYesNo, "ATTENTION") = vbNo Then GoTo NV Else GoTo suite
    End If 'fin de la condition 2
    If BN < 0 Or BN > 20 Then MsgBox "Note non valide !": GoTo NV 'condition 3 : si la note n'est pas valide, retoure à la boîte d'entrée (via l'étiquette "NV")
    Cells(I, 2).Value = BN 'place la note dans la cellule
    Cells(I, 2).Interior.ColorIndex = xlNone 'supprime la couleur rouge de la cellule
    End If 'fin de la condition 3
    note = Cells(I, 2).Value 'définit la variable note
    Select Case note 'action en fonction de la note
    Case 0 'cas zéro
    Cells(I, 3).Value = "Nul" 'appréciation dans la cellule en colonne 3
    Case 1 To 5 'de 1 a 5
    Cells(I, 3).Value = "Très Insuffisant" 'appréciation dans la cellule en colonne 3
    Case 6 To 9 'de 6 à 9
    Cells(I, 3).Value = "Insuffisant" 'appréciation dans la cellule en colonne 3
    Case 10 To 15 'de 10 à 15
    Cells(I, 3).Value = "Bien" 'appréciation dans la cellule en colonne 3
    Case 16 To 19 'de 19 à 19
    Cells(I, 3).Value = "Très Bien" 'appréciation dans la cellule en colonne 3
    Case 20 'cas 20
    Cells(I, 3).Value = "Excellent" 'appréciation dans la cellule en colonne 3
    End Select 'fin de l'action en fonction de la note
    suite: 'étiquette
    Next I 'prochaine ligne du tableau TC
    End Sub

    1
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    en attendant

    Nota pour ton prof : les goto sont autorisés et utilisés dans la gestion des erreurs

    Option Explicit
    '----
    Sub macro_appreciations()
    Dim nbeleves As Byte
    Dim i As Byte
    Dim note As Single
    
    nbeleves = Range("A1048576").End(xlUp).Row
    
    For i = 1 To nbeleves
            On Error GoTo erreur
    1:    note = InputBox(prompt:="note de " & Cells(i, "A") & " ? ")
          Select Case note
            Case Is = 0
                Cells(i, "C") = "nul"
            Case Is <= 5
                Cells(i, "C") = "très insuffisant"
            Case Is <= 9
                Cells(i, "C") = "insuffisant"
            Case Is <= 15
                Cells(i, "C") = "bien"
            Case Is <= 19
                Cells(i, "C") = "très bien"
            Case Is <= 20
                Cells(i, "C") = "excellent"
            Case Else
                MsgBox "saisir une note entre 0 et 20", vbCritical
                GoTo 1
            End Select
            Cells(i,"B")=note
    Next i
    Exit Sub
    
    erreur:
        MsgBox "saisie d'un texte non valable", vbCritical
        Resume 1
    End Sub
    


    Michel
    1
    1. ThauTheme Messages postés 1564 Statut Membre 160
       
      Bonjour Michel,

      Comment faites-vous pour afficher le code tel que vous le faites ?
      0
    2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut,

      Tu as, à côté de la balise code <> une liste de choix te permettant de choisir ton langage de programmation. Sélectionne Basic.
      Les balises sont :
      <code basic></code>

      Le mode d'emploi (au cas ou) est ICI.

      Cordialement,
      Pijaku
      0
    3. ThauTheme Messages postés 1564 Statut Membre 160
       
      Merci Pijaku !
      0
  4. Naririne Messages postés 106 Statut Membre 12
     
    Bonjour Michel_M
    Merci d'avoir répondu à mes questions !

    Oui on peut le résoudre facilement par Excel, je l'ai déjà fait :)

    Mais dans le cadre d'un cours à la fac, on nous demande de passer par du VBA pour résoudre ce problème. La plus grosse partie du code est faite. Il ne me reste plus qu'à travailler sur les petits pièges. Et c'est là où je patine :(

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    RE, le prof notr t(il qu'avec des chiffres rond (6,7 ...) ou possibilité de 5,5 ou 8,75....?
    0
  7. Naririne Messages postés 106 Statut Membre 12
     
    Toutes les possibilités sont les bienvenues :)
    Merci

    Peace !
    0
  8. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour tout le monde,

    J'arrive après la guerre donc c'est beaucoup plus simple...

    Une solution, honteusement pompée sur celle de Michel ;-), par fonction avec des tests complémentaires (séparateur décimal et boucle tant que note incorrecte) :
    Option Explicit
    '----
    Sub macro_appreciations()
    Dim nbeleves As Byte
    Dim i As Byte
    Dim Note As Single
    Dim Quoi As String, Par As String
    
    Par = Application.International(xlDecimalSeparator)
    Quoi = IIf(Par = ",", ".", ",")
    nbeleves = Range("A1048576").End(xlUp).Row
    
    For i = 1 To nbeleves
        Do
          Note = Replace(InputBox(prompt:="note de " & Cells(i, "A") & " ? "), Quoi, Par)
          If Note < 0 Or Note > 20 Then MsgBox "saisir une note entre 0 et 20", vbCritical
        Loop While Note < 0 Or Note > 20
        Cells(i, "B") = Note
        Cells(i, "C") = Appreciation(Note)
    Next i
    End Sub
    
    Function Appreciation(sgNote As Single) As String
          Select Case sgNote
            Case Is = 0
                Appreciation = "nul"
            Case Is <= 5
                Appreciation = "très insuffisant"
            Case Is <= 9
                Appreciation = "insuffisant"
            Case Is <= 15
                Appreciation = "bien"
            Case Is <= 19
                Appreciation = "très bien"
            Case Is <= 20
                Appreciation = "excellent"
            Case Else
                Appreciation = "Erreur inconnue"
            End Select
    End Function


    ps : salut Michel, comment va?

    🎼 Cordialement,
    Franck 🎶
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour Frank

      comment va?

      bof! pas terrible...
      0
  9. Naririne Messages postés 106 Statut Membre 12
     
    Salut tout le monde !

    Merci beaucoup pour vos réponses !!
    J'ai essayé vos codes, en plus d'être juste ce que je voulais, ils m'ont permis d'apprendre des choses en VBA !

    Merci encore !
    0