Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Compter le nombre de FAUX apparus

CISCO

XLDnaute Barbatruc
Bonsoir à tous

Il y a déja un certain temps de cela, j'avais, avec l'aide de certains intervenants sur ce forum, fait un petit fichier qui permet de vérifier au fur et à mesure la validité des équations proposées pour résoudre une équation du 1er degré.

J'utilise ce fichier, avec une vingtaine d'équations à résoudre, avec des élèves.

Exemple :
On demande de résoudre l'équation 2*x+25=12.
L'élève propose 2*x= 12-25 et excel écrit dans la cellule juste en dessous VRAI.
Ensuite 2*x= -13....
Si il fait une erreur, excel écrit FAUX.

Cela fonctionne pas mal, sauf que, sauf que, parfois, certains élèves trouvent la solution presque par hasard : j'écris un truc, FAUX apparait, je remplace un - par un +, c'est encore FAUX, je remplace par un *, et c'est VRAI. Super, je continue...

Pour éviter l'utilisation abusive de cette méthode, j'aimerai bien qu'en I7 (cf fichier ci-joint), par exemple, excel compte le nombre de FAUX apparus sur cette ligne, au cours de la résolution de l'équation en A7. J'écris bien apparus, et non présents à l'écran une fois la solution trouvée.

Quelqu'un aurait il une idée, au besoin à l'aide d'une macro ?

Merci d'avance.

@ plus
 

Pièces jointes

  • essaivraifaux.xls
    42.5 KB · Affichages: 77
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Bonjour CISCO
Un essai en plaçant ce code dans le module de la feuille "Feuil1" :
Code:
[COLOR="DarkSlateGray"][B]Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Range("B7:F7"), Target) Is Nothing Then
      If Target.Offset(1, 0).Cells(1, 1).Value2 = "Faux" Then Range("I7").Value = 1 + Range("I7").Value
   End If
   If Target.Address = "$A$7" Then Range("I7").Value = 0
End Sub[/B][/COLOR]
(Le comptage est remis à zéro lorsque la cellule A7 est modifiée.)​
ROGER2327
#2261
 

Jocelyn

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Bonjour le Forum,
Bonjour CISCO, ROGER2327,

Hum hum cette réponse n'est pas la pour apporter une réponse mais pour poser une question a ROGER2327, qui a la solution.

voila je voulais essayer de mettre en place une petite macro (pour m'apprendre) tout en aidant et en mettant dans le worksheet de la feuille un cette macro

HTML:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B8") = "Faux" Or Range("C8") = "Faux" Or Range("D8") = "Faux" Or Range("E8") = "Faux" Or Range("E8") = "Faux" Then Range("I7").Value = 1 + Range("I7").Value
End Sub

lorsque l'on lance les calculs de la feuille a chaque résultat Faux la macro n'ajoute pas 1 mais entre 221 et 250 et je ne comprend pas pourquoi, si l'on pouvait m'éclairer

Voir le Fichier

Jocelyn
 

Pièces jointes

  • CISCO.xls
    49 KB · Affichages: 74
  • CISCO.xls
    49 KB · Affichages: 75
  • CISCO.xls
    49 KB · Affichages: 81

job75

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Bonsoir CISCO, Roger, Jocelyn,

Roger dort ou fait la bringue

lorsque l'on lance les calculs de la feuille a chaque résultat Faux la macro n'ajoute pas 1 mais entre 221 et 250 et je ne comprend pas pourquoi, si l'on pouvait m'éclairer

Quand s'execute Range("I7").Value = 1 + Range("I7").Value la macro Worksheet_Change est relancée immédiatement puisque la cellule est modifiée.

Cela pourrait continuer indéfiniment, pourquoi ça s'arrête à 200 et des poussières je ne sais pas.

Pour éviter la relance de la macro, il faut désactiver l'action des évènements avant de modifier la cellule, et bien sûr la réactiver ensuite :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
If Range("B8") = "Faux" Or Range("C8") = "Faux" Or Range("D8") = "Faux" Or Range("E8") = "Faux" Or Range("E8") = "Faux" Then Range("I7").Value = 1 + Range("I7").Value
Application.EnableEvents = True
End Sub

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Bonjour à tous
job75 donne la réponse au problème de Jocelyn.
La solution que je propose règle le problème autrement grâce à la ligne
Code:
[B][COLOR="DarkSlateGray"]   If Not Intersect(Range("B7:F7"), Target) Is Nothing Then[/COLOR][/B]
La ligne suivante ne sera exécutée que si la cellule appelant la procédure appartient à la plage Range("B7:F7"). par conséquent, si la cellule appelante est I7, l'incrémentation n'aura pas lieu.

A job75 :
ROGER2327 ne dort jamais. ROGER2327 ne fait jamais la bringue.
En réalité, ROGER2327 est un robot qui pisse du code. C'est un robot presque parfait. Presque seulement, car ROGER2327 ne sait pas tutoyer. Une version ultérieure corrigera ce problème : Un prototype, actuellement au stade de développement béta, sortira peut-être courant 2017 en version stable. Une version "luxe", entièrement chromée, est prévue vers 2028 / 2030.
Ces informations sont confidentielles. Merci de ne pas les divulguer prématurément.​
ROGER2327
#2266
 

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Bonjour à tous

Bonjour ROGER2327, Jocelyn et Job75.

Merci pour vos propositions et remarques. Ca fonctionne nickel, et c'est assez simple pour être compréhensible par mes petits neurones .

Maintenant, un petit plus : Quelle modification faut il faire pour que cela soit valable en I7 mais aussi en I9 (par rapport à l'équation écrite en A9, et aux FAUX écrits en B10, C10, D10 et F10), en I11 (par rapport à l'équation écrite en A11, et aux FAUX écrits en B12...) ? Peut être avec une fonction nommée pour l'occasion, par ex NBFAUX, à écrire ensuite en I7, I9... ?

Merci d'avance

@ plus et bonne semaine à tout le monde.
 

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Re...
Peut-être quelque chose comme ça :
Code:
[COLOR="DarkSlateGray"][B]Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Range("B7:F13"), Target) Is Nothing And Target.Row Mod 2 Then
      If Target.Offset(1, 0).Cells(1, 1).Value2 = "Faux" Then Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value = 1 + Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value
   End If
   If Not Intersect(Range("A7:A13"), Target) Is Nothing And Target.Row Mod 2 Then
      Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value = 0
   End If
End Sub[/B][/COLOR]
Mais il est très difficile de travailler sur un classeur avec une feuille protégée contenant des colonnes masquées !​
ROGER2327
#2267
 

Jocelyn

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

re,
Bonjour job75,

Un grand merci à job75 et à ROGER2327, ce soir je me coucherais moins idiot qu hiers.

et on dit que le VBA est simple quelle bonne blague.

En tous cas une nouvelle fois merci a vous 2

Jocelyn
 

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Rebonjour

Mais il est très difficile de travailler sur un classeur avec une feuille protégée contenant des colonnes masquées !

Excuses moi, STP, j'avais déprotégé la feuille 1, et oublié d'en faire autant sur la feuille 3 !! Je modifie de ce pas le premier fichier en conséquence...

Ceci dit, merci, ça fonctionne bien. Il ne me reste plus qu'à comprendre la méthode

@ plus
 

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Rebonjour à tout le monde

Il y a un petit problème : Cela fonctionne bien tant que la feuille 1 n'est pas protégée, et plus dans le cas contraire. Faites donc un essai avec le fichier ci-joint, sans, puis avec une protection de la première page.

Bien sûr, certaines cellules de cette page, dont certaines de la colonne I, sont verrouillées.

Que faut il faire pour que cela tourne correctement ?

@ plus
 

Pièces jointes

  • vraifaux.zip
    14.6 KB · Affichages: 29
  • vraifaux.zip
    14.6 KB · Affichages: 28
  • vraifaux.zip
    14.6 KB · Affichages: 27

jeanpierre

Nous a quitté
Repose en paix
Re : Compter le nombre de FAUX apparus

Bonjour CISCO, ROGER, Jocelyn, job,

En déprotégeant ta feuille en début de macro avec : ActiveSheet.Unprotect

Et en la reprotégeant avant de sortir : ActiveSheet.Protect

Bonne journée.

Jean-Pierre
 

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Bonsoir à tous

J'ai encore besoin de votre aide: Lorsque j'essaye d'effacer les valeurs dans I7, I9, I11, il me faut ôter la protection de la feuille (sans mot de passe). Cela ne pose pas de problème, sauf que... une fois I7 effacé, il me faut de nouveau ôter la protection pour pouvoir effacer I9, puis faire de même pour effacer I11, et ainsi de suite.

Je pense que cela vient de la macro concernant les calculs dans I7, I9..., mais, ne maîtrisant pas du tout le sujet, je ne sais que faire.

Merci d'avance.

@ plus
 

Pièces jointes

  • vraifaux.zip
    17 KB · Affichages: 31
  • vraifaux.zip
    17 KB · Affichages: 33
  • vraifaux.zip
    17 KB · Affichages: 29
Dernière édition:

job75

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Bonsoir CISCO, le fil,

Je ne sais pas, ou j'ai oublié, comment on détermine en VBA l'état de protection d'une feuille.

Tu peux utiliser par contre ce pis-aller :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
[COLOR="Red"]Dim flag As Boolean
On Error Resume Next
Rows(1).RowHeight = Rows(1).RowHeight
flag = Err > 0[/COLOR]
ActiveSheet.Unprotect
If Not Intersect(Range("B7:F45"), Target) Is Nothing And Target.Row Mod 2 Then
If Target.Offset(1, 0).Cells(1, 1).Value2 = "Faux" Then Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value = 1 + Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value
End If
If Not Intersect(Range("A7:A45"), Target) Is Nothing And Target.Row Mod 2 Then
Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value = 0
End If
[COLOR="red"]If flag Then[/COLOR] ActiveSheet.Protect
End Sub

A+
 

ROGER2327

XLDnaute Barbatruc
Re : Compter le nombre de FAUX apparus

Bonsoir à tous
A CISCO :
Essayez ceci :
Code:
[COLOR="DarkSlateGray"][B]Private Sub Worksheet_Change(ByVal Target As Range)
[COLOR="Red"]Dim tf As Boolean
   tf = ProtectContents
   Unprotect[/COLOR]
   If Not Intersect(Range("B7:F45"), Target) Is Nothing And Target.Row Mod 2 Then
      If Target.Offset(1, 0).Cells(1, 1).Value2 = "Faux" Then Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value = 1 + Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value
   End If
   If Not Intersect(Range("A7:A45"), Target) Is Nothing And Target.Row Mod 2 Then
      Range("I7").Offset(2 * (Target.Row \ 2) - 6, 0).Value = 0
   End If
   [COLOR="Red"]If tf Then Protect[/COLOR]
End Sub[/B][/COLOR]
Si je ne me trompe pas, la feuille conservera son état de protection. Par conséquent, ne pas oublier de la protéger une fois les modifications effectuées.​
ROGER2327
#2269
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…