Questionnaire à choix unique. Système de croix unique

Bonjour à tous!

Voilà le petit exercice qui me pose soucis au boulot :

Un formulaire assez gros (plus d'une cinquantaine de croix à mettre) dois être amélioré. En effet, à chaque zone de question, il faut qu'une seule réponse et une seule. Or, énormément de personnes remplissent mal le fichier en mettant plusieurs réponses, et les fichiers sont du coup inexploitable pour les statistiques à faire derrière.

Nous devons donc développer un système de croix unique pour chaque zone :

  • chaque zone de question est indépendantes l'une de l'autre
  • dans chaque zone, il faut une seule croix et une seule.

Voir l'exemple dans le fichier joint.

L'idéal serait l'affichage de la croix lorsqu'on clic dans la cellule, et non utiliser le clavier et inscrire la lettre "x".

Nous avons essayé de modifier le formulaire avec les zones de groupe et les cases d'option, mais il faut que ca tienne sur une seule page A4, que ça reste lisible. Or les zones de groupe et les cases d'options comportent "un zonage" trop large, ce qui nous contraint d'aérer trop le formulaire pour que ca fonctionne et que tout tienne, et ce n'est pas satisfaisant. Je ne sais si je me fais comprendre.

Merci pour votre aide!

pourtant les "cases d'option" (en réalité des boutons radio) peuvent être rapprochées pour tenir peu de place

(affichage barre d'outils, boîte à outil contrôles)

réessaye

et en informatique il faut respecter les "bonnes pratiques" : les réponses qui s'excluent les unes les autres (1 réponse unique) comme tu le veux doit se faire avec des boutons radio

Nous avons malheureusement serré au maximum mais on arrive pas à faire tout rentrer.

En fait la dimension de la case d'option est au minimum de 0.61*0.85, ce qui est grand, car nous somme obligé de faire rentrer les cases options dans les zones de groupe qui sont du coup un peu grande...

bref, ce système ne nous convient pas

Bonjour

Voici un code pour tes 2 plages (à placer dans Feuil1) :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'--------------------------------------------------------------------
If Not Application.Intersect(Target, Range("A8:C8")) Is Nothing Then
    With Target
        If .Column = 1 Then
            .Value = "X"
            .Offset(0, 1) = ""
            .Offset(0, 2) = ""
        End If
        If .Column = 2 Then
            .Value = "X"
            .Offset(0, -1) = ""
            .Offset(0, 1) = ""
        End If
        If .Column = 3 Then
            .Value = "X"
            .Offset(0, -1) = ""
            .Offset(0, -2) = ""
        End If
    End With
End If
'---------------------------------------------------------------------
If Not Application.Intersect(Target, Range("E8:G8")) Is Nothing Then
    With Target
        If .Column = 5 Then
            .Value = "X"
            .Offset(0, 1) = ""
            .Offset(0, 2) = ""
        End If
        If .Column = 6 Then
            .Value = "X"
            .Offset(0, -1) = ""
            .Offset(0, 1) = ""
        End If
        If .Column = 7 Then
            .Value = "X"
            .Offset(0, -1) = ""
            .Offset(0, -2) = ""
        End If
    End With
End If
'----------------------------------------------------------------------
End Sub

Il y a très certainement moyen de faire une boucle pour éviter de répéter ceci pour chaque plage, mais je suis trop néophyte pour la faire.

Amicalement

Nad

Bonsoir à tous,

jeremie, on ne peut rien faire avec ton fichier,

envoie une feuille reflétant la structure réelle

Amicalement

Claude

Me revoilà,

Ecoute Nad, c'est carrément super, c'est en fait approximativement exactement ce nous cherchons avec le collègue

En effet, dans notre fichier, il y un paquet de zones comme ça, je vais d'abbord monter le fichier avec ton code, qui sera du coup juste super long.

Une fois fait, je le mettrai ici, et libre aux pro de voir pour des boucles. Claude, En fait mon premier exemple était volontairement ultra léger, c'était juste pour m'assurer "rapidemement" auprès du forum qu'une solution existait.

Encore merci!

Bonjour,

Me revoilà, j'ai eu le temps de bosser un peu sur le fichier, depuis l'idée de code de Nad.

Voilà ou j'en suis dans le fichier, il me reste à paufiner, et à automatiser à mon avis le code, car ça risque d'etre trop long sinon...

Toutes les questions sont expliquées dans le fichier

Merci!

EDIT 28/06/2010 : Je pensais à ma 2ème question dans le fichier et je pensais aussi à un UseForm. Si et seulement si il y a une croix dans chacune des 3 zones de la ligne, alors le UF arrive si on clique sur une des cellule F, J, K, P ou Q pour te demander les infos nécessaire dans F, J, K, P et Q...A voir l'aspect pratique.

Bonjour

Pour la 1ère question, je pense que ce code (de Dan) conviendra - tu remplaces donc celui qui est en place par celui-ci :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'Macro par Dan
If Not Application.Intersect(Target, Range("C7:E54, G7:I54, L7:O54")) Is Nothing Then
Cancel = True
Target = "X"
End If
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'Macro par Dan
If Target.Count > 1 Then Exit Sub
If Not Application.Intersect(Target, Range("C7:E54, G7:I54, L7:O54")) Is Nothing Then
Cancel = True
Target.ClearContents
End If
Cancel = False
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
'Macro par Dan
Dim plage As Range
Dim a As Byte
On Error GoTo Fin:
a = 0
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False

If Not Intersect(Target, Range("C7:E54")) Is Nothing Then
Set plage = Range("C" & Target.Row & ":" & "E" & Target.Row)

ElseIf Not Intersect(Target, Range("G7:I54")) Is Nothing Then
Set plage = Range("G" & Target.Row & ":" & "I" & Target.Row)

ElseIf Not Intersect(Target, Range("L7:O54")) Is Nothing Then
Set plage = Range("L" & Target.Row & ":" & "O" & Target.Row)

End If
For Each Cel In plage
If Cel <> 0 Then
a = a + 1
End If
Next Cel
Select Case a
Case Is > 1
MsgBox "Il y a déjà un choix de fait - Faites un click droit sur le choix existant pour l'effacer"
Target.ClearContents
Target.Offset(0, 1).Activate
Case Else
End Select

Application.EnableEvents = True
Exit Sub
Fin:  Application.EnableEvents = True
End Sub

Amicalement

Nad

Salut

J'ai testé, c'est pas mal!

Avant que je fouille dans le code, mes premières remarques :

- le double click est moins convivial que le simple clic, est-ce une propriété intrinsèque de ce nouveau code? j'ai bien essayé de mettre "left" à la place de "Double", mais ça ne fonctionne pas

- j'aimais bien le fait de pouvoir modifier la position d'une croix dans une zone immédiatement. Le clic droit là aussi est moins convivial. Cela complexifie un peu les manipulations, et fait dérouler le menu contextuel du clic droit.

Pour info, le fichier est renseigné par du personnel absolument pas initiés à l'informatique pour la plupart, voilà pourquoi je cherche à simplifier au maximum.

Merci encore pour ton aide, je vais fouiller un peu, en attendant les évolutions du forum.

Bonsoir à tous,

Voici déjà pour les croix,

Pour le reste, envoie une journée normalement remplie,

qu'on vois le contrôle à mettre en place.

Amicalement

Claude

édit: code simplifié sur ce fichier

édit2: code encore simplifié

Salut Claude,

J'ai regardé ton évolution, c'est juste super efficace, super léger! Bravo, et merci!

c'est comme le rubik's cube en fait, il y a ceux qui le finissent (comme moi, record 1'32'' ) et ceux qui apprennent la méthode dite de Fridrich, avec des centaines de combinaisons à apprendre par cœur, et les temps descendent sous les 10 secondes...

Voilà un exemple de fichier rempli (pour les deux premiers jours, c'est du kifkif pour les jours suivants). Notez les boutons pour effacer les données par jour du plus effets, n'est-il pas? 8) (je me suis bien amusé...!)

L'idée c'est de forcer les utilisateurs à bien remplir le fichier, afin que la base derrière fonctionne au mieux. Donc, dès qu'une ligne commence, (par exemple en remplissant le nom de la route), il faut inciter à remplir les cases "croix" et les cases de champs libres.

Le souci c'est qu'on ne valide rien dans ce fichier avec un bouton par exemple où on aurait pu en effet intégrer des conditions de remplissage avant le clic, mais là, on saisi (ou pas) et c'est tout. Un système d'éclairage des cellules à remplir qui se remettent à banc me semble pas mal pour commencer, mais comme je disais, mes tentatives de MFC échouent.

Encore merci en tout cas!

EDIT : Désolé pour l'indicage du fichier. J'ai foiré la sauvegarde, et j'ai perdu les chiffres du premier envoi, du coup j'en ai remis des autres, mais c'est différents, pardon!

Bonjour,

Merci de changer l'indice quand tu joint un fichier

qu'on puisse suivre !

Claude

-- Mar Juin 29, 2010 7:44 pm --

Bonsoir à tous,

à tester, mais çà reste du "bricolage" !

Amicalement

claude

Merci claude pour ce code "bricolé"

Il est puissant, je dois dire presque même trop! En effet, l'idée est la bonne, mais l'effet collatéral c'est que la saisie devient très "agressive", et les utilisateurs vont probablement mal prendre ces rappels à l'ordre

En fait, j'ai cherché à alléger le code pendant 30 minutes pour qu'un message n'arrive qu'au bout de la dernière croix, mais en vain. J'avoue que j'ai du mal à saisir le fonctionnement de la macro.

Donc la modif pour moi intéressante serait de laisser l'utilisateur entrer ce qu'il veut (croix et champs libre), et c'est seulement quand la croix du pavé L:0 est saisie, là un message arrive pour dire qqch du genre : "attention, vous avez oublié de renseigner ça, ça et ça". un message variable disons, seulement là ou il a des manques..

J'imaginais aussi une MFC clignotante au lieu d'un Msgbox, mais bon, je ne sais pas ce que tu en penses.

Redis-moi si tu as des questions, avant de modifier le code, afin de ne pas te faire réfléchir sur trop de versions..!

Merci!

Bonjour,

C'est lourd, mais c'est ce qui était demandé !

à mon avis, j'aurai simplement mis un bouton "Validez" ou "Contrôle",

qui balayerait la page, laissant libre le remplissage.

Amicalement

Claude

Effectivement, on voulait au départ qu'il y ait des incitations sur chacun des champs libres et croix, mais mon collègue et moi trouvons finalement que c'est ûn peu trop "too much". La première version n'est jamais vraiment la bonne, non? un peu de tolérance tout de même.

Je vais me débrouiller pour essayer des créer ce que nous avons décidé finalement, c'est à dire ce que je décris dans le message précédent.

le soucis c'est que je ne comprends pas bien le fonctionnement avec les "i", pour que ca fonctionne sur toutes les lignes. EDIT : si d'aileurs tu pouvais m'expliquer le fonctionnement global, j'apprécierais.

Encore merci pour ton aide.

Bonsoir à tous,

le soucis c'est que je ne comprends pas bien le fonctionnement avec les "i"

les "i" sont les N° de ligne de la boucle

Claude

a resolu2
Rechercher des sujets similaires à "questionnaire choix unique systeme croix"