XL 2010 Questionnaire aléatoire sans doublons

jaggerjack

XLDnaute Nouveau
Bonjour à tous,

Je précise que je suis débutant en VBA donc j'espère pouvoir vous exposer mon problème de manière compréhensible.

Voici mon "projet" :

Je dois créer un questionnaire (de préférence en PDF) comprenant différentes questions regroupées dans différentes catégories et le but serait que les questions soient générées automatiquement, aléatoirement et sans doublons en appuyant sur un bouton depuis le fichier Excel (les questions sont bien-entendu stockées dans le fichier Excel).

Pour se faire, j'ai donc recherché énormément de codes que j'ai mixé afin d'obtenir un certain résultat.

Actuellement, je suis capable de générer un document Word qui récupère bien les questions et ce, aléatoirement, tout en choisissant le nombre de questions voulues par catégories.

Maintenant, le gros problème est que je n'arrive pas à gérer ces maudits doublons...

J'ai joint un fichier exemple pour que vous puissiez plus facilement vous faire une idée.

Merci d'avance et bonne journée
 

Pièces jointes

  • CelluleAléatoire.xlsm
    20.8 KB · Affichages: 37

Modeste geedee

XLDnaute Barbatruc
Bonjour à tous,

Je précise que je suis débutant en VBA donc j'espère pouvoir vous exposer mon problème de manière compréhensible.

Voici mon "projet" :

Je dois créer un questionnaire (de préférence en PDF) comprenant différentes questions regroupées dans différentes catégories et le but serait que les questions soient générées automatiquement, aléatoirement et sans doublons en appuyant sur un bouton depuis le fichier Excel (les questions sont bien-entendu stockées dans le fichier Excel).

Pour se faire, j'ai donc recherché énormément de codes que j'ai mixé afin d'obtenir un certain résultat.

Actuellement, je suis capable de générer un document Word qui récupère bien les questions et ce, aléatoirement, tout en choisissant le nombre de questions voulues par catégories.

Maintenant, le gros problème est que je n'arrive pas à gérer ces maudits doublons...

J'ai joint un fichier exemple pour que vous puissiez plus facilement vous faire une idée.

Merci d'avance et bonne journée
Comme ceci peut-etre ???
upload_2018-8-27_10-55-40.png
 

Pièces jointes

  • CelluleAléatoire.xlsm
    24.1 KB · Affichages: 27

jaggerjack

XLDnaute Nouveau
Bonjour Modeste geedee et merci beaucoup pour ta réponse des plus rapides,

D'après ce que j'ai pu voir au niveau du Word cela m'affiche exactement ce que je voulais, merci.

Par contre au niveau du fichier excel, y aurait-il un moyen de ne pas ajouter d'éléments supplémentaires (ici les colonnes C et D) car il doit être le plus "propre" possible ^^'

Dans le cas contraire je ferais avec ta solution :)

Encore merci
 

Modeste geedee

XLDnaute Barbatruc
Bonjour Modeste geedee et merci beaucoup pour ta réponse des plus rapides,

D'après ce que j'ai pu voir au niveau du Word cela m'affiche exactement ce que je voulais, merci.

Par contre au niveau du fichier excel, y aurait-il un moyen de ne pas ajouter d'éléments supplémentaires (ici les colonnes C et D) car il doit être le plus "propre" possible ^^'

Dans le cas contraire je ferais avec ta solution :)

Encore merci
les colonnes C et D peuvent etre masquées
et/ou sur un autre onglet (préférable)
nb : il n'a pas été pris en compte le nombre d'item pouvant être différents selon les catégories
 

jaggerjack

XLDnaute Nouveau
Hello pierrejean,

ça marche niquel merci beaucoup !!!

Je pense reprendre l'idée de boucle de catégories de Modeste (c'est clairement plus propre) ainsi que ton code et les combiner.

Merci encore à vous deux pour votre aide ainsi que votre rapidité
 

jaggerjack

XLDnaute Nouveau
Excuse moi pierrejean mais bien que j'ai réussi à tout combiner afin que cela fonctionne, je ne comprend pas certaines lignes de ton code =S

Notamment ces lignes :

dico(mavariable) = ""

et

a = dico.keys
For n = LBound(a) To UBound(a)

A part l'incompréhension, tout fonctionne parfaitement

Merci encore !
 

pierrejean

XLDnaute Barbatruc
Re
dico est un dictionnaire .Un dictionnaire est un tableau a 2 colonnes(keys ,items) qui a la particularité de ne pas accepter de doublons
Quand on alimente le dico il ne s'agrandira pas si l'on déclare plusieurs fois la même valeur de key
pour avoir la liste sans doublons on dit que
tant que que le nbre d’éléments du dico n'est pas atteint on declare une nouvelle key
For n = LBound(a) To UBound(a)
msgbox(a(n))
next
affiche les key du dico
 

jaggerjack

XLDnaute Nouveau
Vraiment désolé mais encore une incompréhension qui d'ailleurs m'affiche un numéro vide pour chaque catégorie quand au moins l'une d'elles n'a pas exactement 16 questions.

Il me semble que l'erreur vient de :

a = dico.keys
For n = LBound(a) To UBound(a)
objword.Selection.TypeText Text:=n + 1 & ") " & a(n)
objword.Selection.TypeParagraph

En vérifiant avec le debogueur, j'ai pu remarquer que la valeur de Ubound(a) restait à 15 et il me demandera toujours 16 questions.

Y aurait-il un moyen de réinitialiser la valeur de la variable a pour qu'elle récupère une nouvelle valeur lorsque la boucle recommence pour une autre catégorie possédant moins de questions ?

Voici mon code :

Dim i As Integer
Dim k As Integer
Dim strvalue1 As Integer
Dim valmax As Integer
Dim ligne As Integer
ligne = Application.WorksheetFunction.CountA(Range("1:1"))
Dim l As String
i = 1
'récupère la valeur du code ASCII
l = Chr(Asc("A"))
For k = 1 To ligne
Titre1 = Cells(1, k)
'Copie la donnée de la cellule dans le document word
objword.Selection.TypeText Text:=Titre1
' 'Fait un retour à la ligne dans le word
objword.Selection.TypeParagraph
valmax = Application.WorksheetFunction.CountA(Range(l & ":" & l))

Set dico = CreateObject("Scripting.dictionary")
'Lit les cellules du fichier excel
Dim RNG As Range
Set RNG = Range(l & "1:" & l & valmax + 1)
While dico.Count < valmax - 1
cpt = cpt + 1
If cpt > 1000 Then Exit Sub 'securite boucle infinie
'Compte et donne un numero aux cellules, aléatoirement
strvalue1 = Int(Rnd * RNG.Cells.Count) + 1
'Numérote et Récupère la question de la cellule ("l" = colonne et stravalue1 = ligne)
mavariable = Range(l & strvalue1 + 1).Value
dico(mavariable) = ""
Wend
a = dico.keys
For n = LBound(a) To UBound(a)
objword.Selection.TypeText Text:=n + 1 & ") " & a(n)
objword.Selection.TypeParagraph
'incrémentation
Next
'Incrémente la lettre
l = Chr(Asc("A") + i)
i = i + 1
Next k
 

pierrejean

XLDnaute Barbatruc
Re
ubound(a) est conditionné par valmax
dans ta macro valmax se réfère a la colonne A
l = Chr(Asc("A")) est equivalent à l="A"
Voir également ligne qui devrait être représentatif du nbre de colonnes si j'ai bien compris

NB: Un fichier exemple est généralement utile pour l’interprétation
 

jaggerjack

XLDnaute Nouveau
Alors ça fonctionne mais avec les données que je suis sensé insérer à la place des questions il ne me génère qu'une petite partie du questionnaire =/

Voici le document avec les autres données
 

Pièces jointes

  • Questionnaire2.xlsm
    33.5 KB · Affichages: 10

Discussions similaires

Statistiques des forums

Discussions
312 204
Messages
2 086 198
Membres
103 153
dernier inscrit
SamirN