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
Rechercher des sujets similaires à "questionnaire remise"