XL 2016 Débutant VBA, problème répétition d'une tâche

Ibeko

XLDnaute Nouveau
Bonsoir,

Je débute VBA et j'ai un petit soucis quant à une manipulation.

VB:
Sub Evaluation()

Dim score As Integer
Dim result As String

score = Range("C3").Value

    If score <= 14 Then
        result = "Inférieur à la moyenne"
        ElseIf score >= 15 Then
        result = "Supérieur ou égal à la moyenne"
        ElseIf score > 16 Then
        result = "Le meilleur"
    End If

Range("C11").Value = result
        

End Sub

Pour résumer, j'ai un tableau avec des notes qui s'étalent de la cellule C3 à C7, je souhaite y ajouter un commentaire selon les conditions If dans les cellules C11 à 15. J'ai bien réussi à exécuter la macro pour 1 cellule unique, mais j'ai du mal à voir comment répéter l'action pour les notes de C4 à C7.

Merci de votre aide.
 

Flown720

XLDnaute Nouveau
Salut, je me lance à te répondre si je peux aider

essaie ce code
VB:
Sub Evaluation()

Dim score As Integer
Dim result As String

i = 3 'ligne de départ des notes
j = 11 'ligne de départ des commentaires

Do While i <= 7  ' valeur de la ligne que tu veux t'arrêter
score = Range("C" & i).Value

    If score <= 14 Then
        result = "Inférieur à la moyenne"
        ElseIf score >= 15 Then
        result = "Supérieur ou égal à la moyenne"
        ElseIf score > 16 Then
        result = "Le meilleur"
    End If

Range("C" & j).Value = result
i = i + 1
j = j + 1

Loop

End Sub

Je suis preneur des critiques si c'est pas des mieux coder ;)
 

patricktoulon

XLDnaute Barbatruc
bonsoir
ça fonctionne parfaitement merci !

PAS DU TOUT !!!!
heu j'attire votre attention
le dessus
VB:
 ElseIf score >= 15 Then
        result = "Supérieur ou égal à la moyenne"
        ElseIf score > 16 Then
        result = "Le meilleur"

alors je n'ai pas tester mais pour moi ca va pas
par exemple 17 va donner "Supérieur ou égal à la moyenne"
et c'est tout a fait normal car il > 15


conclusion j'opterais pour un select case du plus grand au plus petit
Code:
select case true
case score>16: = result="Le meilleur"
case score>=15: result = "Supérieur ou égal à la moyenne"
case score<=14:result = "Inférieur à la moyenne"
end select
l'avantage du case c'est que des que la position est trouvé ben le code continu après le end select
il ne peut y avoir de méprise
conclusion
Code:
Sub Evaluation()

    Dim score As Integer
    Dim result As String

    i = 3    'ligne de départ des notes
    j = 11    'ligne de départ des commentaires

    Do While i <= 7  ' valeur de la ligne que tu veux t'arrêter
        score = Range("C" & i).Value

        Select Case True

        Case score > 16: result = "Le meilleur"

        Case score >= 15: result = "Supérieur ou égal à la moyenne"

        Case score <= 14: result = "Inférieur à la moyenne"

        End Select


        Range("C" & j).Value = result
        i = i + 1
        j = j + 1

    Loop

End Sub

la preuve que votre if elseif...end if ne fonctionne pas

Code:
sub test()

dim score&

score=17

If score <= 14 Then

        result = "Inférieur à la moyenne"

        ElseIf score >= 15 Then

        result = "Supérieur ou égal à la moyenne"

        ElseIf score > 16 Then

        result = "Le meilleur"

    End If

msgbox result

end if
 
Dernière édition:

Eric C

XLDnaute Barbatruc
Bonsoir le forum
Bonsoir Ibeko, Flown
Edit : Oupss : Bonsoir Patrick
Ou du genre avec Select Case
VB:
Sub Evaluation()
Dim score As Integer
Dim result As String

score = Range("C3").Value

Select Case score
    Case Is <= 14
          result = "Inférieur à la moyenne"
    Case 15 To 16
        result = "Supérieur ou égal à la moyenne"
    Case Is > 16
         result = "Le meilleur"
 
End Select
Range("C11").Value = result
End Sub
@+ Eric c
 

Ibeko

XLDnaute Nouveau
bonsoir


PAS DU TOUT !!!!
heu j'attire votre attention
le dessus
VB:
 ElseIf score >= 15 Then
        result = "Supérieur ou égal à la moyenne"
        ElseIf score > 16 Then
        result = "Le meilleur"

alors je n'ai pas tester mais pour moi ca va pas
par exemple 17 va donner "Supérieur ou égal à la moyenne"
et c'est tout a fait normal car il > 15


conclusion j'opterais pour un select case du plus grand au plus petit
Code:
select case true
case score>16: = result="Le meilleur"
case score>=15: result = "Supérieur ou égal à la moyenne"
case score<=14:result = "Inférieur à la moyenne"
end select
l'avantage du case c'est que des que la position est trouvé ben le code continu après le end select
il ne peut y avoir de méprise
conclusion
Code:
Sub Evaluation()

    Dim score As Integer
    Dim result As String

    i = 3    'ligne de départ des notes
    j = 11    'ligne de départ des commentaires

    Do While i <= 7  ' valeur de la ligne que tu veux t'arrêter
        score = Range("C" & i).Value

        Select Case True

        Case score > 16: result = "Le meilleur"

        Case score >= 15: result = "Supérieur ou égal à la moyenne"

        Case score <= 14: result = "Inférieur à la moyenne"

        End Select


        Range("C" & j).Value = result
        i = i + 1
        j = j + 1

    Loop

End Sub

J'avais effectivement repéré le souci du plus grand/plus petit et corrigé cela.

Pour ce qui est du case si vous dites que c'est plus intéressant, je vais me tourner là dessus. Merci à vous.
 

patricktoulon

XLDnaute Barbatruc
les deux solution Eric C et moi meme sont valables
bien que et je m'adresse a tous (Eric va m'en vouloir ;) :oops: )
je ne mélange pas les méthodes Is et array ( "is<14" et 15 to 16 )dans les select case
penser au lecteur qui pourrait eventuellement venir debuguer ;)
 

Eric C

XLDnaute Barbatruc
Re le fil,

@patrick : j'en prends bonne note ;) et suis bien content que tu détailles (cela prends de ton temps mais tu auras le satisfecit de ton fan club)
Bonne nuit à toutes & à tous
Ma signature.gif
 

Ibeko

XLDnaute Nouveau
Je ne sais pas si c'est le bon endroit pour reposer une question mais je me retrouve dans une autre impasse.

VB:
Sub Variation()

Dim result As String

If Range("C18").Value - Range("B18") > 0 Then
    result = "Hausse ventes"
   Else: result = "Baisse ventes"
   End If
Range("C19").Value = result

End Sub

J'ai en ligne 18 un total de ventes d'une année à une autre, je souhaite simplement effectuer une soustraction pour en déduire s'il y a une baisse entre l'année n et l'année n+1 et insérer la conclusion dans la ligne juste en dessous.

exemple.PNG


J'ai bien essayé de reprendre sur la base des réponses précédentes mais la méthode semble différente.
 

Eric C

XLDnaute Barbatruc
Bonjour le forum
Bonjour le fil

Désolé mais je m'étais absenté. Comme tu tiens à conserver la méthode Select Case, voici une manière de faire.
Bonne fin d'après midi à toutes & à tous.
Ma signature.gif
 

Pièces jointes

  • Ibeko.xlsm
    17.9 KB · Affichages: 6

patricktoulon

XLDnaute Barbatruc
re
@Eric C vilain vilain pan!!pan cucu Eric

tu brave toute les règles fondamentales de la prog vba

result = CDbl([C14] - [B14])' la result est un numerique double

Select Case result
Case Is < 0
result = ChrW(8664) '"Baisse ventes"'ici par le biais de "chrw" tu obtiens un STRING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Case Is > 0
result = ChrW(8663) '"Hausse ventes"'ici par le biais de "chrw" tu obtiens un STRING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
End Select
[C15] = result

en plus même pas dimé
et malgré que !!!!! au combien VBA est gentil avec toi et ne ne te plante pas une ligne jaune et considere donc result en variant

ce n'est pas une bonne habitude dans le codage

tu me fera 500 lignes
" je ne dois pas mélanger les variables numériques et les variable string"

il va y avoir de la fesse rouge !!!!!!
;) :rolleyes: :p :D :cool:

un variant ne doit pas être déclaré quelque chose puis une autre ou une autre

un variant EST!!!!! UNE CHOSE OU UNE AUTRE Définitivement !!!!!!!!!!!! comprends tu la nuance??? c'est le "puis" et "ou" qui n'est pas acceptable dans une action

IMAGINE ton code fait 2000 lignes et plante le lecteur ou correcteur va pleurer misère pour comprendre l'erreur

tantot c'est une patate,tantot c'est un poireau, tantot c'est un concombre

une vrai salade ;)

VB:
dim result#,resulString$

result = CDbl([C14] - [B14])' la result est un numerique double
Select Case result
Case Is < 0
resulString= ChrW(8664) '"Baisse ventes"'ici par le biais de "chrw" tu obtiens un STRING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Case Is > 0
resulString= ChrW(8663) '"Hausse ventes"'ici par le biais de "chrw" tu obtiens un STRING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
End Select
[C15] = resulString

je vois "[c15]" ou "[c14]" ou " [B14]" etc...... dans ton code
tu est dans un module standard !!!!
le parent c'est qui ???!!!!!

;) ;) ;)
 
Dernière édition:

Eric C

XLDnaute Barbatruc
Bonjour le fil
Bonjour Patrick

Aïe Aïe Aïe, c'est vrai que ça pique mais j'ai appliqué de la crème "Nivéa" et cela va mieux ce matin ;)

Bon quand je dis que je bidouille et m'affranchis des règles de codage !!!! :) Ma finalité même si ce n'est pas vraiment bien est que mon code fonctionne. En plus, ce que vous faîtes en 5 minutes, vous les grands du Vba,, moi je mets beaucoup plus de temps car rien ne fonctionne du premier coup !!!

Bon cela était la partie repentie

Pour la punition :
VB:
 Sub punition()
 Dim i As Single
 For i = 1 To 500
 Range("A" & i) = "je ne dois pas mélanger les variables numériques et les variable string"
 Next i
 End Sub

Ca c'est fait aussi

Pour le nouveau code : Voir le fichier joint

je vois "[c15]" ou "[c14]" ou " [B14]" etc...... dans ton code
tu est dans un module standard !!!!
le parent c'est qui ???!!!!!
Je ne comprends pas ?

Petite question : Comment applique t'on une couleur à un caractère unicode, ici ChrW(8664) - Je voulais si le résultat était en baisse alors flèche rouge....
J'ai essayé ChrW(8664).Font.Color - Font.ColorIndex puis j'ai tenté de faire un If ... result = ChrW.... then [C15].Font.colorIndex mais rien.

Bon ouikand à toutes & à tous

@+ Eric c
 

Pièces jointes

  • Ibeko.xlsm
    17.9 KB · Affichages: 4

Discussions similaires

Statistiques des forums

Discussions
312 103
Messages
2 085 310
Membres
102 859
dernier inscrit
Diallokass