Variable composée

Résolu
Jimmy59116 Messages postés 45 Date d'inscription   Statut Membre Dernière intervention   -  
Jimmy59116 Messages postés 45 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je prépare une appli pour gérer des questions et des réponses. Voici le modèle souhaité :

Numéro de la question = Num_MS (variable définie dans le code)
Identification de la réponse : MS_x (x étant la valeur de Num_MS)

Je souhaite pouvoir incrémenter le numéro de la réponse en fonction du numéro de la question ex :

Num_MS = 3
MS_ & Num_MS = Range("A1")

qui se traduira par MS_3 = Range("A1")


Si besoin, voici le code préparé :

' Positionnement sur la feuille QCM_MS
Sub MS_AFF()
screen_non
Sheets("QCM_MS").Select
Num_MS = 1
Range("D3") = Num_MS
screen_oui
End Sub

' Gestion des réponses : au clic sur bouton, la réponse s'affiche dans la cellule C6
Sub MS_B1()
Range("C6") = 1
End Sub
Sub MS_B2()
Range("C6") = 2
End Sub
Sub MS_B3()
Range("C6") = 3
End Sub
Sub MS_B4()
Range("C6") = 4
End Sub
Sub MS_BPASS()
Range("C6") = "Je passe"
End Sub

' Mise en variable de la réponse

Sub MS_REP()
MS_ & Num_MS = Range("C6").Value => C'est cette partie là du code qui ne fonctionne pas

reset 'effacer C6 et incrémenter numéro de question
Num_MS = Num_MS + 1
End Sub

J'imagine que ce n'est qu'une question de syntaxe, j'ai essayé de poser des parenthèses mais je bug...

D'avance, je vous remercie pour votre aide.
Cdt,
Jimmy

5 réponses

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Bonjour,

J'avoue ne pas saisir la question, mais cela ressemble fortement à une variable tableau.

Exemple :

'dimensionnement de la variable tableau, 
'ici elle n'acceptera que 4 "indices", de 0 à 3
Dim monTab(3)
monTab(0) =  Range("C6").Value 
monTab(1) =  Range("C7").Value 
monTab(2) =  Range("C8").Value 
monTab(3) =  Range("C9").Value

En savoir plus...
0
blux Messages postés 27117 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
Salut,

si c'est juste une variable, alors ce n'est pas possible (il faut passer, comme l'a justement dit pijaku, par un tableau).

Si c'est un objet, c'est possible grâce aux collections VBA, un exemple :

Feuill1.Controls("MS_" & i).text = "toto".

A+ blux
 "Les cons, ça ose tout. 
C'est même à ça qu'on les reconnait"
0
Jimmy59116 Messages postés 45 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour,

Je vous remercie pour la promptitude de vos réponses.

Je crains effectivement ne pas avoir été clair.

Pour plus de précisions : il s'agit d'un QCM de "matières scolaires", d'ou le MS qui précède tous les noms utilisés dans le code. Les questions sont posées à l'oral, le candidat répond sur un excel en cliquant sur des boutons (1,2,3,4, je passe).

Pour savoir où il en est dans le jeu, le numéro de la question "Num_MS" est affichée sur la feuille. Le but est de rester sur cette même feuille pour les 8 questions.

La réponse du candidat s'affiche en C6 à chaque fois. C'est ce résultat que je souhaite récupérer en variable. Le nom de cette variable doit être composée de (MS_) et suivie du numéro de la question. Ainsi, j'obtiens les réponses MS_1 ; MS_2...

A la fin des 8 questions, je récupère les réponses et les enregistres dans un autre fichier (le "temp").

Voici le code d'une réponse :
' Au clic sur le bouton MS_B1, un "1" s'affiche en C6
Sub MS_B1()
Range("C6") = 1
End Sub

Ensuite, pour aller à la question suivante, je passe par ces étapes :
- Enregistrer la réponse en variable
- Tester si on est à la fin du jeu (si oui, on passe à la section "fin")
- Effacer le champ dans lequel est apparue la réponse
- Incrémenter le numéro de question

'______________________________
' Récupération des réponses

Sub MS_REP()

' Mise en variable de la réponse
MS_x = Range("C6")
' Où "x" = Num_MS => l'étape que je ne parviens pas à résoudre

' Test du numéro de question
If Num_MS = 8 Then GoTo fin

' Passage à la question suivante
Range("C6") = ""

' Incrémentation du numéro de question
Num_MS = Num_MS + 1
' Affichage du nouveau numéro de question
Range("D3") = Num_MS
Exit Sub

' Au bout de 8 questions, enregistrement des réponses dans le temp "C1"
fin:
ACTIV_C1
Range("B10") = MS_1
Range("B11") = MS_2
Range("B12") = MS_3
Range("B13") = MS_4
Range("B14") = MS_5
Range("B15") = MS_6
Range("B16") = MS_7
Range("B17") = MS_8
FERMER

' Affichage d'une page d'attente
Sheets("ATT").Select
Application.Wait Now + TimeValue("00:00:02")

' Retour à la page Menu
Sheets("menu").Select


End Sub

Il y a peut-être plus simple à faire, mais en fait, il y a plusieurs candidats simultanés et plusieurs QCM à gérer, d'où mon essai de "compactage" du code.

J'espère que ces éclaicissements vous aideront à comprendre ma question, si besoin je peux mettre le fichier excel en ligne pour d'éventuels tests.

Une fois encore, je vous remercie pour vos brillantes idées !

Cdt,
Jimmy
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Et bien en fait, c'est bien une variable tableau dont tu as besoin.
En tête de module, je mettrais :
Option Explicit
Option Base 1
Dim MS_(8)
Dim Num As Integer

Regarde ce test à copier-coller dans un module standard :
Option Explicit 

Option Base 1 

Dim MS_(8) 
Dim Num As Integer 

Sub Incremente() 
Dim i As Integer 

Num = Num + 1 
If Num = 9 Then Num = 1 'ici on empêche simplement d'aller + loin que 8 
MS_(Num) = "poireau " & Num 
For i = 1 To 8 'For i = LBound(MS_()) To UBound(MS_()) 
    If MS_(i) <> "" Then MsgBox MS_(i) & " attribué à MS_ n° " & i 
Next i 
End Sub
0
blux Messages postés 27117 Date d'inscription   Statut Modérateur Dernière intervention   3 359
 
Je plussoie : un tableau est l'arme absolue pour ce genre de problème...
0
Jimmy59116 Messages postés 45 Date d'inscription   Statut Membre Dernière intervention   1
 
Bonjour,

Merci pour votre aide, mais je suis un peu dépassé. J'ai regardé des tutos sur l'exploitation des tableaux, mais ils m'ont juste appris à afficher les données dans des msgbox...

Je ne comprends pas bien comment remplir le tableau à chaque validation du candidat et tout restituer à la fin dans mon "temp".

Voilà un sujet qu'il me faudra creuser. Quoi qu'à force de ramer sur le sable, je suis déjà en train de creuser :)

Avant de lire vos réponses, j'ai pensé à un subterfuge en mangeant : enregistrer dans le temp au fur et à mesure et le fermer ensuite, en me servant du numéro de la question pour définir la cellule de destination dans le temp.

Voici donc un code moins propre que la solution que vous me proposez, mais qui fonctionne... même si ce n'est pas l'idéal que je recherchais !

Je serais enchanté de voir comment intégrer la notion de tableau dans la routine du jeu, mais mon cerveau semble faire obstruction. Si vous avez la patience et le temps de corriger ce code avec la mise en application d'un tableau, j'en apprendrais un peu plus et me coucherais moins bête.

Cependant, je comprendrais fort bien que vous considériez à juste titre la question comme résolue.

Quoi qu'il en soit, plus je pratique Excel, plus je me rends compte que chaque petit bout de code appris révèle l'ampleur de ce que j'ignorais !

Trêve de bavardage, voici ma solution :

'______________________________
' Gestion des réponses

Sub MS_REP()
screen_non ' application.screenupdating = false

' Récupération de la réponse
MS_R = Range("C6")

' Définition de la destination dans le temp
MS_D = MS_Num + 10

' Activation du fichier "temp" dans lequel je range les réponses (ouvert en début de routine)
ACTIV_C1

' Remplissage du temp
Cells(MS_D, 2) = MS_R

' Ménage des variables temporaires
MS_R = ""
MS_D = ""

' Retour à l'interface utilisée par les joueurs
ACTIV_Cand1

' Test du numéro de question
If MS_Num = 8 Then GoTo fin

' Passage à la question suivante
Range("C6") = ""
MS_Num = MS_Num + 1
Range("D3") = MS_Num
screen_oui ' rétablissement de l'affichage

Exit Sub

' Fin du jeu
fin:
screen_non ' masquage de l'affichage

' Fermeture du temp
ACTIV_C1
FERMER ' save and close

' Affichage d'une page d'attente
Sheets("ATT").Select
screen_oui ' rétablissement de l'affichage
Application.Wait Now + TimeValue("00:00:02")

' Retour à la page Menu
Sheets("menu").Select

End Sub


Encore merci pour le temps que vous avez consacré à ce sujet et bon clavardage !

Cdt,
Jimmy
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
J'avoues une fois de plus ne pas tout saisir.
Si tu veux que l'on continues, le fichier ne serait pas de trop...
Pour joindre un fichier, utilisez cjoint.com et revenez coller le lien créé dans une réponse ici même...
0
Jimmy59116 Messages postés 45 Date d'inscription   Statut Membre Dernière intervention   1
 
Oui, forcément, sans les déclarations de variables et l'usage que j'en fais, ce n'est pas clair. Je viens de relire le code, si on a pas le contexte, c'est incompréhensible !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jimmy59116 Messages postés 45 Date d'inscription   Statut Membre Dernière intervention   1
 
Re-bonjour,

Voici le lien : https://www.cjoint.com/?0AEp5S9s0cn

L'appli (qui se résume à 3 boutons pour le moment) est en feuille "QCM_MS".
Pour retrouver un affichage normal, utiliser la macro "DEV" (affichage des onglets, de la barre de formule...)

Bouton 1 : MS_AFF => initialisation du jeu (Affichage du numéro de question = N°1)
Bouton 2 : MS_B3 => Vous répondez "3" au CQM (c'est la bonne réponse, mais il ne faut pas le dire aux candidatns :))
Bouton 3 : MS_REP => Envoyer la réponse dans le temporaire.

Le fichier temporaire n'est pas en lien sur cijoint.com, mail il suffit d'utiliser une feuille vierge excel nommée C1_temp.xlsx

Attention, le code demande l'ouverture du fichier temp lorsque l'on clique sur "MS_AFF", il faut donc avoir créé le fichier et vérifier son adresse pour pouvoir exécuter.

Je n'en suis qu'à la carcasse du jeu, une fois celle-ci posée, je ferais la mise en forme. Pour le moment, je cherche à ce que le principe fonctionne avant d'aller plus loin.

L'exploitation des résultats compilés dans le temp est réalisée par un autre développeur, ce n'est qu'un fichier de "transit" des données.

Vous souhaitant une bonne journée.

Cdt,
Jimmy
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 761
 
Je ne penses pas pouvoir t'aider davantage...
Désolé.
Si ta solution fonctionne alors... utilises là.
A+
0
Jimmy59116 Messages postés 45 Date d'inscription   Statut Membre Dernière intervention   1
 
Je me doutais un peu... Mais au moins, en posant cette question je résous sans doute un problème pour l'avenir, puisque je dispose d'une arme nouvelle : les tableaux.
Merci pour ta patience te bonne journée.
Cdt,
Jimmy
0