Questionnaire SANS remise
Bonjour,
J'utilise excel pour une application très simple et qui n'est d'ailleurs pas du tout la sienne .
Colonne A j'ai des questions :
Question 1 ....
Question 2 ....
Question 3....
Question X ...
J'ai ajouter un bouton : quand je clic dessus il affiche dans une autre cellule en très gros, une des questions de la colonne A avec le code suivant :
Option Explicit
Sub aa()
Dim xx As Integer
xx = WorksheetFunction.RandBetween(1, 3)
Cells(3, 6) = Cells(xx, 1)
End Sub
mais je voudrais que les choix des questions soit sans remise comment faire?
Bonjour,
Une proposition =
Au regard de chaque question, tu mets un indicateur
Tu compares aussi le nombre de questions et le nombre d'indicateurs pour arrêter le questionnaire
Dans le tirage au sort, tu l'exécutes tant que la question n'a pas été tirée (boucle while)
Bonjour, Salut Steelson,
Suggestion :
Sub aa()
Static tx$
Dim i%, x%, txnt$, k$
If tx = "" Then
With [Quest]
For i = 1 To .Rows.Count
txnt = txnt & Chr(i + 96)
Next i
End With
Randomize
For i = 1 To Len(txnt)
x = Int(Len(txnt) * Rnd + 1)
k = Mid(txnt, x, 1)
tx = tx & k: txnt = Replace(txnt, k, "")
Next i
End If
x = Asc(tx) - 96: tx = Right(tx, Len(tx) - 1)
ActiveSheet.Cells(3, 6) = [Quest].Cells(x, 1)
End Sub
J'ai ajouté une plage nommée pour la plage de questions (nom dynamique).
Au démarrage un tirage est fait par la procédure, qui le conserve jusqu'à épuisement (ou fermeture du classeur) [dans une variable statique]. A chaque appel, elle fournit la question tirée suivante... quand il n'y en plus, elle refait un tirage, et on recommence !
Remarque par rapport à ton code initial : lorsqu'il existe des fonctions VBA, il est préférable de les utiliser en VBA plutôt que d'aller puiser dans les fonctions Excel... C'est le cas pour les tirages aléatoires avec la fonction VBA Rnd. Il convient en outre d'initialiser le générateur de nombres aléatoires avant de commencer les tirages...
Pour le reste, si tu as besoin d'explications supplémentaires, tu demandes... Pour l'instant le dispositif est sommaire, mais ton fichier aussi ! On peut étoffer diversement selon les développement que tu introduiras.
Cordialement.
MFerrand a écrit :Bonjour, Salut Steelson,
Suggestion :
Sub aa() Static tx$ Dim i%, x%, txnt$, k$ If tx = "" Then With [Quest] For i = 1 To .Rows.Count txnt = txnt & Chr(i + 96) Next i End With Randomize For i = 1 To Len(txnt) x = Int(Len(txnt) * Rnd + 1) k = Mid(txnt, x, 1) tx = tx & k: txnt = Replace(txnt, k, "") Next i End If x = Asc(tx) - 96: tx = Right(tx, Len(tx) - 1) ActiveSheet.Cells(3, 6) = [Quest].Cells(x, 1) End Sub
J'ai ajouté une plage nommée pour la plage de questions (nom dynamique).
Au démarrage un tirage est fait par la procédure, qui le conserve jusqu'à épuisement (ou fermeture du classeur) [dans une variable statique]. A chaque appel, elle fournit la question tirée suivante... quand il n'y en plus, elle refait un tirage, et on recommence !
Remarque par rapport à ton code initial : lorsqu'il existe des fonctions VBA, il est préférable de les utiliser en VBA plutôt que d'aller puiser dans les fonctions Excel... C'est le cas pour les tirages aléatoires avec la fonction VBA Rnd. Il convient en outre d'initialiser le générateur de nombres aléatoires avant de commencer les tirages...
Pour le reste, si tu as besoin d'explications supplémentaires, tu demandes... Pour l'instant le dispositif est sommaire, mais ton fichier aussi ! On peut étoffer diversement selon les développement que tu introduiras.
Cordialement.
Merci MFerrand ,
Ta macro est Top, mon fichier est sommaire, mais ce qu'on me demande l'est encore plus .
j'ai compris la philosophie de ta macro sans pour autant comprendre les détails
Quand tu dis nom dynamique c'est parce que la plage s'adapte automatiquement aux nombre de ligne ?
Quand tu dis nom dynamique c'est parce que la plage s'adapte automatiquement aux nombre de ligne ?
Oui ! Regarde la formule dans le Gestionnaire de noms...
est il possible un message à l’épuisement de toutes les questions ?
du coup la condition : variable statique = plage dynamique = message?
Ajoute cette ligne à la fin :
[...]
If tx = "" Then MsgBox "La liste de questions est épuisée !", vbInformation
End Sub
Hé hé, j'avais aussi suggéré une réponse, mais je me suis trompé de post !! voilàce que c'est que de travailler en rafale ....
https://forum.excel-pratique.com/excel/tier-regrouper-t96706.html#p561136
Hello !
J'étais parti sur quelque chose de plus simple (et moins "pro") en respectant l'écriture initiale ... je vous livre la version quand même !
Sub aa()
Dim xx As Integer
If Cells(1, 4) <> Cells(1, 3) Then
Do
xx = WorksheetFunction.RandBetween(1, Cells(1, 3))
Loop While Cells(xx, 2) <> ""
Cells(3, 6) = Cells(xx, 1)
Cells(xx, 2) = "*"
Else
MsgBox "Terminé !"
End If
End Sub